Search

11. 통합 테스트

이번 글에서는 NestJS 애플리케이션에서 엔드투엔드(E2E) 테스트를 작성하는 방법을 알아본다.
앞서 단위 테스트에 대해 다뤄봤지만, 엔드투엔드 테스트는 애플리케이션의 서로 다른 부분들이 함께 잘 동작하는지 확인하는 데 중점을 둔다.

1. 엔드투엔드 테스트란?

엔드투엔드 테스트는 애플리케이션의 전반적인 동작을 확인하기 위해, 실제 서버 인스턴스를 생성하여 요청을 보내고 응답을 확인하는 테스트 방식이다. 단위 테스트가 특정 메서드의 동작을 검증하는 것과 달리, E2E 테스트는 애플리케이션의 다양한 컴포넌트가 유기적으로 잘 작동하는지를 확인한다.

E2E 테스트 구조

NestJS 프로젝트를 생성하면 루트 프로젝트 폴더에 자동으로 test 디렉터리가 생성된다.
이 폴더 안에는 기본적인 엔드투엔드 테스트 파일이 하나 들어있다. 파일 구조는 다음과 같다.
describe 블록: 테스트 모듈을 생성한다.
beforeEach 블록: 각 테스트 전에 실행될 초기화 작업을 수행한다.
테스트 코드: 실제로 서버를 띄우고 요청을 보내 응답을 검증한다.
import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; import { AppModule } from 'src/app.moudle'; describe('AppController (e2e)', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); await app.init(); }); it('/ (GET)', () => { return request(app.getHttpServer()) .get('/') .expect(200) .expect('Hello World!'); }); });
TypeScript
복사
app.e2e-spec.ts
이 구조는 단위 테스트와 유사하지만, E2E 테스트는 애플리케이션 인스턴스를 전체로 띄워서 진행된다는 점이 다르다.

E2E 테스트의 특징

애플리케이션의 전체 인스턴스를 생성하여 테스트한다.
테스트가 실행될 때마다 새로운 서버 인스턴스가 만들어진다.
서버 인스턴스는 컴퓨터의 임의 포트에서 트래픽을 수신하도록 할당된다.
실제 요청을 보내고 응답을 검증하여 각 기능이 올바르게 작동하는지 확인한다.

테스트 실행 방법

엔드투엔드 테스트를 실행하기 위해 다음 명령어를 사용한다.
npm run test:e2e
TypeScript
복사
이 명령어는 test 디렉터리 안의 모든 E2E 테스트를 실행하며, src 폴더 안의 단위 테스트 파일과는 별도로 수행된다.