[NestJS] Jest를 활용한 단위 테스트 기초 및 실전 예제 따라하기

bshunter·2023년 8월 4일
0

NestJS에서 Jest를 사용한 단위 테스트 개념을 이해하고, 간단한 예제를 통해 이를 실습해보는 시간을 갖도록 합시다.
다양한 테스트가 있지만 여기서는 단위 테스트에 중점을 두어 설명하겠습니다.

단위 테스트의 개념

단위 테스트란 개별적인 코드 조각들이 예상한 동작을 제대로 수행하는지 확인하는 테스트 방법입니다.
NestJS에서 단위 테스트는 특히 컴포넌트, 서비스, 컨트롤러 등의 작은 단위를 대상으로합니다.

Jest를 이용한 테스트 작성 및 실행 방안

NestJS에서 단위 테스트를 작성하고 실행하기 위해 Jest 라이브러리를 활용합니다.
Jest는 자바스크립트 및 타입스크립트에서 널리 사용되는 테스트 러너로,
사용하기 쉬운 API와 빠른 테스트 실행 시간, 순간 테스트 결과 보고 등 다양한 기능을 제공합니다.
새로운 NestJS 프로젝트를 생성하면 기본적으로 Jest 설정이 포함되어 있습니다.

Jest 기본 문법 소개

  1. describe() 함수
    describe() 함수는 관련된 테스트 케이스들을 그룹화하는데 사용합니다.
    첫 번째 인자로는 설명 문자열(테스트 그룹의 명칭을 나타냄)을 받고,
    두 번째 인자로는 해당 그룹안에서 실행해야할 테스트 케이스들을 정의한 함수를 받습니다.
describe('MyComponent', () => {
  // ... 여기에 MyComponent 관련 테스트 케이스를 작성 ...
});
  1. it() 함수와 test() 함수
    it() 또는 test() 함수는 실제 테스트 케이스를 정의하는데 사용합니다.
    test()it()는 동일한 기능을 수행하며, 주로 스타일 차이로 사용됩니다.
    두 함수 모두 첫 번째 인자로는 해당 테스트 케이스에 대한 설명 문자열을 받고,
    두 번째 인자로는 테스트를 실행할 함수를 받습니다.
it('should call the service method once', () => {
  // ... 여기에 해당 테스트 케이스를 검증하는 로직 작성 ...
});
또는
typescript
test('should call the service method once', () => {
  // ... 여기에 해당 테스트 케이스를 검증하는 로직 작성 ...
});
  1. beforeEach() 함수 및 afterEach() 함수

beforeEach(): 각 테스트 케이스가 실행되기 전 실행되는 함수를 정의합니다.
주로 테스트 케이스의 초기화 작업에 사용됩니다.

afterEach(): 각 테스트 케이스가 종료된 후 실행되는 함수를 정의합니다.
주로 테스트 후 정리 작업에 사용됩니다.

beforeEach(() => {
  // ... 테스트 케이스 실행 전에 초기화 작업을 수행 ...
});

afterEach(() => {
  // ... 테스트 케이스 실행 후 정리 작업을 수행 ...
});
  1. expect() 함수 및 toBe() 함수 등

expect(): 테스트 대상 값을 전달하며,
이 함수에 의해 반환된 객체는 테스트 결과를 평가하는데 사용되는 일련의 '매처(matcher)' 함수를 포함합니다.

toBe(): 객체의 동일성(===)을 검사하는 매처 함수입니다.
toEqual()과 비교하여 toBe()는 값과 형식까지 정확하게 일치해야 통과합니다.

const sum = 1 + 2;
expect(sum).toBe(3); // 성공
expect(sum).toEqual(3); // 성공
expect(sum).toBe('3'); // 실패

이 외에도 여러 매처 함수들이 제공됩니다. 예를 들어, toHaveLength(), toContain(), toBeTruthy(), toBeFalsy(), toBeGreaterThan() 등이 있습니다.

NestJS에서의 활용 예제

Cat 모델에 대한 검증 로직을 갖는 ValidateCatService 메서드를 단위 테스트하는 예제 코드입니다:

describe('ValidateCatService', () => {
  let service: ValidateCatService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [ValidateCatService],
    }).compile();

    service = module.get<ValidateCatService>(ValidateCatService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  it('should return true for valid cat name', () => {
    const cat: Cat = { id: 1, name: 'Tiger', age: 2 };
    expect(service.isValidName(cat)).toBe(true);
  });

  it('should return false for invalid cat name', () => {
    const cat: Cat =


{ id: 2, name: 'T', age: 3 };
expect(service.isValidName(cat)).toBe(false);
});
});

위 예제에서 사용된 문법은 다음과 같습니다:

  • describe: ValidateCatService에 대한 테스트 케이스 그룹을 생성합니다.
  • beforeEach: 테스트 케이스를 실행할 준비 작업을 정의합니다. 여기서는 NestJS의 테스트 모듈을 사용하여 ValidateCatService 인스턴스를 가져옵니다.
  • it: 각각의 테스트 케이스를 수행할 함수를 정의합니다. 테스트 케이스는 ValidateCatService의 메소드 동작을 검증합니다.
  • expect: 결과 값을 검증하는데 사용되는 함수입니다.
  • toBe: 값과 형식이 일치하는지 확인하는 매처 함수입니다.

이제 이 예제를 실제 프로젝트에서 실행해 볼 수 있습니다. 테스트를 실행하기 위해 프로젝트 루트 경로에서 npm test 또는 npm run test 명령을 실행합니다. 테스트가 성공적으로 수행되면 결과를 확인할 수 있습니다.

이처럼 Jest 단위 테스트 문법을 이해하고 NestJS에서 활용하면, 더 깊이 있는 테스트를 작성하여 프로젝트의 품질을 향상시킬 수 있습니다. Jest의 문법은 다양하며 이 글에서 설명한 것 외에도 많은 기능들이 있습니다. 추가적인 사용법을 알고 싶다면 Jest 공식 문서(https://jestjs.io/docs/getting-started)를 참조하시길 바랍니다.

0개의 댓글