개발
home
🥊

Node Typescript 프로젝트에 Jest 적용하기

Created
2022/10/31
Tags
Jest
Typescript
TestCode
2022-10-31 @이영훈
Node Typescript 프로젝트에서 테스트 코드 작성을 위해 Jest를 적용한 것을 기록으로 남깁니다.
Jest와 Mocha를 비교한 많은 글들(대표글)과 npm trends를 비교했을 때 저는 Jest를 도입했습니다.
Jest를 사용하는 것이 설정이 편리하고 (mocha는 mocking을 위해서 sinon을 따로 사용해야 합니다) 테스트 코드 작성에만 집중할 수 있었습니다. 그리고 npm trend를 비교해보았을 때도 Jest의 사용량이 점점 더 증가하는 추세이기 때문에 Jest를 선택하였습니다.

Jest 설치하기

패키지 매니저로 jest를 설치합니다. 테스트이므로 개발 환경으로 설치합니다 (--dev)
yarn add --dev jest # npm에서는 npm install --save-dev jest
Bash
복사

Babel 설치하기

Jest는 Babel을 통해서 Typescript를 지원하기 때문에 Babel을 설치해야 합니다.
Babel과 babel-jest, babel typescript 등을 설치합니다.
yarn add --dev babel-jest @babel/core @babel/preset-env @babel/preset-typescript # npm에서는 npm install --save-dev babel-jest @babel/core @babel/preset-env @babel/preset-typescript
Bash
복사
프로젝트의 루트 경로에 babel.config.js 파일을 만들고 다음과 같이 설정합니다.
# babel.config.js module.exports = { presets: [ ['@babel/preset-env', {targets: {node: 'current'}}], '@babel/preset-typescript', ], };
Bash
복사
Babel을 Typescript와 함께 사용하는 경우 놓치는 부분이 있습니다. Babel은 Typescript를 Javascript로 트랜스파일링만 시켜주는 것이기 때문에 Jest는 타입 체킹을 하지 못합니다.
타입 체킹을 하고 싶은 경우, ts-jest를 사용하거나 TypeScript Compiler (TSC)를 분리해서 실행해야 합니다.

 순수 Jest로 타입 체킹하기

Jest global API를 사용해서 2가지 방법으로 타입 체킹을 할 수 있습니다.
1.
@jest/globals 을 import하는 방식
import {describe, expect, test} from '@jest/globals'; // ⭐️ 이 부분을 import해서 타입 체킹을 합니다 import {sum} from './sum'; describe('sum module', () => { test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); }); });
TypeScript
복사
2.
@types/jest 패키지를 설치하는 방식 (제가 사용한 방식)
@types/jest 를 사용하면 @jest/globals 을 import 하지 않아도 됩니다.
다음과 같이 작성하여도 타입 체킹이 됩니다.
import {sum} from './sum'; describe('sum module', () => { test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); }); });
Bash
복사
다음과 같이 설치합니다.
yarn add --dev @types/jest ### npm에서는 npm install --save-dev @types/jest
Bash
복사
저는 ts-jest는 사용하지 않았고, @types/jest 패키지를 설치하여 타입 체킹을 하였습니다.

ts-jest 사용하기

ts-jest는 Jest를 위한 소스 맵을 지원하는 TypeScript 전처리기 입니다. Jest를 사용하여 TypeScript로 작성된 프로젝트를 테스트할 수 있습니다.
다음과 같이 설치합니다.
yarn add --dev ts-jest @types/jest ### npm npm install --save-dev ts-jest @types/jest
Bash
복사
설정은 공식문서를 참고하면 됩니다.

Jest를 사용하여 테스트 해보기

1.
package.json의 scripts 부분에 test를 추가합니다.
jest 명령어로 바로 테스트를 실행도 가능하지만 보통은 script를 통해서 실행을 시킵니다. 추가적인 옵션 설정을 하는 경우 등 협업에서 동일한 테스트를 가져가기 위한 편의성 때문입니다.
// package.json "scripts": { "test": "jest", }
JSON
복사
2.
jest.config.js 설정하기
저는 다음과 같이 설정하였습니다. 필요에 따라서 설정하시면 됩니다.
testMatch 옵션에 따라서 파일명에 .test. 가 포함된 파일이 테스트되고, __tests__ 폴더 하위에 있는 파일이 테스트 됩니다. 그리고 tests/unit 파일의 .spec. 이 포함된 파일도 테스트 됩니다.
// jest.config.js /* * For a detailed explanation regarding each configuration property, visit: * https://jestjs.io/docs/configuration */ module.exports = { // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, // Indicates whether the coverage information should be collected while executing the test collectCoverage: false, // The directory where Jest should output its coverage files coverageDirectory: 'coverage', // Indicates which provider should be used to instrument code for coverage coverageProvider: 'v8', // An array of file extensions your modules use moduleFileExtensions: ['js', 'mjs', 'cjs', 'jsx', 'ts', 'tsx', 'json', 'node'], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module moduleNameMapper: { '^@/(.*)$': '<rootDir>/$1', }, // The test environment that will be used for testing testEnvironment: 'jest-environment-node', // The glob patterns Jest uses to detect test files testMatch: [ '<rootDir>/**/*.test.(js|jsx|ts|tsx)', '<rootDir>/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))', ], // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation transformIgnorePatterns: ['<rootDir>/node_modules/'], };
JavaScript
복사
3.
테스트 파일 작성하기
다음과 같이 샘플 테스트 파일을 작성하였습니다. .test. 가 포함되도록 파일을 생성하였습니다.
// tests/sum.test.ts import {sum} from './sum'; describe('sum module', () => { test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); }); });
JavaScript
복사
4.
테스트 실행하기
yarn test ### npm npm run test
Bash
복사

Reference