Jest: グローバルbeforeAll

作成日 2017年06月15日  ·  36コメント  ·  ソース: facebook/jest

グローバルbeforeAllの方法はありますか?

各テストファイルでbeforeAllを定義できますが、これにより、テストファイルごとにbeforeAllが1回実行されます。

最初のテスト開始前に一度実行されて終了するグローバルbeforeAllはありますか?

最も参考になるコメント

グローバル設定の場合は+1。 他のユーザーと同じように、アプリ/DBを一度だけセットアップして破棄したいと思います。

全てのコメント36件

setupFilesを見たことがありますか?

参考までに、私のプロジェクトでは次のようにsetupFilesを使用しています。

package.json

{
  "jest": {
    "setupFiles": [
      "./private/mocks/runtime.js"
    ]
  }
}

./private/mocks/runtime.js

global.__meteor_runtime_config__ = {ROOT_URL: 'localhost'};

FYI Stack Overflowは、この種の質問に適した場所かもしれません。 (バグレポート/機能リクエストの代わりに使用法についての質問)。

また、私はこの問題の購読を解除したので、返信しても通知は届きません。

create-react-appを使用しています。
およびsetupFilesは、テストファイルごとに再度実行されます。

正しくない答えを出し、その後問題を解決します。 ブラボー!

@cpojer @ashtonsixこれを閉じる必要はないと思いますが、答えは正しくありません。テストスイートごとにsetupFilesまたはsetupTestFrameworkScriptFileの両方が実行されるため、「グローバル」のbeforeAllはありません。設定できる場所は、テストする前にテストデータベースをクリーンアップするようなものです。

package.jsonにpretestを含めることができますか?

@ Negan1911-たぶん、しかし、OPで何を意味するのかを判断するのは難しいです。 便利な機能であり、この機能のリクエストをより明確にしたい場合は、2番目の問題を作成することを検討できますか?

@cpojer @ashtonsix私が正しく理解していれば、現在、モカで説明されているようなグローバルなセットアップと分解を行うことはできません。
私(およびおそらくOP)のユースケースは、サーバーを実行してから、すべての統合テストを実行したいというものです(そして、おそらくすべての統合テストを実行した後、テストDBを削除します)。
これを行うためのアドバイスやベストプラクティスはありますか?
私が見つけたのは、ほとんどの場合、サーバーを起動し、「ローカル」のbeforeAll / afterAllで、たとえば@kentcdoddsによってサーバーを閉じるように指示していることですが、多くの重複を意味します。

グローバル設定で+1、私のユースケースではプロキシサーバーも実行したい

@ashtonsixの価値については、私の意見ではOPは明確でした。 この号を再開してほしい。

カスタムjest-environmentを作成できます。 jest-environment-nodeまたはjest-environment-jsdomを参照して、サブクラス化します。 それはあなたが好きな方法で環境をセットアップすることを可能にするはずです。 これにも非同期フックを追加することについて話し合いましたが、PRを喜んで受け入れます。

+1モカからの冗談を試してみたかったのですが、同じ問題に悩まされるまで、 jest-codemodsとドキュメントの使いやすさに感銘を受けました。

それぞれの個別のファイルの最初のdescribeはすべて、実行に驚くほど長い時間がかかりました。 以前のコメントで説明したように、セットアップはファイルごとに1回実行されたため、 DROP DATABASECREATE DATABASEなどの不必要な時間のかかる操作が大量に発生しました。

残念ながら、理想的ではないnode setup.js && jestを実行することを除いて、ドキュメントには回避策がありません(これにより私はここに来ました)。

グローバル設定の場合は+1。 他のユーザーと同じように、アプリ/DBを一度だけセットアップして破棄したいと思います。

+1

#4506で修正

次のjestオプションglobalSetupglobalTeardownがあります。 https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -string

globalSetupを使用してみましたが、次のエラーが発生し続けます。このオプションで@shai32のトリックが実行される可能性があります。 しかし、私はそれを機能させることができないようです🤣...

"jest": "^21.2.1"
 "jest": {
    "globalSetup": "./jest-config.js"
  }



md5-d3a1dcf99642fcf0b9c99c838aadb689



● Validation Warning:

  Unknown option "globalSetup" with value "./jest-setup.js" was found.
  This is probably a typing mistake. Fixing it will remove this message.

  Configuration Documentation:
  https://facebook.github.io/jest/docs/configuration.html

まだリリースされていません。 ジェスト22がいつでも入ってくる🙂

#4506で修正

私はそれがそこにリンクされていることを知っていますが、探している人のために: https ://github.com/facebook/jest/pull/4716

@btavそれは2つのバグです😓

  1. 今のところ絶対パスを使用する必要があります、または( "../../../~ root〜")
  2. 検証の警告は誤検知です

ここを参照してください
また#5093

バグは#5095#5096で修正する必要があります

これを使用してグローバル変数を設定できますか? 試しましたが、うまくいきません。これは仕様によるものですか?

私のユースケースは、グローバルに設定したいカスタムログ関数があることです。 _setup.test.jsを試しましたが、グローバル変数が転送されません。

@zwhitchcoxはsetupFiles構成オプションを使用します: https ://facebook.github.io/jest/docs/en/configuration.html#setupfiles -array

非同期関数を介して設定されたグローバル変数を共有すると便利な場合があります。 たとえば、globalSetupでpuppeteerブラウザーを一度セットアップしてから、各テスト/テストスイートで新しいページを生成すると便利です。

@tdenovanまさに今私がやろうとしていることです。 しかし、それは機能していないようです。 私は以前モカでこれをやったことがあり、それは簡単でしたが、冗談で私は他の方法を見つける必要があると思います。
これは私の冗談の設定です

"jest": {
    "verbose": true,
    "testEnvironment": "node",
    "globalSetup": "<rootDir>/scripts/testSetup.js",
    "globalTeardown": "<rootDir>/scripts/testTeardown.js"
  },
// globalSetup.js
module.exports = async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  bot = Bot(browser, page);
  await bot.goto(bot.baseUrl);
  global.bot = bot;
}

しかし、テストケースではボットにアクセスできません。

GGWP! ちょうどそれを解決しました。

"e2e": "jest --testRegex '.*.e2e.js'"
// globalTeardown.js
module.exports = async () => {
  if (process.testSetup) {
    process.testSetup.bot.close();
  }
}

 process.testSetup = { bot };
// and then im my tests
const { bot } = process.testSetup;

そして、誰もがボットが何であるか疑問に思っています、

const Bot = (browser, page) => ({
  browser: browser,
  page: page,
  baseUrl: 'http://localhost:4000',
  user: {
    name: faker.name.findName(),
    email: faker.internet.email(),
    password: 'Test<strong i="13">@123</strong>',
  },
  oldUser: {
    email: '[email protected]',
    password: 'Test<strong i="14">@123</strong>',
  },
  clearSession: async () => {
    await page.evaluate(() => sessionStorage.clear());
  },
  goto: async (url) => {
    await page.goto(url);
  },
  clickButton: async (id) => {
    await page.waitForSelector(id);
    await page.click(id);
  },
  checkText: async (expect, id, text) => {
    await page.waitForSelector(id);
    const elText = await page.$eval(id, el => el.innerHTML);
    expect(elText).toContain(text);
  },
  type: async (id, text) => {
    await page.waitForSelector(id);
    await page.$eval(id, el => el.value = '');
    await page.type(id, text);
  },
  wait: async () => {
    await page.waitForNavigation();
  },
  close: () => {
    browser.close();
  },
});

ウェブサイトにパペッティアのガイドがあります: https ://facebook.github.io/jest/docs/en/puppeteer.html

はい、しかしそれは、globalSetup非同期メソッドでグローバルを設定することが可能であることを示唆しています。これは上記のようにbではないようです。

@SimenB ahh .. man ...私はこれを理解しようとしていて、かなり長い間jest docsにいましたが、そのセクションに気付くことはありませんでした。 私の時間の無駄。

複数のテストスイートが並行して実行されている場合、globalSetupで設定したグローバルオブジェクトが使用できないという問題があります(これはデフォルトです)。 単一のスイートテストを実行すると、オブジェクトが使用可能になります。または、テストをシリアルに実行するように--runInBandを設定した場合。 テストを並行して実行する場合、globalSetupで設定した変数にアクセスするにはどうすればよいですか?
上記で使用した例(プロセスオブジェクトを使用)を試しました。また、カスタムTestEnvironmentを使用しているバージョンも試しましたが、運がありませんでした。

const PuppeteerJsdomEnvironment = require('jest-puppe-shots/lib/jsdom-environment');

class JestPuppeShotsEnv extends PuppeteerJsdomEnvironment {

  async setup(config) {
    await super.setup(config);
    const { allThemesCss } = global;

    // make the allThemesCss object available in test suites
    Object.assign(this.global, {
      allThemesCss
    });
  }
}

module.exports = JestPuppeShotsEnv;

これは、globalSetup.jsからallThemesCssを取得し、テストスイートに渡されていることを確認しています。

@ ovidiu-lapadusグローバルの代わりにprocessを使用して、globalSetupを機能させることができました。 --runInBandの有無にかかわらず動作します。 例えば

// globalSetup.js
module.exports = async () => {
  process.FOOT = 'BALL';
};
// globalTeardown.js
module.exports = async () => {
  console.log(process.FOOT) // BALL 
};
// some.test.js
it('expects 1 to be 1', () => {
    expect(1).toBe(1);
     console.log(process.FOOT); // BALL
});

そして、jestチームにとって、 globalテスト(babel-jest 22.2.2)で定義されていないのに、 globalTeardown.jsで定義されている理由はわかりません。 おそらくそれはバグです。 今のところ、 processを使用します。 乾杯!

ありがとう@cellisあなたは私の日を救った! global.FOOが機能しなかった理由を理解しようとして、壁に頭をぶつけてきました。 process.FOOはトリックを行います:-)

@kalutheoprocess.FOOの使用にはいくつかの注意点があります。 まず、processまたはprocess.envで深くネストされた変数を実行できるとは思いません。 グローバルを機能させるためのさらに良い方法を見つけましたが、それを投稿するのを待っていました。 私がやったことは、jest-environmentパッケージを使用して、独自のdbEnvironmentを作成することです。 そこで、グローバルデータベースが定義されているかどうかを確認し、定義されていない場合は再定義します。 データベース環境はdbテストに対してのみ実行されます。フロントエンドのみのテスト用に別の構成があります。 そうすれば、フロントエンドを変更するたびにdbテストを実行する時間を無駄にすることはありません。 次に、常にホットな複数の「レプリカ」データベースを設定する方法があります。devdbと一緒に移行するため、jestを実行するたびにそれらを移行またはダンプする必要はありません(これは私が共有した要点です)、これによりテストをさらに高速に実行できます。 これらのレプリカのプールを設定して、テストで最大の並列処理を取得できるようにします。 それは一種のjestドキュメントに文書化されていますが、十分に説明されていません。 とにかく、ここに要点があります: https ://gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2

@ ovidiu-lapadus詳しく調べてみると、おそらくあなたの問題は、グローバルを割り当てる前にsuper.setup()に電話したことだと思います。 実用的な解決策については、上記の要点を参照してください。

@cellisはこれらの貴重な情報に感謝します。 あなたが説明したようなカスタム環境で試してみます

皆さん、 globalSetupには、 babel-polyfillのようなすべてのヒーブタスクが含まれ、 chaiと組み合わされ、 jest-extendedが必要ではありませんか?
globalSetupの動作はsetupTestFrameworkScriptFileとは大きく異なり、そこで機能したものはglobalSetupでは機能しないようです。
私は知っている、すべてのjestテストケースは彼のsnadboxed環境で実行されますが、 setupTestFrameworkScriptFileで何もしないと、テストの実行が遅くなります。

モカ:9秒
ジェスト:60年代、ウォッチモード:170〜200秒

processを使用することは、おそらく壊れることになるハックです(これはバグです)。

あなたはおそらく#7184をフォローしたいと思うでしょう

これは、質問で尋ねられたようなグローバルなbeforeAll()ではありませんが、これを使用すると、コードの重複を簡単に回避できます。 すべてのテストファイル用にセットアップされるノード環境を作成できます: https ://stackoverflow.com/a/61260044/4934640


アップデート

globalSetupに環境変数を設定できることがわかりました。つまり、テストケース/スイート/ファイル間でサーバーアドレスを共有できます: https ://github.com/facebook/jest/issues/7184#

このページは役に立ちましたか?
0 / 5 - 0 評価