15

私はモカユニットテストスイートを持っています。

それらをローカルで実行すると、すべて正常に動作します。Jenkins CI サーバーでそれらを実行すると、失敗することもあれば、成功することもあります。

なぜ彼らが失敗したのかを再現することはできません。この動作の原因は何ですか?

4

5 に答える 5

11

テストはさまざまな理由で断続的に失敗する可能性があり、失敗の理由を特定することで、多くの場合、コードベースと環境が明らかになります。

いくつかの考えられる原因を次に示します。

• 共有オブジェクト - 状態を保持するシングルトンは、テスト環境が既知の状態にリセットされていない場合、テスト間で問題を引き起こす可能性があります。テスト ランナーが非決定論的な順序でテストを実行すると、破損した状態の問題を実際に公開しているランダム エラーが表示される場合があります。

• 環境と外部の依存関係 - 状態を保持できる外部オブジェクトは、予期しない結果を引き起こす可能性があります

• タイミング - タイムアウトやスレッド スリープが具体的すぎるテストが書かれていることがあります。ビルド サーバーが高負荷で動作している場合、これらのタイムアウトは十分な長さではない可能性があります。

一般的なガイダンスとして、テストは次のようにする必要があります。

  • 分離: テストは一度に 1 つのユニットに焦点を当てます
  • 反復可能: 毎回同じ結果が生成されます
  • 独立: テストが実行される順序は重要ではありません
于 2012-09-29T01:21:02.220 に答える
3

エグゼキューターの数を 1 に減らして、問題を絞り込もうとします。テストがまだ断続的に失敗する場合は、Test Run Warが発生しています。それ以外の場合 (ローカルで正常に実行されている場合)、 Resource Leakageのように見えます。

詳細については、 http: //xunitpatterns.com/Erratic%20Test.htmlを参照してください。

于 2012-09-30T13:50:15.227 に答える
0

私はで働いていjestます。私の問題は、モックデータが原因でテストが断続的に失敗することでした。モックをクリアし、それぞれの内部で偽のタイマーを使用するとdescribe、問題が解決しました。

describe("my test", ()=> {

    beforeAll(() => {
        jest.setTimeout(30000);
        jest.useFakeTimers();
      });
    afterAll(() => {
        jest.useRealTimers();
      });
    beforeEach(() => {
        jest.clearAllMocks();
      });

    it("my test", async()=>{....})


    ...

})
于 2022-03-04T19:30:49.540 に答える