17

完全な PHPUnit スイートを実行するのに必要な時間が増えるにつれて、私たちのチームは単体テストを並行して実行する可能性があるかどうか疑問に思い始めています。最近、Paraunit に関する記事を読みました。また、Sebastian Bergman が書いた、彼は PHPUnit 3.7 に並列処理を追加します。

しかし、統合テスト、またはより一般的には DB と対話するテストには問題が残っています。一貫性を保つために、各テストの後に testDB をリセットし、フィクスチャをロードする必要があります。しかし、並列テストでは、すべてのプロセスが同じ DB を使用するため、競合状態の問題があります。

したがって、統合テストを並行して実行できるようにするには、各プロセスに独自のデータベースを割り当てる必要があります。この問題をどのように解決できるかについて誰かが考えているかどうかを尋ねたいと思います。別の xUnit 実装で、この問題に対する解決策が既に実装されている可能性があります。

私のチームではMongoDBを使用しているため、1つの解決策は、生成されたDB名(このプロセス用)を使用して、各PHPUnitプロセスの構成ファイルをプログラムで作成することです。setUp()メソッドでは、メインのTestDbをこの一時的なものに複製できます。しかし、このアプローチの実装を開始する前に、このトピックに関するアイデアをお聞きしたいと思います.

4

4 に答える 4

0

しかし、統合テスト、またはより一般的には DB と対話するテストには問題が残っています。一貫性を保つために、各テストの後に testDB をリセットし、フィクスチャをロードする必要があります。しかし、並列テストでは、すべてのプロセスが同じ DB を使用するため、競合状態の問題があります。

したがって、統合テストを並行して実行できるようにするには、各プロセスに独自のデータベースを割り当てる必要があります。この問題をどのように解決できるかについて誰かが考えているかどうかを尋ねたいと思います。別の xUnit 実装で、この問題に対する解決策が既に実装されている可能性があります。

統合テストの競合を回避するには、次の 2 つの方法があります。

  • これらのテストのみを並行して実行します。これは、データベースの非常に異なるテーブルを使用するため、競合しません
  • 競合するテスト用の新しいデータベースを作成する

オフ。これら 2 つのソリューションを組み合わせることができます。これらのアプローチのいずれかをサポートするphpunitテストランナーについては知らないので、プロセスを高速化するには独自のテストランナーを作成する必要があると思います...ところで、統合テストをグループ化して、いくつかだけ実行することはできます開発で使用している場合は、一度に...

同じ競合が、PHP の負荷が高い場合に同時実行の問題を引き起こす可能性があることに注意してください。たとえば、2 つの別個のコントローラー アクションで 2 つのファイルを逆の順序でロックすると、アプリケーションがデッドロックに陥る可能性があります... PHP で同時実行性の問題をテストする方法を探していますが、今のところうまくいきません。現在、独自のソリューションを作成する時間がありません。それを管理できるかどうかもわかりません。かなり難しいものです... :S

于 2014-04-07T15:50:49.613 に答える
0

アプリケーションが特定のベンダーと結合している場合。postgresql では、docker と docker-compose で個別のスタックを作成できます。次に、目的別にテストをグループ化します。モデルテスト、コントローラーテストなど

グループごとに、docker-compos を使用して特定のスタックをパイプラインにデプロイし、docker を介してテストを実行します。アイデアは、個別のデータベースを備えた個別の環境を用意することであり、競合を回避します。

于 2020-09-21T12:42:46.273 に答える