Testing

Testing - 테스트 코드의 목적과 규칙, Jest 기본 문법

Creative_Lee 2022. 11. 3. 23:42

여러분들은 테스트 코드의 중요성을 알고 계신가요?

 

많은 개발자들이 자신이 작성한 코드를 테스트하기 위해, 또는

더 좋은 코드를 작성하기 위해 테스트 코드를 작성합니다.

코드를 위해 또 코드를 작성한다니 의아하지 않나요?

 

오늘은 테스트 코드를 작성하는 이유와

많은 개발자들이 사용하고 있는 Jest 테스팅 라이브러리에 대해 알아보겠습니다.


1. 테스트 코드의 목적 

테스트 코드를 작성하는 목적이자 장점은 대표적으로 다음과 같습니다.

  • 개발 과정 중 예상하지 못했던 문제를 미리 발견할 수 있다.
  • 작성한 코드가 의도대로 동작하는지 검증할 수 있다.
  • 코드 리팩터링 후 기존 소스와 동일한 동작을 하는지 검증할 수 있다.

장점만 있지 않겠죠?

흔히 테스트 코드의 단점으로 다음을 말합니다.

  • 테스트 코드까지 작성해야 하므로 개발 시간이 오래 걸리게 된다.
  • 어플리케이션에 변경이 발생하면 테스트 코드도 변경해야 한다.

하지만 버그를 발견하고 수정하는 과정이 많아질수록 오히려 개발 시간을 줄일 수 있다거나,

자유로운 수정과 삭제가 가능하므로 오히려 대처에 유연하다고 말하기도 합니다.

 

테스트 코드의 단점에 대해서는 관점을 달리하는 개발자도 많이 있는 것 같습니다.


2. 테스트 코드 작성 규칙 

좋은 테스트를 위한 테스트 코드 작성 규칙은 다음과 같습니다.

  • 독립적이어야 한다. 어떤 테스트도 다른 테스트에 의존하지 않아야 한다.
  • 격리되어야 한다. Ajax, LocalStorage, UI Event 등 테스트 대상이 의존하는 것을 다른 것으로 대체한다.
  • given, when, then 단계에 따라 테스트 코드를 작성한다.

 

1번 규칙은 말 그대로 어떤 테스트가 다른 테스트 결과에 의존하거나 영향을 주면 안된다는 말입니다.

 

2번 규칙의 의존 대상을 다른 것으로 대체하는 것을 테스트 더블(Dummy, Stub, Fake, Spy, Mock)이라고 합니다.

 

3번 규칙의 예시를 들면 다음과 같습니다.

주어진 상황에(given)  => 어떤 것을 요청, 이동, 생성, 작동하면(when) =>  ~~ 한다. (then)
 ( , ) 콤마 구분자 없이  =>  split 메서드를 사용하면  =>  그대로 반환한다. 


3. Jest 라이브러리 맛보기 

지금까지 Jest를 설명하기 위한 빌드업이었습니다.

이제 기본적인 테스트 코드를 작성하며 Jest를 배워봅시다.

 

Jest는 Test Runner와 Test Matcher Test Mock 을 한 번에 제공해 주고, 별도의 설정이 필요 없어 각광받고 있습니다.

간단하게 Runner는 테스트 환경, Matcher는 비교 메서드, Mock은 테스트가 어려운 부분을 대체하는 도구입니다.

자세한 설명은 다음 포스트에서 알아보도록 하고,

 

오늘은 테스트의 형태를 만드는 기본 문법만 알아보겠습니다.


3-1. test 파일 생성

Jest는 기본적으로 test.js로 끝나거나,  

__test__ 디렉터리 안에 있는 파일들은 모두 테스트 파일로 인식합니다.

취향에 따라 파일명.test.js 을 생성하거나,  __test__ 디렉터리를 만들어 파일명.js 를 생성합시다.


3-2. test 파일 기본 문법

다음은 테스트 파일의 기본 구조와 문법입니다. 

 /* --------- 문법 예제 ---------- */ 
describe("문자열 테스트", () => {
  test("repeat 메서드로 문자열을 여러번 반복", () => {
    const input = "abc";
    const result = input.repeat(3);

    expect(result).toEqual("abcabcabc");
  });
 })
  
 /* --------- 문법 설명 ---------- */ 
 describe("테스트 그룹에 대한 설명", () => {
  test("해당 테스트에 대한 설명", () => { 
    expect( 검증 대상 ).toXxx( 기대 결과 );
  });
 })

 

  • describe: 여러 테스트를 그룹으로 묶어주는 역할입니다.
    내부에 테스트에 쓰일 변수, 객체 등을 선언합니다.

  • test: 개별 테스트를 의미하며 내부에서 검증을 실시합니다.

  • expext ( 검증 대상 ) : 검증하고자 하는 대상입니다.

  • .toXxx( 기대 결과 ) : toXxx 부분을 통해 검증 대상과, 기대 결과를 비교합니다. 

3-3.  toXxx  ( a.k.a  Test Matcher )

위 기본 문법에서 toXxx 부분이 바로 Matcher 메서드입니다.

toBe, toEqual, toContain 등 여러 가지 비교를 위한 다양한 matcher 메서드가 존재합니다.

 

다시 3-2 예제를 봅시다.

const input = "abc";
const result = input.repeat(3);

expect(result).toEqual("abcabcabc");

input 문자열인 "abc"를 3번 반복한 값과

"abcabcabc" 문자열을 대상으로

toEqual 비교를 하고 있습니다. 상당히 직관적이죠? 
문자열은 서로 같기 때문에 test는 통과하게 됩니다.


어느 정도 감이 잡히는 것 같나요?
다음 포스트에서는 Jest의 여러 Matcher 메서드를 알아보겠습니다.

 

 

 

 

기본이 중요하다.

 

'Testing' 카테고리의 다른 글

Jest - Matcher란?  (0) 2022.11.12