Mocha 타임아웃

Mocha 타임아웃 (Timeouts) — 테스트가 너무 오래 걸릴 때

비동기 테스트는 예상보다 오래 걸리거나, 콜백이 영영 호출되지 않아 멈춰 버릴 위험이 있어요. Mocha는 이런 상황을 대비해 각 테스트에 타임아웃을 걸어 두고, 제한 시간을 넘기면 그 테스트를 실패로 처리해요. 어디에 적용하느냐에 따라 스위트 단위, 테스트 단위, 훅 단위 세 가지로 나눌 수 있습니다.

출처: Mocha — 타임아웃 (Timeouts)

스위트 단위 타임아웃

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()을 호출하지 않으면, 테스트가 에러 없이 조용히 끝나 버릴 수 있어요. 실패 신호도 없이 통과처럼 보일 수 있으니 주의해야 합니다.

더 알아보기 (Learn more)