반응형

Mocha를 사용하여 테스트 코드를 작성하다 보면, 각 테스트 파일에서 데이터베이스(DB)에 연결하고 연결을 끊어야 하는 상황이 발생한다. 이러한 경우, 테스트 파일의 수보다 많은 DB 접근과 연결 끊기 작업이 발생할 수 있다. 이 문제를 해결하기 위해 Mocha를 사용하여 테스트 코드를 작성할 때 모든 테스트 전에 DB에 단 한 번 연결하고 모든 테스트 후에 단 한 번 연결을 끊는 방법을 소개한다. 이 예시는 mongoose와 mocha를 사용한다.

Version

Node.js: v16.15.1

npm: 9.6.4

mocha: 9.1.2

mongoose: 6.6.2

typescript: 4.9.3

기존 테스트 코드의 구조 및 코드

  • 기존 테스트 폴더의 구조
test/
    test1/
        test파일들...
    test2/
        test파일들...
    test3/
        test파일들...
    test4/
        test파일들...
    test5/
        test파일들...
    test파일들...
    dbConnectionForTest.ts

 

해결

1.  dbConnectionForTest.ts 파일 생성

dbConnectionForTest.ts 파일 생성 test 폴더에 dbConnectionForTest.ts 파일을 생성한다. 이 파일에서 before 함수를 사용하여 테스트를 실행하기 전에 데이터베이스에 연결하고 after 함수를 사용하여 테스트를 실행한 후 데이터베이스 연결을 끊는다. 

import mongoose from 'mongoose';

// 테스트를 실행하기 전 실행될 함수 before
before(async () => {
  //@ts-ignore
  if (!global.mongooseConnection) {
    await mongoose.connect(...옵션들)
    //@ts-ignore
    global.mongooseConnection = mongoose.connection;
  }
});

// 테스트를 실행한 후 실행될 함수 after
after(async () => {
  //@ts-ignore
  if (global.mongooseConnection) {
    //@ts-ignore
    await global.mongooseConnection.close();
    //@ts-ignore
    global.mongooseConnection = null;
  }
});

 

before: global 전역변수에  mongooseConnection이라는 변수를 생성한 후 connection을 할당 한다. (없으면 생성 후 할당)

after: global전역변수의 mongooseConnection의 연결을 끊은 후 mongooseConnection를 null로 할당한다.

만약 //@ts-ignore를 사용하기 싫다면 global.d.ts 파일을 작성해주어야 한다.

 

2. import문으로 해당 파일 불러와서 적용

이 방식을 사용하면 각 파일에서 아래 예시처럼 사용할 수 있어서 단일 파일에 대한 테스트도 가능하다.

// import "dbConnectionForTest.ts 가 생성된 경로"
import "../dbConnectionForTest"

describe('Test', () => {
    
	//... 테스트 코드들
    
});

db접근이 일어나는 모든 테스트 파일에 위 import문을 적용후 저장한다.

 

3.  test 실행 스크립트 수정

기존에 실행하던 test 스크립트를 --file 명령어를 사용해서 수정해준다.

이렇게 하면 테스트 실행 시 데이터베이스에 대한 접근이 단 한 번만 발생하고 모든 테스트가 완료된 후 연결이 끊어진다.

// 기존 테스트 실행 명령어
"test": "mocha --timeout 80000 --require ts-node/register test/**/*.ts",
// 변경된 테스트 실행 명령어
"test": "mocha --timeout 80000 --file test/db-connection.ts --require ts-node/register test/**/*.ts",

이 방법을 사용하면 Mocha를 이용한 테스트 코드 작성 시 데이터베이스 접근을 최소화할 수 있다.

이를 통해 테스트의 성능과 안정성을 높일 수 있다. 이러한 방법을 적용함으로써 각 테스트 파일에서 반복되는 DB 연결 및 연결 해제 작업을 줄이고, 테스트를 더 효율적으로 수행할 수 있게 된다. Mocha와 mongoose를 사용한 테스트 작성 시 이러한 최적화 기법을 활용하여 테스트 코드의 품질을 높이고, 테스트 작성 및 유지 관리에 드는 노력을 줄일 수 있다.

 

반응형
얼은펭귄