Jest

@bbearcookie · May 19, 2023 · 7 min read

Jest란?

Jest 는 메타(구 페이스북)가 만들고 유지보수하는 자바스크립트 테스팅 프레임워크이다.

Jest 가 등장하기 이전에는 테스팅을 위해서 Test Runner, Test Matcher, Test Mock 에 적용할 각각의 라이브러리를 선택해서 적용해야 했었는데, 그렇다보니 각각의 라이브러리가 유사하지만 조금씩 다른 API 때문에 여러 프로젝트에서 일하는 자바스크립트 개발자들에게 혼란을 주기도 했었다.

JestAll-in-one 테스팅 프레임워크로써 혼란을 방지하고 손쉽게 사용할 수 있다는 장점이 있다.

  • Test Runner: Mocha, Jasmin 등의 라이브러리가 있었다.
  • Test Matcher: Chail, Expect 등의 라이브러리가 있었다.
  • Test Mock: Sinon, Testdouble 등의 라이브러리가 있었다.

Jest의 장점

Jest 공식 페이지에 따르면 Jest에는 다음과 같은 장점이 존재한다:

  • zero config: 대부분의 자바스크립트 프로젝트에서 특별한 설정이 필요 없이 바로 사용할 수 있다.
  • snapshots: 복잡하고 거대한 객체를 추적하기 쉽게 하는 텍스트를 만들 수 있다.
  • isolated: 성능을 최대화하기 위해서 각각의 테스트는 자체 프로세스에서 병렬적으로 실행된다.
  • great api: Jest 는 잘 문서화되고, 잘 관리되고, 좋은 툴킷을 한 곳에 가지고 있다.

Jest 설치

다음은 TypeScript 가 적용된 Node.js 환경에서 Jest 를 설치하는 과정이다.

1. 패키지 설치

npm i -D jest ts-jest @types/jest
  • jest: Jest 프레임워크 패키지이다.
  • ts-jest: TypeScript 로 작성된 테스트 코드를 실행하기 위해 변환해주는 전처리기이다.
  • @types/jest: Jest 에 대한 여러 타입 정의이다.
    @jest/globals 패키지를 설치하는 방법도 있는데, 이 경우에는 describe, test, expect 등의 API를 직접 import 해서 사용해야 한다.

2. package.json 수정

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

test 스크립트로 jest 를 사용하도록 해준다.
이후에 npm test 혹은 npm run test 커맨드로 테스트를 실행할 수 있다.

3. Jest 설정 파일 생성

npx ts-jest config:init

Jest 를 사용하는데 있어서 기본적으로 설정이 필요하지는 않지만, ts 파일을 자동으로 컴파일하지 않기 때문에 .ts 파일로 작성된 테스트 코드 파일에 대해서 ts-jest 가 변환해주도록 지시해야 한다.

그렇기 때문에 jest.config.js 설정 파일에 해당 내용을 적어줘야 하는데, 위 커맨드를 실행하면 자동으로 아래와 같은 파일이 생성된다.

/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
};

Jest 기본 사용법

테스트 실행

기본적으로 Jest 는 파일 이름이 test.jstest.ts 로 끝나는 경우에 테스트 파일이라고 인식하는데 npm test 커맨드를 실행하면 프로젝트 내에 존재하는 모든 테스트 파일을 실행한다.

만약 특정 파일만 실행하고 싶은 경우에는 npm test <파일명 or 경로> 커맨드를 실행하면 된다.

테스트 파일 작성

describe('테스트 영역 설명', () => {
  test('테스트 설명', () => {
    expect(검증 대상).Modifier.Matcher(기대 결과)
  });
})

Jest 의 테스트 코드는 위와 같은 형식으로 작성한다.

  • describe: 특정 테스트를 위해서 test 를 여러 번 호출하는 경우에는 유사한 test 를 같은 영역에 묶을 수 있다.
  • test: 어떤 검증 대상에 대해서 기대 결과가 어떻게 되어야 하는지를 내부에 담고 있는 API이다. it 이라는 별칭으로 사용할 수도 있다.
  • expect: 어떤 값을 검증할 것인지 대상을 적어주는 API이다.
  • Modifier: 이 부분은 선택적으로 작성하는 부분으로, Matcher 의 동작을 수행하기에 앞서 검증 대상에 대해 약간의 전처리를 하는 부분이라고 이해했다.

    • not: 검증 대상에 대해서 기대 결과의 정 반대가 나와야 테스트가 통과한다.
    • resolves: 검증 대상이 Promise인 경우, 해당 Promise가 fulfilled 됐을 때의 결과를 검증 대상으로 사용한다.
    • rejects: 검증 대상이 Promise인 경우, 해당 Promise가 rejected 됐을 때의 결과를 검증 대상으로 사용한다.
  • Matcher: 검증하려는 대상이 어떤 결과가 나와야 하는지를 적어주는 API이다. toBe, toEqual, toBeTruthy 등 많은 Matcher 가 존재하며 API 문서에서 확인할 수 있다.

예시 코드

/* sum.js */
function sum(a, b) { return a + b; }
module.exports = sum;
/* sum.test.js */
const sum = require('./sum');

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

위 테스트 코드는 정의된 sum 함수에 대해서 테스트를 수행하며
sum(1, 2) 의 결과가 3 과 일치한지를 확인한다.

참고 자료

제스트 (프레임워크) - 위키백과
Jest 공식 페이지
Jest 공식 페이지 - Using TypeScript
Jest 공식 페이지 - Jest Config File
Jest 소개 (Inpa)
Jest Basic (DaleSeo)

@bbearcookie
Frontend Developer