Mocha 타임아웃
Mocha 타임아웃 (Timeouts) — 테스트가 너무 오래 걸릴 때
비동기 테스트는 예상보다 오래 걸리거나, 콜백이 영영 호출되지 않아 멈춰 버릴 위험이 있어요. Mocha는 이런 상황을 대비해 각 테스트에 타임아웃을 걸어 두고, 제한 시간을 넘기면 그 테스트를 실패로 처리해요. 어디에 적용하느냐에 따라 스위트 단위, 테스트 단위, 훅 단위 세 가지로 나눌 수 있습니다.
스위트 단위 타임아웃
this.timeout(ms)를 스위트 안에서 호출하면 그 스위트 전체와 중첩된 하위 스위트, 그리고 값을 따로 덮어쓰지 않은 모든 테스트에 타임아웃이 적용돼요. 상속되는 셈이죠. 스위트 단위로 제한을 두면 일괄 적용하기 편리해요.
describe("a suite of tests", function () {
this.timeout(500);
it("should take less than 500ms", function (done) {
setTimeout(done, 300);
});
it("should take less than 500ms as well", function (done) {
setTimeout(done, 250);
});
});
this.timeout(0)을 쓰면 해당 스위트의 타임아웃을 아예 끌 수 있어요.
테스트 단위 타임아웃
특정 테스트에만 따로 제한을 주고 싶다면, 그 테스트 안에서 this.timeout()을 호출하면 돼요. 테스트별로 실행 시간이 제각각일 때 유용합니다. 개별 테스트에서도 this.timeout(0)으로 타임아웃을 완전히 끌 수 있어요.
it("should take less than 500ms", function (done) {
this.timeout(500);
setTimeout(done, 300);
});
훅 단위 타임아웃
beforeEach() 같은 훅에서도 타임아웃을 적용할 수 있어요. 예를 들어 각 테스트 전에 시간이 오래 걸리는 환경 셋업이 있다면, 그 훅에 넉넉한 제한을 걸어 주는 방식이죠.
describe("a suite of tests", function () {
beforeEach(function (done) {
this.timeout(3000); // A very long environment setup.
setTimeout(done, 2500);
});
});
훅에서도 마찬가지로 this.timeout(0)을 쓰면 그 훅의 타임아웃이 꺼져요.
주의할 점
- v3.0.0 이상에서
this.timeout()에 넘긴 값이 setTimeout의 최대 지연 값보다 크면, 해당 타임아웃은 꺼진 것으로 처리돼요. - v8.0.0 이상에서는
this.enableTimeouts()가 제거됐어요. - 비동기 테스트에서
this.timeout(0)으로 타임아웃을 끈 뒤done()을 호출하지 않으면, 테스트가 에러 없이 조용히 끝나 버릴 수 있어요. 실패 신호도 없이 통과처럼 보일 수 있으니 주의해야 합니다.