Skip to content

test(db): 실패한 테스트가 프로세스를 붙잡지 않게 한다 - #6

Merged
mack-erel merged 1 commit into
mainfrom
fix/db-test-pool-leak
Aug 26, 2026
Merged

test(db): 실패한 테스트가 프로세스를 붙잡지 않게 한다#6
mack-erel merged 1 commit into
mainfrom
fix/db-test-pool-leak

Conversation

@mack-erel

Copy link
Copy Markdown
Contributor

무엇이 문제였나

빨간 테스트가 25분 타임아웃으로 둔갑하고 있었다. CI 가 느려진 게 아니라 멈춘 것이다.

mysql·postgres·batch 테스트가 전부 이 모양이었다.

const db = await freshDb();
...
expect(results[0]?.changes).toBe(0);   // ← 여기서 던지면
await db.close();                      // ← 이 줄은 실행되지 않는다

단언이 하나 깨지면 풀이 살아남고, 열린 핸들이 이벤트 루프를 붙잡아 node 가 종료하지 못한다.
--test-timeout=20000 은 이걸 못 잡는다 — 멈추는 곳이 테스트 안이 아니라 모든 테스트가
끝난 뒤 프로세스 종료 시점
이기 때문이다.

실측 (MySQL 8, 로컬)

스위트 프로세스 결과
수정 전 5.6초에 종료 90초 상한에서 SIGKILL 매달림
수정 후 6초 · 종료코드 1 실패 내용 그대로 출력

왜 아무도 몰랐나

CI 는 2026-08-24 부터 이 상태였다(마지막 초록 c07e7ec). 25분을 채우고 죽으니 무엇이
깨졌는지는 로그 끝에서 잘려 보이지도 않았고, 브랜치 보호가 없어 빨간 CI 가 아무것도
막지 않았다.

접근

테스트 본문을 전부 try/finally 로 고치는 대신 여는 자리에서 등록하고 afterEach 에서
닫는다
— 새 테스트가 추가돼도 규율을 다시 지킬 필요가 없다. 정리 중의 예외는 삼킨다:
정리가 실패를 가리면 안 되고, 판정은 테스트가 한다.

pool-error.test.ts 는 처음부터 try/finally 로 이걸 지키고 있었다 — 집안 관례가 이미
있었고 나머지가 안 따랐다. 그래서 그 파일은 건드리지 않았다.

⚠️ 이 PR 만으로는 CI 가 초록이 되지 않는다

insertIgnore: 중복이어도 배치 생존 은 여전히 실패한다. 그건 MySQL 의 changes 계약
문제라 따로 간다. 여기서 바뀌는 것은 그 실패가 25분이 아니라 6초 만에 보인다는 것이다.

🤖 Generated with Claude Code

빨간 테스트가 25분 타임아웃으로 둔갑하고 있었다. 느려진 게 아니라 멈춘 것이다.

mysql·postgres·batch 테스트가 전부 이 모양이었다.

    const db = await freshDb();
    ...
    expect(results[0]?.changes).toBe(0);   // ← 여기서 던지면
    await db.close();                      // ← 이 줄은 실행되지 않는다

단언이 하나 깨지면 풀이 살아남고, 열린 핸들이 이벤트 루프를 붙잡아 node 가 종료하지
못한다. `--test-timeout=20000` 은 이걸 못 잡는다 — 멈추는 곳이 테스트 안이 아니라
**모든 테스트가 끝난 뒤 프로세스 종료 시점**이기 때문이다.

실측(MySQL 8, 로컬):

    수정 전   스위트 5.6초 종료 · 프로세스는 90초 상한에서 SIGKILL
    수정 후   6초 · 종료코드 1 · 실패 내용 그대로 출력

CI 에서는 2026-08-24 부터 이 상태였다(마지막 초록은 c07e7ec). 25분을 채우고 죽으니
무엇이 깨졌는지는 로그 끝에서 잘려 보이지도 않았다. 브랜치 보호가 없어 빨간 CI 가
아무것도 막지 않았으므로 아무도 눈치채지 못했다.

테스트 본문을 전부 try/finally 로 고치는 대신 여는 자리에서 등록하고 `afterEach` 에서
닫는다 — 새 테스트가 추가돼도 규율을 다시 지킬 필요가 없다. 정리 중의 예외는 삼킨다:
정리가 실패를 가리면 안 되고, 판정은 테스트가 한다.

`pool-error.test.ts` 는 처음부터 try/finally 로 이걸 지키고 있었다. 집안 관례가 이미
있었고 나머지가 안 따랐다.

이 PR 은 `insertIgnore` 실패 자체는 고치지 않는다 — 그건 MySQL 의 changes 계약 문제라
따로 간다. 여기서 바뀌는 것은 그 실패가 **25분이 아니라 6초 만에 보인다**는 것이다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mack-erel
mack-erel force-pushed the fix/db-test-pool-leak branch from a737201 to d02a070 Compare August 26, 2026 04:50
@mack-erel
mack-erel merged commit 73540c3 into main Aug 26, 2026
5 checks passed
@mack-erel
mack-erel deleted the fix/db-test-pool-leak branch August 26, 2026 04:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant