- FaceBook에서 만들어진 테스팅 프레임워크 입니다.
- Test Case를 바탕으로 어플리케이션 코드가 잘 작동하는지 점검합니다.
- 보통 단위 테스트에 자주 사용됩니다.
Jest 시작하기
- Test Script
npm test
를 진행하면 알아서 Test 파일을 찾아 테스트를 진행합니다.
--detectOpenHandles
: 열려있는 리소스 자동 닫기
--forceExit
: 테스트가 끝나면 강제 종료
"scripts": {
"test": "jest --detectOpenHandles --forceExit "
},
- Jest가 Test 파일을 찾는 방법
{filename}.test.ts
{filename}.spec.ts
tests
폴더 내부
Jest 파일 생성하기
- test 파일 내부에는 무조건 1개 이상의 테스트 케이스가 존재해야 합니다.
🗃 Project Folder
├── 📁test
├── 📁intergration
├── products.int.test.ts
├── 📁unit
├── products.test.ts
Jest 파일 구조
- describe: 여러 관련 테스트를 그룹화하는 블록
- it / test: 개별 테스트를 수행하는 곳 / 각 테스트를 문장처럼 설명
- expect
- 값을 테스트할 때마다 사용
- 혼자서 거의 사용되지 않고 matcher와 함께 사용
- matcher
test('two plus tow is four', () => {
expect(2 + 2).toBe(4);
})
Jest 기본 실습
ToBe()
- 원시적인 타입들을 비교( number, boolean, string null... )
- 객체를 비교할 때에는
toEqual()
를 사용
describe("Calculation", () => {
test("two plus tow is four", () => {
expect(2 + 2).toBe(4);
});
test("two plus tow is not five", () => {
expect(2 + 2).not.toBe(5);
});
});
또다른 Jest 기본 함수
// null 검사
test("null Check", () => {
expect(null).toBeNull();
});
// true 검사
test("toBeTruthy", () => {
expect(true).toBeTruthy();
});
// false 검사
test("toBeFalsy", () => {
expect(0).toBeFalsy();
});
숫자 비교
test("number > 3 검사", () => {
const number = "1234";
expect(number.length).toBeGreaterThan(3);
});
test("number < 5 검사", () => {
const number = "1234";
expect(number.length).toBeLessThan(5);
});
jest.fn()
- 단위 테스트를 진행할 때 의존적인 부분을 제외하기 위해 사용하는 함수
- Mock 함수를 생성하는 함수
- 즉 Mock 함수를 통해 해당 테스트를 진행하는 코드가 의존하는 부분을 가짜로 대체
- 의존적인 부분의 상태에 따라서 테스트의 결과값들이 영향을 받을 수 있기 때문에 사용
- 예시 ( 테스트 진행시 직접적인 DB 활용 )
- 테스트 종료 후 데이터베이스에서 변경 데이터를 직접 원복하거나 트랜잭선 rollback이 필요
- 그리고 단순한 테스트 진행에 많은 리소스가 사용
- 또한 테스트 도중 데이터베이스가 죽어있으면 테스트에 영향을 미침
jest.fn()
를 사용해서 가짜 함수를 생성 한 후 의존적인 부분의 영향을 해결할 수 있습니다.
- 이 함수에 어떤 이들일 발생했고 다른 코드들에 의해서 어떻게 호출되었는지 기억할 수 있습니다.
- 또한 이 함수가 내부적으로 어떻게 사용되는지 검증도 가능합니다.
const mockFunction = jest.fn();
mockFunction();
mockFunction('hello');
mockFunction.mockReturnValue('가짜 함수 반환값');
console.log(mockFunction);
expect(mockFunction).toBeCalledWith('hello');
expect(mockFunction).toBeCalledTimes(2);
jest.mock()
은 좀더 강력한 모킹 함수 입니다.
import { userService } from "./service";
jest.mock("./service");
몽구스와 Jest 활용
- Jest는 기본 Test 환경은 jsdom 입니다.
- 몽구스는 jsdom을 지원하지 않기 때문에 Jest의 기본 Test 환경을 node로 변경하는 것이 좋습니다.
- Jest <= 26 Version 변경 필요
- Jest >= 27 Version은 기본으로 node 환경 셋팅 ( 변경 불필요 )
- 공식문서 자료
jest.config.js
파일 생성
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
testMatch: ["**/test/**/*.ts"],
};
참고
- 따라하며 배우는 TDD 개발 ( John Ahn )