이번에 jest로 e2e testing을 해봤다.
이에 대한 기록이다.
e2e testing
저번 기록에서 unit testing과 e2e testing에 대한 간단한 설명을 하고, unit testing을 직접 해봤다.
e2e testing은 test 하고자 하는 모듈 관련 모든 부분을 test 한다.
관련 모듈이 많아 unit testing을 할 때 번거로움이 있을 수 있는 모듈은 e2e testing이 더 편할 수 있다.
e2e testing을 해보기 전,
app.e2e-spec.ts 파일을 보자.
//app.e2e-spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';
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!');
});
});
unit testing을 할 때 사용했던 spec.ts 파일과 유사한 모습을 보인다.
it() 메서드를 보면 알 수 있지만 unit testing처럼 각각의 메서드에 대한 test를 하는 것이 아닌,
기본적으로 request를 보내는 test이고, request에 대해 결과값을 받아 test하고 있다.
환경설정
request를 보내기 때문에
test를 할 때마다 app을 만든다.
여기서 app은 실제 브라우저 환경에서 만들어지는 app과는 다르다.
오직 test를 위한 app을 만드는 것을 위의 코드를 통해 알 수 있다.
위와 같은 이유로 main.ts에서 생성한 app에 대한 환경 설정을 test app에도 똑같이 적용해줘야 한다.
beforeAll()
위에서 언급한 대로 test 할 때마다 새로운 app을 만들기 때문에 가짜 DB로 만든 todos app은 매번 초기화될 것이다.
이를 방지하기 위해 위의 코드의 beforeEach() 메서드를 beforeAll()로 바꿔주자.
Test
test 하는 부분을 보자.
it('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(200)
.expect('Hello World!');
});
- request(app.getHttpServer()) : testing app에서 HttpServer를 리턴해서 app에 대한 요청을 보낼 수 있게 함
- get('/') : 메서드와 url 지정
- expect(200) : 지정한 메서드와 url에 대한 기대 status code
- expect('Hello World!') : 위의 메서드에서의 반환 값
create를 이용해 todos를 생성하고,
id를 조회하는 test코드를 짜 보자.
POST
id를 통해 todo를 조회하려면 먼저 todo를 추가해줘야 한다.
it('/todos (POST)', () => {
return request(app.getHttpServer())
.post('/todos')
.send({ action: 'test' })
.expect(201);
});
위와 다른 점이라면 send 메서드를 사용한 것이다.
todo를 생성하려면 data를 보내줘야 하기 때문에 send 메서드를 통해 data를 전달하고,
expect 메서드로 status code를 확인한다.
POST 요청이 정상적으로 test 된 것을 볼 수 있다.
GET
위에서 추가한 todo를 id를 통해 조회하는 것을 test 해보자.
it('/todos/1 (GET)', () => {
return request(app.getHttpServer()).get('/todos/1').expect(200);
});
위와 다른 점은 없고, get 메서드에 id를 포함한 URI를 전달했다.
정상적으로 test 된 것을 볼 수 있다.
마치며
Nomad Coder의 NestJS 강의를 들으며 배웠던 것들을 모두 정리했다.
사실 간단하게 API를 만들어보는 정도라 Nest에 대한 맛보기라고 생각하고 공부했다.
충분히 NestJS에 흥미를 붙였다고 생각하고, 이제 공식문서와 책을 보면서 제대로 공부해봐야겠다.
잘못된 정보에 대한 피드백은 환영입니다.
감사합니다.
'Backend > NestJS' 카테고리의 다른 글
[NestJS] 데커레이터 Decorator(합성, 클래스, 메서드, 매개변수) (0) | 2022.12.25 |
---|---|
[NestJS] 프레임워크와 라이브러리의 차이, 필수 기능 (0) | 2022.12.20 |
[NestJS Overview] NestJS jest로 테스트하기(1) (unit testing) (0) | 2022.12.07 |
[NestJS Overview] NestJS DTO 생성, 유효성 검사 해보기 (0) | 2022.12.07 |
[NestJS Overview] Service.ts(서비스 파일, 반환 클래스, 예외처리) (0) | 2022.12.07 |