테스트코드에 관하여

TDD

TDD는 다음 개발과정을 얘기한다.

  1. 테스트를 작성한다. (테스트 실패)
  2. 코드를 작성한다. (테스트성공)
  3. 리팩토링한다.

리팩토링 과정은 TDD의 핵심이라고 볼 수 있는데, 리팩토링을 통해 테스트코드가 가지는 의존성을 최소화하는데 집중한다.


목표

TDD를 통한 목표는 테스트로 개발을 이끌어가는 것이다. 이를 통해 다음의 이점을 가질 수 있다.

  • 버그에 대한 두려움을 상쇄시킨다.
  • 더 좋은 코드에 대해 생각하게 된다.
  • 동작하는 문서를 만들 수 있다.
  • 개발 방향을 잡아준다.

원칙

엉클밥의 TDD원칙

  • 실패하는 테스트를 작성하기 전에는 절대로 제품 코드를 작성하지 않는다.
  • 실패하는 테스트 코드를 한 번에 하나 이상 작성하지 않는다.
  • 현재 실패하고 있는 테스트를 통과하기에 충분한 정도를 넘어서는 제품 코드를 작성하지 않는다.

로버트 마틴의 TDD원칙

  • 유닛테스트를 통과할 목적이 아니라면 프로덕션 코드를 작성할 수 없다.
  • 유닛테스트가 실패한다면 더 이상 테스트코드를 작성할 수 없다.
  • 실패한 유닛테스트를 통과하게 만든다면, 더 이상 프로덕션 코드를 작성할 수 없다.

FIRST 원칙

  • Fase : 느린것에 대한 의존성 낮추기, Mock이나 stub을 사용하여 파일, 데이터베이스, 네트워크 같은 것들에 대한 의존성을 낮춘다.
  • Isolated : 최소한의 유닛으로 검증하기, 하나의 테스트는 하나의 기능을 집중적으로 테스트
  • Repeatable : 언제는 실패, 언제는 성공하는 테스트가 아닌 항상 동일한 결과를 유지할 수 있는 테스트를 작성한다.
  • Self-Validating : 테스트 코드 내에서 스스로 결과를 검증할 수 있도록 한다.(Jest)
  • Timely : 사용자에게 배포되기 이전에 테스트코드를 작성



Jest

구성

Jest는 자바스크립트의 테스트 프레임워크이다.
NodeJS의 TDD강의를 보면 대부분 jest를 사용하고 있고, nestJS에 내장된 테스트 프레임워크도 jest이다.

npm install --save-dev jest

설치가 끝나면 다음 스크립트를 추가해서 npm run test로 테스트가 동작되도록 한다.

{
  "scripts": {
    "test": "jest"
  }
}

그리고 jest --init으로 jest의 기본 구성파일을 생성한다.


사용

test.js파일을 만들어서 다음 코드를 작성한다.

test('two plus two is four', () => {
  expect(2 + 2).toBe(4);
});

그리고 npm run test를 명령하면 테스트코드가 동작하고 하나의 테스트가 성공했음을 보여준다.

it('객체 필드 값 확인', () => {
  const data = {one: 1};
  data['two'] = 2;
  expect(data).toEqual({one: 1, two: 2});
});

위 코드는 toBe를 사용하지 않는다. object의 경우 toBe를 사용하면 주소를 비교해서 테스트에 실패한다. 이럴 땐 toEqual을 통해 검사하면 재귀적으로 모든 필드를 검사한다.

jest는 이와 같이 다양한 매처가 있으므로 공식문서에서 확인해서 가장 유용한 것을 사용하도록 한다.


좋은 웹페이지 즐겨찾기