[NestJS] Test

Younghwan Cha·2023년 9월 17일
0

Nest.js

목록 보기
23/27
post-thumbnail

정적 테스트

코드를 수행하지 않고 검증하는 방법이다.
동료에게 code review 를 받는 것도 일종의 정적 테스트라고 할 수 있다.

동적 테스트

코드를 직접 실행해보며 검증하는 방법이다.

test case 작성법

TDD

Test-driven development, TDD 는 개발자라면 한번쯤은 들어봤을 법한 말이다. 이는 test code 를 먼저 작성하고, 이를 기반으로 실제 code 를 작성해나가는 방법론이다.

BDD

behavior-driven development, BDD 는 Given / When / Then 스타일로 test 를 진행한다.

  • unit test
  • E2E ( end-to-end ) test
    사용자의 행동을 코드로 작성

Jest 를 이용한 unit test


test code 의 파일명은 .spec.ts 로 끝나야한다.

// package.json
	...
    "testRegex": ".*\\.spec\\.ts$",

Nest CLI 를 사용하면 .spec.ts 파일이 자동으로 생성된다.

// app.controller.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

test code 는 describe() 와 it() 구문으로 구성된다.

테스트 커버리지, 코드 커버리지

테스트 커버리지란 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타내는 정도이다. 수행한 테스트가 얼마나 테스트 대상을 커버했는지를 나타낸다.

코드 커버리지란 테스트에 의해 실행된 소스 코드의 양을 나타낸 것이다. 즉, 테스트로 코드가 얼마나 covered되었는지 나타내는 것이다. 소스 코드를 기반으로 수행하는 화이트 박스 테스트를 통해 측정된다. 퍼센트 (%)단위로 표시되는데, 커버리지가 100%라고 해서 버그없는 소프트웨어를 보장할수는 없다.

💡 화이트 박스 테스트
소프트웨어 내부 소스 코드의 논리적인 모든 경로를 테스트하여 모듈 내부의 작동을 확인하는 것이다. 모듈을 한번 이상 실행하므로써 수행된다.

💡 블랙 박스 테스트
사용자의 입장에서 구현된 기능이 완전하게 동작되는지를 확인하는 테스트이다. 소프트웨어 내부 코드 및 세부 동작을 알 필요없으며 입력 값에 따라 올바른 출력값이 나오는 지 확인하는 테스트 이다.

test suite & test case


test suite 는 테스트들을 의미 있는 단위로 묶은 것으로, 관련된 테스트 케이스들을 그룹화하고 조직화하는 데 사용된다.
test case 는 개별적인 테스트 로직을 포함하고 있다

테스트 스위트 (Test Suite)

그룹화: 테스트 스위트는 관련된 테스트 케이스들을 그룹화하는 데 사용됩니다. 이렇게 하면 코드가 조직적이고 관리하기 쉬워집니다.

공통 설정/해제: 테스트 스위트는 특정 그룹의 테스트 케이스에 대한 공통 설정 및 해제 로직을 제공할 수 있습니다 (beforeAll, afterAll 등의 훅을 사용하여).

스코프: 테스트 스위트는 테스트 케이스의 스코프를 정의합니다. 테스트 스위트 내의 훅은 해당 스위트 내의 테스트 케이스에만 영향을 미칩니다.

describe 함수를 사용하여 테스트 스위트를 정의합니다.

describe('User Service', () => {
  // ... 테스트 케이스들
});

테스트 케이스 (Test Case)

  1. 개별 테스트: 테스트 케이스는 개별 테스트 단위를 나타냅니다. 각 테스트 케이스는 특정 기능이나 조건을 테스트합니다.

  2. 독립성: 테스트 케이스는 가능한 한 독립적이어야 합니다. 즉, 한 테스트 케이스의 결과가 다른 테스트 케이스에 영향을 미치지 않아야 합니다.

  3. 설정/해제: 테스트 케이스에는 개별 설정 및 해제 로직이 포함될 수 있습니다 (beforeEach, afterEach 등의 훅을 사용하여).

test 또는 it 함수를 사용하여 테스트 케이스를 정의합니다.

test('should return user by ID', () => {
  // ... 테스트 로직
});

Jest


Jest 에서는 다음 4가지 구문을 제공한다

  • beforeAll()
  • beforeEach()
  • afterAll()
  • afterEach()

beforeAll()

test suite 내의 모든 test case 수행 전 한번만 실행한다
주로 테스트 스위트 전체에 대한 전역 설정을 수행하는 데 사용된다. 예를 들어, 데이터베이스 연결을 설정하거나 테스트 데이터를 준비하는 작업을 수행할 수 있다.

beforeEach()

각 test case 전에 실행된다. 즉, 테스트 스위트에 5개의 테스트 케이스가 있다면 beforeEach() 훅은 5번 실행되게 된다.
beforeEach() 훅은 주로 테스트 케이스 사이에 공유 상태를 초기화하는 데 사용되는데, 이를 통해서 각 테스트가 독립적으로 실행될 수 있다.

afterAll()

모든 test case 가 수행된 후에 수행된다.

profile
개발 기록

0개의 댓글