Jest

Facebook에서 개발한 인기 있는 JavaScript 테스팅 프레임워크로, JavaScript 코드의 단위 테스트(Unit Test)를 위해 설계되었다.
주로 React 애플리케이션과 함께 사용되지만, Vue, Angular, Node.js 등 다양한 JavaScript 프로젝트에서도 널리 사용된다.

주요 특징

  1. 간단한 설정: 추가 설정 없이 바로 사용 가능한 “제로 구성” 철학을 따른다.
  2. 빠른 실행: 병렬 처리를 통해 테스트를 빠르게 실행한다.
  3. 모의(Mock) 기능: 복잡한 의존성을 가진 코드도 쉽게 테스트할 수 있다.
  4. 코드 커버리지: 내장된 코드 커버리지 도구를 제공한다.
  5. 스냅샷 테스팅: UI 컴포넌트의 변경사항을 쉽게 추적할 수 있다.

장점

  1. 통합된 솔루션: 테스트 러너, 단언 라이브러리, 모의 기능을 모두 제공한다.
  2. 쉬운 사용법: 직관적인 API로 테스트 작성이 용이하다.
  3. 풍부한 매처(Matcher) 함수: 다양한 비교 함수를 제공한다.
  4. 활발한 커뮤니티: 지속적인 업데이트와 지원을 받을 수 있다.

단점 및 한계

  1. 브라우저 환경 테스트의 제한: JSDOM을 사용하여 브라우저 환경을 시뮬레이션하지만, 실제 브라우저와는 차이가 있다.
  2. 학습 곡선: 고급 기능을 사용하기 위해서는 추가적인 학습이 필요할 수 있다.
  3. 설정의 복잡성: 대규모 프로젝트에서는 설정이 복잡해질 수 있다.

사용 방법

  1. 설치

    1
    
    npm install --save-dev jest
    
  2. package.json에 테스트 스크립트 설정

    1
    2
    3
    4
    5
    6
    
    {
      "scripts": {
        "test": "jest",
        "test:watch": "jest --watch"
      }
    }
    
  3. 테스트 파일 작성
    *.test.js 또는 *.spec.js 형식으로 파일 생성

  4. 테스트 실행
    npm test

주요 명령어 및 예시

주요 명령어

기본 테스트 작성

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// math.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;

// math.test.js
const sum = require('./math');

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

다양한 매처(Matcher) 사용

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
test('object assignment', () => {
  const data = {one: 1};
  data['two'] = 2;
  
  // 객체 동등성 비교
  expect(data).toEqual({one: 1, two: 2});
  
  // 널/정의 체크
  expect(data).not.toBeNull();
  expect(data).toBeDefined();
});

비동기 테스트

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 프로미스 테스트
test('async test', () => {
  return fetchData().then(data => {
    expect(data).toBe('result');
  });
});

// async/await 사용
test('async/await test', async () => {
  const data = await fetchData();
  expect(data).toBe('result');
});

모킹

1
2
3
4
5
6
7
// 함수 모킹
const mockCallback = jest.fn(x => x + 42);
[0, 1].forEach(mockCallback);

// 모킹된 함수 호출 검증
expect(mockCallback.mock.calls.length).toBe(2);
expect(mockCallback.mock.results[0].value).toBe(42);

고급 기능

테스트 그룹화

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
describe('Calculator', () => {
  beforeEach(() => {
    // 각 테스트 전 초기화 로직
  });

  test('addition', () => {
    // 덧셈 테스트
  });

  test('subtraction', () => {
    // 뺄셈 테스트
  });
});

코드 커버리지

1
npm test -- --coverage

참고 및 출처

Fetching Title#q70s