1

テストでは、@depends を使用して、テスト メソッドを別のメソッドに依存させることができます。最初のテストが失敗した場合、それに依存するテストは無視されます。テスト クラスでそれを行う方法はありますか

たとえば、レイアウトをテストするページがあり、画像が表示されていることを確認し、リンクが正しい場合、これは1つのテストクラスになり、このページにはフォームへのリンクがあり、そのページについてはレイアウト、検証などをチェックする新しいテストクラスを作成します。

私が試してプルしたいのは、最初のテストクラスのテストが失敗した場合、2番目のページをスキップする必要があるということです.最初のページは、ユーザーが最初のページに入る前に表示されるページになるため、正しいはずです(入力しない限り) 2 番目のページの URL が表示されますが、ユーザーは愚かで、アドレス バーの仕組みを知らないと想定する必要があります)

また、すべてのテストは TFS を使用して保存されているため、チームは同じテストを行っていますが、異なる phpunit.xml ファイルを使用している可能性があることにも注意してください (1 人は明らかに php.xml.dist を使用しており、一度言及されているため変更されません)。 Magento TAF では、私は .xml を使用していて問題はありませんでしたが)、そのため、phpunit.xml で順序を強制しようとしても、それほど役に立ちません (.xml で順序を強制しても、この依存関係は実行されません)。

4

2 に答える 2

3

できるからといって、そうすべきだというわけではありません。 他のテストの実行の成功に依存するテストを持つことは、悪い考えです。テストに関する適切なテキストはすべて、これを示しています。あの人達の話を聞いて。

于 2013-02-20T22:59:23.333 に答える
1

phpUnit には、あるテスト クラスを別のテスト クラスに依存させる方法があるとは思いません。(頭に浮かぶいくつかのハックを書き始めましたが、それらは非常に醜くて壊れやすいので、もう一度削除しました。)

最善のアプローチは、すべての機能テストを 1 つの大きなクラスで行うことだと思います。その後、必要なだけ @depends を使用できます。<--それがあなたの実際の質問に対する私の答えが終わるところです:-)

ロスの答えに対するあなたのコメントでは、次のように述べています。なぜそれが通常は良い考えなのか、水面下​​に潜ってみましょう: 1 つのクラスに多くのコードが含まれているということは、そのクラスがやりすぎていることを示しており、変更が難しく、テストが難しくなっています。したがって、Extract Class リファクタリングを使用して、クラスをより細かい機能に分割します。ただし、決して機械的には行わないでください。各クラスは、何かをきれいに抽象化したものである必要があります。

単体テストでは、クラスは関連するテストをまとめて収集する方法として考えたほうがよいでしょう。あるテストが別のテストに依存する場合、それらは明らかに関連しているため、同じクラスにある必要があります。

2000 行のファイルに不満がある場合、実行できること、実行する必要があることの 1 つは、親クラスの抽出です。親クラスには、すべてのヘルパー関数とカスタム アサートが入ります。実際のテストはすべて派生クラスに残しますが、それぞれを調べて、共有関数に移動できる共通機能を確認し、その共有関数を親クラスに配置します。

ロスの提案は悪であることに応えて@depends、理想主義と現実世界の制約との間のバランスを見つけるのに役立つと考えたい. 理想的な世界では、すべてのテストが完全に独立していることを望みます。つまり、各テストは独自のフィクスチャの作成と破棄を行う必要があります。データベースを使用する場合は、独自のデータベースを作成する必要があります (一意の名前であるため、将来的には並行して実行できます)。次に、テーブルを作成し、データを入力します (親クラスでヘルパー関数を使用します)。この共通のフィクスチャ コードを共有します。)

一方で、クリエイティブ フローが中断されないように、テストは 100 ミリ秒未満で終了する必要があります。フィクスチャを共有すると、独立性が失われますが、テストを高速化できます。

Web サイトの機能テストでは、@dependsログインなどの明白なことに使用することをお勧めします。ほとんどのテストが最初にサイトにログインする場合、loginTest() を作成し、他のすべてのテストをそれに依存させることは非常に理にかなっています。ログインが機能しない場合、他のすべてのテストが失敗することは確実です...そして、その過程で最も貴重なプログラマー リソースを大量に浪費しています。

それほど明確でない場合、私は理想主義の側で誤りを犯し、必要に応じて後で戻って最適化します。

于 2013-02-22T00:21:48.837 に答える