2. Jest

우동이·2022년 1월 9일
0

NodeServer Test

목록 보기
3/6
post-thumbnail
  • FaceBook에서 만들어진 테스팅 프레임워크 입니다.
  • Test Case를 바탕으로 어플리케이션 코드가 잘 작동하는지 점검합니다.
  • 보통 단위 테스트에 자주 사용됩니다.

Jest 시작하기

  • Test Script
    • npm test를 진행하면 알아서 Test 파일을 찾아 테스트를 진행합니다.
    • --detectOpenHandles: 열려있는 리소스 자동 닫기
    • --forceExit: 테스트가 끝나면 강제 종료
"scripts": {
    "test": "jest --detectOpenHandles --forceExit "
 },
  • Jest가 Test 파일을 찾는 방법
    • {filename}.test.ts
      • 알아서 모두 test 관련 파일을 찾습니다.
    • {filename}.spec.ts
    • tests폴더 내부

Jest 파일 생성하기

  • test 파일 내부에는 무조건 1개 이상의 테스트 케이스가 존재해야 합니다.
    • 없으면 1 failed 에러 발생
🗃 Project Folder  
├── 📁test
		├── 📁intergration
				├── products.int.test.ts
		├── 📁unit
				├── products.test.ts

Jest 파일 구조

  • describe: 여러 관련 테스트를 그룹화하는 블록
  • it / test: 개별 테스트를 수행하는 곳 / 각 테스트를 문장처럼 설명
    • expect
      • 값을 테스트할 때마다 사용
      • 혼자서 거의 사용되지 않고 matcher와 함께 사용
    • matcher
      • 다른 방법으로 값을 테스트
// expect() => expect
// toBe() => matcher
test('two plus tow is four', () => {
	expect(2 + 2).toBe(4);
})

Jest 기본 실습

  • ToBe()
    • 원시적인 타입들을 비교( number, boolean, string null... )
    • 객체를 비교할 때에는 toEqual()를 사용
      • 재귀적으로 각 요소들을 확인
// Calculation으로 그룹화
describe("Calculation", () => {
  // 2 + 2 = 4 테스트
  test("two plus tow is four", () => {
    expect(2 + 2).toBe(4);
  });
	// 2 + 2 != 5 테스트
  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();
});

숫자 비교

// => 검사는 toBeGreaterThanOrder() 활용
test("number > 3 검사", () => {
  const number = "1234";
  expect(number.length).toBeGreaterThan(3);
});

// <= 검사는 toBeLessThanOrder() 활용
test("number < 5 검사", () => {
  const number = "1234";
  expect(number.length).toBeLessThan(5);
});

jest.fn()

  • 단위 테스트를 진행할 때 의존적인 부분을 제외하기 위해 사용하는 함수
  • Mock 함수를 생성하는 함수
    • 즉 Mock 함수를 통해 해당 테스트를 진행하는 코드가 의존하는 부분을 가짜로 대체
    • 의존적인 부분의 상태에 따라서 테스트의 결과값들이 영향을 받을 수 있기 때문에 사용
    • 예시 ( 테스트 진행시 직접적인 DB 활용 )
      • 테스트 종료 후 데이터베이스에서 변경 데이터를 직접 원복하거나 트랜잭선 rollback이 필요
      • 그리고 단순한 테스트 진행에 많은 리소스가 사용
      • 또한 테스트 도중 데이터베이스가 죽어있으면 테스트에 영향을 미침
  • jest.fn()를 사용해서 가짜 함수를 생성 한 후 의존적인 부분의 영향을 해결할 수 있습니다.
    • 이 함수에 어떤 이들일 발생했고 다른 코드들에 의해서 어떻게 호출되었는지 기억할 수 있습니다.
    • 또한 이 함수가 내부적으로 어떻게 사용되는지 검증도 가능합니다.
// mock 함수 생성
const mockFunction = jest.fn();

// 가짜 함수 호출 or 인자 전달도 가능
mockFunction();
mockFunction('hello');

// 가짜 함수가 어떠한 결과값을 Retrun할지 직접 알려줄 수 있다.
mockFunction.mockReturnValue('가짜 함수 반환값');

// '가짜 함수 반환값' 출력
console.log(mockFunction);

// 어떤 인자가 넘어 왔는지 검증 
expect(mockFunction).toBeCalledWith('hello');
// 가짜 함수가 몇번 호출됬는지 검증
expect(mockFunction).toBeCalledTimes(2);
  • jest.mock()은 좀더 강력한 모킹 함수 입니다.
    • 자동으로 import한 모듈을 모킹
import { userService } from "./service";

// userService모듈 전체를 모킹
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", // ts-jest 사용
  testEnvironment: "node", // 테스트 환경을 Node로 설정
  testMatch: ["**/test/**/*.ts"], // Test 적용할 파일 경로 설정
};

참고

  • 따라하며 배우는 TDD 개발 ( John Ahn )
profile
아직 나는 취해있을 수 없다...

0개의 댓글