【Jest】テストのタイムアウト時間を5秒から変更する方法!

この記事では『Jestのタイムアウト時間』について、

  • Jestのタイムアウト時間は5秒なので注意
  • Jestのタイムアウト時間の変更方法
    • test()やit()の第3引数でタイムアウト時間を指定する方法
    • jest.setTimeout()でタイムアウト時間を指定する方法
    • Jestの設定ファイル(jest.config.js)でタイムアウト時間を指定する方法

などをプログラム例を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

Jestのタイムアウト時間は5秒

Jestではデフォルトのタイムアウト時間が5秒です。

The default timeout is 5 seconds

test(name, fn, timeout)

そのため、重い処理を実行するテストなど、5秒以上の時間を要するテストの場合にエラーが発生します。一例として、以下のテストプログラムを見てみましょう。以下のプログラムでは、setTimeout()を用いることでテストに5秒以上の時間を要するようにしています。

// 6秒待機するtimer関数
const timer = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, 6000);
  });

it('テスト', async () => {
  await timer(); // 6秒待機
  expect('hello').toBe('hello');
});

テストを実行してみると、以下に示すように「Exceeded timeout of 5000 ms for a test(テストのタイムアウトが5000ミリ秒を超えた)」というエラーが発生します。

PS C:\Users\user01\Desktop\jestSetTimeOut> npm test

> jestsettimeout@1.0.0 test
> jest

 FAIL  ./sample.spec.js (5.502 s)
  × テスト (5007 ms)

  ● テスト

    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."

       7 |   });
       8 |
    >  9 | it('テスト', async () => {
         | ^
      10 |   await timer(); // 6秒待機
      11 |   expect('hello').toBe('hello');
      12 | });

      at Object.it (sample.spec.js:9:1)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        5.575 s
Ran all test suites.

Jestのタイムアウト時間の変更方法

Jestのタイムアウト時間は5秒から変更させることができます。Jestのタイムアウト時間の変更方法は主に3つあります。

  • test()やit()の第3引数でタイムアウト時間を指定する方法文①
  • jest.setTimeout()でタイムアウト時間を指定する方法
  • Jestの設定ファイル(jest.config.js)でタイムアウト時間を指定する方法文③

test()やit()の第3引数でタイムアウト時間を指定する方法

Jestのテスト関数であるtest()it()を使用する際に、第3引数にタイムアウト時間(ミリ秒単位)を指定することができます。この方法は、各テストでJestのタイムアウト時間を変更する際に有効です。

タイムアウト時間を5秒(5000ms)から10秒(10000ms)にすると、以下のプログラムになります。

// 6秒待機するtimer関数
const timer = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, 6000);
  });

it('テスト', async () => {
  await timer(); // 6秒待機
  expect('hello').toBe('hello');
}, 10000); // 第3引数にタイムアウト時間(ここでは10000ms)を指定

テストを実行結果を以下に示します。テストの実行に6003msを要していますが、タイムアウト時間を10秒に変更したので、タイムアウトにならずテストが実行できるようになります。

PS C:\Users\user01\Desktop\jestSetTimeOut> npm test

> jestsettimeout@1.0.0 test
> jest

 PASS  ./sample.spec.js (6.465 s)
  √ テスト (6003 ms)   

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        6.538 s
Ran all test suites.

jest.setTimeout()でタイムアウト時間を指定する方法

jest.setTimeout()を用いても、全体のJestのタイムアウト時間を変更することができます。この方法は複数のテストで一括してJestのタイムアウト時間を変更する際に有効です。

タイムアウト時間を5秒(5000ms)から10秒(10000ms)にすると、以下のプログラムになります(テストを2回行っています)。

jest.setTimeout(10000); // タイムアウト時間(ここでは10000ms)を指定

// 6秒待機するtimer関数
const timer = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, 6000);
  });

it('テスト01', async () => {
  await timer(); // 6秒待機
  expect('hello').toBe('hello');
});

it('テスト02', async () => {
  await timer(); // 6秒待機
  expect('hello').toBe('hello');
});

テストを実行結果を以下に示します。テストの実行にそれぞれ6006msと6009msの時間を要していますが、タイムアウト時間を10秒に変更したので、タイムアウトにならずテストが実行できるようになります。

PS C:\Users\user01\Desktop\jestSetTimeOut> npm test

> jestsettimeout@1.0.0 test
> jest

 PASS  ./sample.spec.js (12.497 s)
  √ テスト01 (6006 ms)
  √ テスト02 (6009 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        12.574 s
Ran all test suites.

jest.setTimeout()を設定ファイルに記述する方法

テストファイルに直接jest.setTimeout()を記述するのではなく、以下に示すように、Jestの設定ファイル(jest.config.js)のsetupFilesAfterEnvオプションを用いてもよいです。

jest.config.js

module.exports = {
  setupFilesAfterEnv: ['./jest.setupFilesAfterEnv.js'],
};

jest.setupFilesAfterEnv.js

jest.setTimeout(10000); // タイムアウト時間(ここでは10000ms)を指定

上記のように記述すると、テストが実行される前に、setupFilesAfterEnvで指定した「jest.setupFilesAfterEnv.js」が実行されるようになります。

あわせて読みたい

Jestの設定ファイル(jest.config.js)の『setupFilesAfterEnv』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

Jestの設定ファイル(jest.config.js)でタイムアウト時間を指定する方法

Jestの設定ファイル(jest.config.js)のsetTimeoutオプションを用いても、Jestのタイムアウト時間を変更することができます。この方法も複数のテストでJestのタイムアウト時間を一括変更する際に有効です。

jest.config.js

module.exports = {
  testTimeout: 10000, // タイムアウト時間(ここでは10000ms)を指定
};

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

Jestのタイムアウト時間指定には以下の優先順位があります。

  • test()やit()の第3引数でタイムアウト時間を指定する方法
  • jest.setTimeout()でタイムアウト時間を指定する方法
  • Jestの設定ファイル(jest.config.js)でタイムアウト時間を指定する方法

そのため、Jestの設定ファイル(jest.config.js)でタイムアウト時間を10000msに指定しても、jest.setTimeout()でタイムアウト時間を6000msにすると、jest.setTimeout()で指定したタイムアウト時間が優先されて適用されます。

本記事のまとめ

この記事では『Jestのタイムアウト時間』について、以下の内容を説明しました。

  • Jestのタイムアウト時間は5秒なので注意
  • Jestのタイムアウト時間の変更方法
    • test()やit()の第3引数でタイムアウト時間を指定する方法
    • jest.setTimeout()でタイムアウト時間を指定する方法
    • Jestの設定ファイル(jest.config.js)でタイムアウト時間を指定する方法

お読み頂きありがとうございました。