본문 바로가기
test

[TIL] Jest에서 async 요청 test 병렬적으로 해보기

by marble25 2023. 11. 24.

AWS 상에서 자동화된 integration test를 구현할 일이 있었다. 작성 언어는 크게 상관 없었지만, code pipeline에 포함시키기 위해 AWS에 예제가 잘 나와있는 Jest를 선택하기로 했다.

AS-IS

Integration Test는 응답시간이 오래 걸리는 요청 여러 개를 AWS 내의 서비스로 날리는 것이었다. 처음에는 jest의 test.each 함수를 이용해서 여러 테스트케이스를 병렬적으로 구성하도록 작성했다.

test.each(testcases)('request $inputFile to $path', async ({path, inputFile, outputFiles}) => {
})

하지만 테스트 케이스를 추가하고, 응답시간이 오래 걸리는 케이스도 추가해 보니, Jest 부모 프로세스가 끝나더라도 응답이 오지 않는 경우도 있어서 다음과 같은 에러가 발생했다.

Jest has detected the following 1 open handle potentially keeping Jest from existing:

맨 마지막에 모든 요청이 끝났는지 확인하는 과정이 필요했다.

TO-BE

찾아보니 다음 메소드를 사용할 수 있었다.

afterAll(async () => {
  await new Promise(resolve => setTimeout(() => resolve(), 500)); // avoid jest open handle error  
});

모든 케이스가 끝난 후 명시적으로 기다리는 과정을 await로 걸어두어 async 메소드들을 기다리도록 한다.

하지만, 내가 작업했던 test.each를 이용하니 여전히 동일한 에러가 발생했다. 그래서 메소드를 for문을 사용하도록 변경했다.

for(let testcase of testcases){
  test(`request ${inputFile} to ${path}`, async () => {
	});
}

그러니 테스트가 안정적으로 통과했다. Jest에서 test.each와 async request가 완벽히 잘 호환되지는 않는 것 같다.