Jest 시작해보기

12768 단어 jestjest

이번에 Vanilla JS로 아이폰 계산기를 따라 만들어 보면서 테스트 코드의 필요성을 절실히 느꼈다. 스터디원들과 상의 후에 State of JS 2020을 참고하여 관심도, 사용량, 인지도 면에서 1위인 Jest를 한번 사용해 보기로 했다. 본격적으로 테스트 코드를 작성하기 전에 Jest가 뭔지 공식 문서부터 차근차근 살펴봐야겠다.


Jest?

페이스북에서 개발한 자바스크립트 테스팅 프레임워크
Bebel, TypeScript, Node, React, Angular, Vue 등과 호환된다.

특징

1. Fast and safe

  • 전역 상태를 가지고 테스트를 병렬적으로 수행한다.
  • 이전에 실패한 테스트부터 먼저 수행한다.
  • 테스트 수행 시간에 따라 순서를 재구성한다.

2. Code coverage

테스트 케이스가 얼마나 충족되었는지 나타내는 지표 중 하나

  • --coverage 플래그를 추가하여 간단히 확인할 수 있다.
  • 테스트되지 않은 파일을 포함하여 전체 프로젝트의 코드 커버리지 정보를 수집할 수 있다.

3. Easy mocking

mocking: 테스트를 독립시키기 위해 의존성을 개발자가 컨트롤하고 검사할 수 있는 오브젝트로 변환하는 기술. 일반적으로 import하는 모듈을 의존성이라고 함 (참고)

  • 풍부한 Mock 함수들을 제공한다.

4. Great exceptions

  • 테스트가 실패하는 경우를 감지하기 위한 풍부한 컨텍스트를 제공한다.
    (toBe, toEqual 등)

시작하기

설치 및 설정

  • 설치
yarn add --dev jest
  • package.json에 scripts 추가
"scripts": {
  "test": "jest"
}

테스트 코드 작성

  • [테스트할 파일명].test.js 형식으로 테스트 파일 생성

sum.js

function sum(a, b) {
  return a + b;
}
module.exports = sum;

sum.test.js

const sum = require('./sum');

describe('add test', () => {
  test('adds 1 + 2 to equal 3', () => {
    expect(sum(1, 2)).toBe(3);
  });
  test('adds 2 + 3 to equal 4', () => {
    expect(sum(2, 3)).toBe(4);
  });
});

describe(name, fn)

연관된 테스트 여러 개를 모아서 테스트 그룹을 생성하는 함수

  • 필수는 아니지만 테스트를 깔끔하게 그룹화할 수 있도록 도와준다.
  • describe 내부에 describe를 둬서 계층 관계를 형성할 수도 있다.

test(name, fn, [timeout])

테스트를 수행하는 함수 (필수!)
it()로도 사용 가능

  • 첫 번째 매개변수는 테스트 이름
  • 두 번째 매개변수는 수행되어야 하는 테스트 내용이 담긴 함수
  • 세 번째는 타임아웃 (기본값은 5초)
  • Promise를 리턴한다.

expect(value)

값을 테스트할 때 사용하는 함수

  • 일반적으로 matcher 함수와 함께 사용

테스트 실행

yarn test


자주 사용하는 Matchers

.toBe(value)

정확한 값 비교

.toEqual(value)

객체의 모든 속성을 재귀적으로 비교 (깊은 비교)

.toBeTruthy() / .toBeFalsy()

true / false 검사

  • falsy 값: false, 0, '', null, undefined, NaN

.toHaveLength(number)

객체의 길이 비교

expect([1, 2, 3]).toHaveLength(3);
expect('abc').toHaveLength(3);

.toContain(item)

주어진 요소가 배열에 포함되어 있는지 검사 (=== 비교)

.toMatch(regexp | string)

정규표현식이 주어진 경우 문자열이 정규표현식에 부합하는지 검사
문자열이 주어진 경우 해당 문자열을 포함하는지 비교

describe('an essay on the best flavor', () => {
  test('mentions grapefruit', () => {
    expect('grapefruits').toMatch(/grapefruit/);
    expect('grapefruits').toMatch(new RegExp('grapefruit'));
    expect('grapefruits').toMatch('fruit');
  });
});

.toThrow(error?)

예외가 발생하는지 검사
.toThrowError(error?)와 같다.

test('throws on octopus', () => {
  expect(() => {
    drinkFlavor('octopus');
  }).toThrow();
});
  • 반드시 테스트할 대상을 한 번 더 감싸야 한다. 그렇지 않으면 대상이 실행되는 도중 예외가 발생하여 테스트가 항상 실패하게 된다.
  • 첫 번째 인자로 정규표현식, 문자열, error 객체, error 클래스를 전달하여 특정 예외인지 여부를 검사할 수 있다.

좋은 웹페이지 즐겨찾기