728x90
반응형

유닛 테스트를 좋아하는 사람들이 있는 반면에 e2e 테스트를 좋아하는 사람들도 있다.

e2e테스트는 유닛 테스트할 때처럼 하나하나 테스트하지 않는다.

 

 

먼저 Nest 앱을 만들 때 자동으로 만들어진 이 파일들 부터 보면

 

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!');
  });
});

 

 

여기서 유닛테스트를 할 때와는 다르게 it함수 안 쪽에 '/'에 GET method로 들어오는 요청들에 대해 테스트를 한 다는것을 볼 수 있다. 이는 Controller, Service, Pipe의 결과에 대해 모든 테스트를 하고 있다는 뜻이기도 하다.

 

일단 먼저 e2e테스트를 실행해보자.

$ npm run test:e2e

 

 

 

실패다. 자세히 읽어보면

이 부분에서 우리가 루트 경로에 지정했던 문자열과 테스트할 때의 문자열이 다른것을 확인 할 수 있다.

 

app.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('')
export class AppController {
    @Get()
    home() {
        return 'this is home'
    }
}

 

때문에 "Hello World!" 였던 부분을 "this is home"으로 바꿔서 다시 실행해보자.

 

app.e2e-spec.ts

it('/ (GET)', () => {
    return request(app.getHttpServer())
      .get('/')
      .expect(200)
      .expect('this is home');
  });

 

테스트를 실행해보자.

 

'/' GET 으로 'this is home' 이라는 반환 값을 성공적으로 받았다.

 

이번엔 movies에서 코드를 추가하고 적용해보자

  it('/movies (GET)',() => {
    return request(app.getHttpServer())
      .get('/movies')
      .expect(200)
      .expect([]);
  })

 

테스트를 해보면

 

 

정상적으로 테스트가 진행되었다.

유닛테스트를 할 때 처럼 좀 더 깔끔하게 다듬어서 POST까지 테스트해보자.

 

app.e2e-spec.ts

  describe('/movies', () => {
    it('GET',() => {
      return request(app.getHttpServer())
        .get('/movies')
        .expect(200)
        .expect([]);
    });

    it('POST',() => {
      return request(app.getHttpServer())
        .post('/movies')
        .send({
          title: 'Test Movie',
          genres: ['test'],
          year: 2000
        })
        .expect(201)
    });
  });

 

테스트를 해보면

성공하였다. 이번엔 DELETE까지 추가해보자.

    it('DELETE', () => {
      return  request(app.getHttpServer())
        .delete('/movies')
        .expect(404)
    });

 

 

이렇게 GET, POST, DELETE 메소드 별로 테스트를 해보았다.

728x90
반응형

+ Recent posts