1

私は、単体テストのカバレッジがしっかりしている PHP プロジェクトに取り組んでいます。

前回、単体テストのコマンドライン テスト ランナーの--filterコマンドを使用して非常にトリッキーな操作を行っていることに気付きました。

公式ドキュメントからのこのコマンドの説明は次のとおりです。

- フィルター

名前が指定されたパターンに一致するテストのみを実行します。パターンは、単一のテストの名前か、複数のテスト名に一致する正規表現のいずれかです。

テスト ベース全体から 1 つのテスト スイートまたはテスト ケースのみを実行することが非常に役立つ場合があるため、よく使用します。

これが良い習慣なのかどうか疑問に思っていますか?

1 つのコンポーネントのみを変更し、100% の自信を持って 1 つのコンポーネントのみを変更し、他のコンポーネントのユニットに失敗しないことが確実にわかっている場合は、継続的インテグレーション マシンでテスト スイート全体を実行することをお勧めします。テスト。あなたはそれについてどう思いますか?

少し前に、すべての単体テストのスイート全体を実行するのに必要な時間はあまり気にするべきではないと考えていましたが、非常に複雑なビジネス ロジックと単体テストがある場合、これにはかなりの時間がかかる場合があります。

「実際の」単体テストは DB と対話してはならず、モック/スタブ オブジェクトを使用するべきではないことを理解しています。それに同意します。しかし、場合によっては、テストに DB フィクスチャを使用する方がはるかに簡単 (安価) です。

この問題を解決する方法を教えてください。

4

3 に答える 3

1

優れた単体テストは次のことを行う必要があります。

  • ドキュメントとして機能する明確なメソッド名と変数名を用意する
  • 速く走る。これにより、複雑なビジネス ロジックでのテストも可能になります。テストは約 0.1 秒の平均時間で実行する必要があります。
  • 1 つのテスト メソッドで 1 つのことを正確にテストする
  • ファイルシステム、電子メール、データベース、Web サービスなどの外部リソースと統合しないでください。個別のデータベース統合テストを作成して、データベースの非動作をテストできます。これらのテストは、ほとんどの場合、単体テストよりも遅くなります。統合テストを別のプロジェクトに配置し、統合コードの作業中にのみ実行します。また、CI サーバー上のすべてのビルドでそれらを実行します。
  • 互いに完全に隔離してください。相互に依存しているテストがある場合、どのテストが失敗したかを読んでも問題が何であるかがわかりません。問題を見つけるためにデバッグが必要になる場合があります。分離されたテストにより、多くの時間を節約できます。

個人的には、テストではカテゴリ名を使用しません。アプリケーションごとに 2 つのテスト プロジェクトを使用します。1 つは単体テスト用、もう 1 つは統合テストと遅いテスト用です。

反応:

「しかし、場合によっては、テストに DB フィクスチャを使用する方がはるかに簡単 (安価) です。」

コードが適切に記述されていれば、モックが作成しやすくなります。Php でのフレームワークのモックについては知りませんが、他の言語でそれらを使用して多くの時間を節約しています。最初にテストを書き、後でコードを書くと、コードを簡単にテストできるように設計するのに役立つ場合があります。

個人的に私はより良いテストをすることを学びました

  • それについてのブログを読む
  • それに関する本を読む
  • 他の人が書いたテスト済みのコードを読む
  • もちろん、たくさんのテストを書いています。上手になるには、数千回のテストが必要でした。
于 2009-04-12T22:38:25.140 に答える
1

テスト ベース全体から 1 つのテスト スイートまたはテスト ケースのみを実行することが非常に役立つ場合があるため、よく使用します。

これが良い習慣なのかどうか疑問に思っていますか?

もちろん、ときどき単体テストの完全なセットを実行する限り (CI サーバー経由で完璧に聞こえます)

「興味深い」テストを定期的に実行する方が、すべてのテストをめったに実行しないよりも優れています。

于 2009-04-12T23:07:37.610 に答える
0

コミットする前に実行する必要がある 1 分以下のテストのサブセット (「スモーク テスト」) を作成し、CI サーバーからテストの完全なセットを実行することで、この問題に対処します。

テストの完全なセットに 15 分以上かかる場合は、それらを分割して並行して実行することを検討します。

次に、 --filter を使用して、最も関心のあるテストを最初に実行し、次にコミットする前にスモーク テストを実行し、残りを CI サーバーから実行できます。

于 2009-04-13T18:37:25.240 に答える