출근 98일차 - 테스트는 어떻게 해야?

·2023년 1월 13일
0

회사이야기

목록 보기
34/50

이틀간의 삽질을 모아놓은 일기장이다.

유닛테스트로는 못믿겠다.

다른곳은 모르겠는데 NestJS의 유닛테스트는 DB는 모킹을 하고 테스트가 진행된다.

그런데 출고과정에서는 DB가 전부고 로직은 무한의 검증만 존재한다.

근데 그 검증하는 과정이 DB에서 나온 정보를 기준으로 검증이 쭈르륵 돌아가게 된다.

이러면 DB를 모킹하면 안될 것 같은데?

그러던 와중에 코드리뷰를 받았을 때

그래, 이젠 E2E밖에 없다..!!

E2E 한번도 안짜봤는데 하하

회사코드에 E2E 테스트가 잔득 있었지만, 나는 짜본 적이 없었다.

더불어서 내가 출고 프로세스를 뒤엎으면서 기존의 출고 E2E 테스트가 망가져있었다(^^...)

그래서 처음 짜봤는데, supertest라는 라이브러리를 통해서 진행을 할 수 있더라

그래서 이렇게 실제로 서버를 실행하고, 애플리케이션의 서버에 직접 통신하는 방식으로 진행을 한다.

 beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();
    app = moduleFixture.createNestApplication();
    app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
    await app.init();

   // 로직 실행 어쩌구~

아무튼 E2E를 짜는데에는 큰 문제가 없었다.
단지 전용 API를 따로 파둬야하는 경우도 필요하긴 했다.

근데.....느리다? 많이? (해결못함)

처음 돌려보니 겁나 느렸다.

미친듯이 느렸다.

왜냐하면 검증을 하기 위해서는 하루에도 테스트를 스무번 서른번씩 돌려봐야하는데

저렇게느리면어떻게돌리라고젠장

그래서 방법을 찾던 와중, sqlite를 이용하여 인메모리에서 빠르게 돌릴 수 있다는 것을 찾았다.

TypeORM에 세팅을 이렇게 해놓고 실행을 하면

            type: 'better-sqlite3',
            database: ':memory:',
            entities: [
              __dirname + './../**/**.entity{.ts,.js}',
              __dirname + './../../../../../libs/platform/**/**.entity{.ts,.js}',
            ],
            dropSchema: true,
            synchronize: true,
            logging: false,
            keepConnectionAlive: true,

이넘을 지원 안한다고 죽어버린다(....)

이넘을 지우는 것은 답이 없기에 찾아보니 simple-enum으로 바꾸면 해결이 된다고 해서 변경했다.

이번에는 JSON을 지원 안한다고 뒈져버림

분명 공식 사이트에서는 지원을 한다고 적혀있었는데

아마 TypeORM 버전이 낮아서 그러지 않나 라고 생각을 하고 있다.
better-sqlite3의 버전이 아주 최신 버전을 받았음에도 저랬던 것을 보아하면 아마도....?

그래서 앞으로는 어떻게 하면 빠르게 할 수 있을까?

느리면 뭐다? 메모리에 던져보고 생각하면 된다. 비쌀 수 있지만 로컬이니까 괜찮아!

테이블을 메모리에 생성해보자!

일단 테이블 자체를 메모리에 선언을 해보려고 했다.

테이블을 생성할 때, InnoDB가 아니라 Memory로 생성을 하면 서버가 내려가면 테이블이 날라가는(!) 형태로 만들 수 있다는 조언을 받았다.

응 안돼

https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html

지원되지 않는 조건이 있어가지고 이렇게 손쉽게 해결하는 것은 실패했다(...)

도커에 띄워볼까?

과거에 향로님이 올려뒀던 내용이 기억나서 들어가봤다. https://jojoldu.tistory.com/689

흠.... pg라서 mysql도 비슷한 방법이 있는 것 같지만, 일단 컨테이너에서 테스트하는 것은 배제하고 싶었다.

단지 접근성이 떨어지는 것 같아서, E2E를 돌리기 위해 도커를 빌드해야하는 것은 아쉬운 것 같더라

추천받은 라이브러리 > https://www.testcontainers.org/

언제나 조언을 주시는 분께서 한개의 라이브러리를 추천해주셨다.

이것을 사용하면 가상의 컨테이너를 띄워서 테스트를 할 수 있고
자바? 스프링? 계열에서는 많이 사용한다길래, 한번쯤은 확인해두면 좋을 것 같다.


E2E 테스트를 짜보게 된 것은 즐거웠지만, 결국 속도 문제를 해결하지 못해서 아쉬웠던 것 같다(ㅠㅠ)

아무튼 전방위적인 리팩토링이 들어가게 되어서 제법 행복해졌다!

profile
물류 서비스 Backend Software Developer

0개의 댓글