私はいくつかのフロントエンドテストを実行するためにpuppeteerとjestを使っています。
私のテストは次のようになります。
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
時々、私がテストを実行するとき、すべてが予想通りに動作します。それ以外の場合は、エラーが発生します。
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21
at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
これは奇妙です:
タイムアウトを30000に指定しました
このエラーが出るかどうかは一見非常にランダムです
なぜこれが起こっているのか誰かが推測できますか?
そのため、ここで指定したタイムアウトはデフォルトのタイムアウトより短くする必要があります。
デフォルトのタイムアウトは5000
で、フレームワークはデフォルトでjasmine
の場合はjest
です。追加することでテスト内のタイムアウトを指定できます。
jest.setTimeout(30000);
しかし、これはテストに固有のものです。あるいはフレームワークの設定ファイルを設定することもできます。
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
// jest.config.js
module.exports = {
setupTestFrameworkScriptFile: './jest.setup.js'
}
// jest.setup.js
jest.setTimeout(30000)
このスレッドも見てください
テストから非同期の場合はdone関数を呼び出す必要があります。
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
3000
のタイムアウトがあっても私のテストはまだ(ランダムに)失敗することを付け加えたいと思います(これはコメントには少し長いです)。
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
@ Tarunのすばらしい答えのおかげで、私は多くのテストを修正するための最短の方法は次のようになると思います。
describe('puppeteer tests', () => {
beforeEach(() => {
jest.setTimeout(10000);
});
test('best jest test fest', async () => {
// blah
});
});
この質問に対する答えは、Jestが進化するにつれて変わりました。現在の回答(2019年3月):
it
に3番目のパラメータを追加することで、個々のテストのタイムアウトを無効にすることができます。すなわち。 it('runs slow', () => {...}, 9999)
jest.setTimeout
を使ってデフォルトを変更することができます。これをする:
// config
"setupFilesAfterEnv": [ // NOT setupFiles
"./src/jest/defaultTimeout.js"
],
そして
// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
done
はasync/awaitアプローチでは必要ありません。コールバックで必ずdone();
を呼び出すようにしてください。そうしないと、単にテストに合格しません。
beforeAll((done /* call it or remove it*/) => {
done(); // calling it
});
Done()コールバックを持つ他のすべての関数に適用されます。
私は最近、別の理由でこの問題に遭遇しました。jest -i
を使用していくつかのテストを同期的に実行していたのですが、タイムアウトするだけでした。どんな理由であれ、jest --runInBand
を使用して同じテストを実行しても(-i
は別名であることを意図していますが)タイムアウトにはなりません。
たぶんこれは誰かの助けになるでしょう¯\_(:/)_/¯
タイムアウトの問題は、ネットワークが遅い場合、またはawait
を使用して多くのネットワーク呼び出しが行われた場合に発生します。これらのシナリオはデフォルトのタイムアウト、つまり5000ミリ秒を超えます。タイムアウトエラーを回避するには、タイムアウトをサポートするグローバルのタイムアウトを増やすだけです。グローバルとその署名のリストは here にあります。
Jest 24.9の場合
jest --runInBand
についての説明をお探しの方は、ドキュメント CI環境での人形劇の実行 https://github.com/smooth-code/jest-puppeteer にアクセスしてください。