Jestのテスト時のタイムアウト時間を変更する3つの方法

Jestにはデフォルトのタイムアウト時間がある

Jestではデフォルトのタイムアウト時間が5000msに設定されているため、処理時間が5000ms以上のテストは「Exceeded timeout of 5000 ms for a test」というエラーが表示されます。

Jestはデフォルトのタイムアウト時間が5000msに設定されているため、5000msを超える処理だと、こちらのエラーが表示されます。

// wait.ts
export function wait(duration: number) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(duration)
    }, duration)
  })
}
// wait.test.ts
import { wait } from './wait'

describe('wait', () => {
  test('wait for seconds', () => {
    return wait(5000).then((duration) => {
      expect(duration).toBe(5000)
    })
  })
})
thrown: "Exceeded timeout of 5000 ms for a test.
    Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

しかし、プログラムの処理内容によっては5秒以上になることがあるため、これでエラーになるのは都合が悪いケースがあります。

その場合は以下の3つのいずれかの方法でタイムアウト時間を変更すれば、問題を解決できます。

1. test関数の引数に設定

Jestのtest関数の第3引数にms秒を指定することで、タイムアウト時間を変更できる。

例えばデフォルトの5000msから10000msに変更したい場合は以下のようになります。

// wait.test.ts
import { wait } from './wait'

describe('wait', () => {
  test('wait for seconds', () => {
    return wait(5000).then((duration) => {
      expect(duration).toBe(5000)
    })
  }, 10000)
})

特定のtestのみタイムアウト時間を変更したい場合は、この方法が適しています。

2. jest.setTimeout()を冒頭に記述する

ファイルの冒頭に jest.setTimeout(10000) をms秒を引数に入れて書いておくと、ファイル内のデフォルトのタイムアウト時間が指定の時間に変更されます。

// wait.test.ts
import { wait } from './wait'

jest.setTimeout(10000)

describe('wait', () => {
  test('wait for seconds', () => {
    return wait(5000).then((duration) => {
      expect(duration).toBe(5000)
    })
  })
})

特定のファイル内のみタイムアウト時間を変更したい場合は、この方法が適しています。

3. jest.config.jsにtestTimeoutを設定

jest.config.js にtestTimeoutを設定するとすべてのJestのタイムアウト時間を設定した秒数に変更できる。

// jest.config.js
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  testTimeout: 10000,
}

すべてのtestの処理でタイムアウト時間を変更したい場合は、この方法が適しています。

タイムアウト時間設定の優先順位

タイムアウト時間設定の適用される優先順位は

  1. test関数の引数に設定
  2. jest.setTimeout()を冒頭に記述する
  3. jest.config.jsにtestTimeoutを設定

になっています。

そのため、jest.config.jsのtestTimeoutを8000にしても、test関数の引数に4000が指定された場合はtest関数で指定した秒数が適用されます。