単体テストのタグ付け
-
09-09-2019 - |
質問
私は単体テストを確実にカバーする PHP プロジェクトに取り組んでいます。
前回、単体テストのコマンドライン テスト ランナーで非常にトリッキーな操作を行っていることに気づきました。」 - フィルター 指示。
公式ドキュメントからのこのコマンドの説明は次のとおりです。
- フィルター
名前が指定されたパターンに一致するテストのみを実行します。パターンは、単一のテストの名前、または複数のテスト名に一致する正規表現のいずれかになります。
テスト ベース全体から 1 つのテスト スイートまたはテスト ケースだけを実行すると非常に便利になる場合があるため、私はこれを頻繁に使用します。
これが良い習慣なのかどうか疑問に思っています。
次の場合には、継続的インテグレーション マシン上でテスト スイート全体を実行するのが良い場合があると聞いたことがあります。 あなたは確かに知っています コンポーネントを 1 つだけ変更したことと、 100% 自信がある, 、他のコンポーネントの単体テストに失敗しないこと。あなたはそれについてどう思いますか?
少し前まで、すべての単体テストのスイート全体を実行するのに必要な時間はそれほど気にする必要はないのではないかと考えていましたが、非常に複雑なビジネス ロジックと単体テストがある場合、これにはかなりの時間がかかることがあります。
「実際の」単体テストは DB と対話すべきではなく、モック/スタブ オブジェクトを使用すべきであることを理解しています。私もそれに同意します。ただし、場合によっては、テストに DB フィクスチャを使用する方がはるかに簡単 (安価) です。
この問題はどうすれば解決できるでしょうか、アドバイスをお願いします。
解決
優れた単体テストは次のことを行う必要があります。
- ドキュメントとして機能する明確なメソッド名と変数名を用意する
- 速く走る。これも可能だろう。 ビジネスが複雑なテスト向け ロジックを使用する。テストは平均的な時間で実行される。 約0.1秒
- 1 つのテストメソッドで 1 つのことを正確にテストします
- ファイルシステムや電子メールなどの外部リソースと統合しない、 データベース、ウェブサービス それ以外はすべてだ。を作成することができる。 個別のデータベース統合テスト を使用してデータベースの動作をテストします。これらのテストは、あなたのユニットよりも遅い ほとんどの場合、テストを受ける。私は 統合テストは プロジェクトに参加するときだけ実行する。 統合コードに取り組んでいる。I また、CI上のすべてのビルドで実行する。 サーバーを使用する。
- お互いに完全に隔離してください。テストがある場合 を見ることはできない。 あなたの問題は、どの本を読むことにある。 のテストは失敗した。そうしなければならないかもしれない。 デバッグして問題を見つける。孤立 のテストは時間を大幅に節約してくれる。
個人的には、テストではカテゴリ名を使用しません。アプリケーションごとに 2 つのテスト プロジェクトを使用します。1 つは単体テスト用、もう 1 つは統合テストと低速のテスト用です。
に対する反応:
「しかし、時には、それははるかに にDBフィクスチャを使用する方が簡単だ。 テスト"
コードが適切に記述されていれば、モックするのが簡単になります。Php でのモック フレームワークについては知りませんが、時間を大幅に節約するために他の言語でモック フレームワークを使用しています。最初にテストを作成し、その後でコードを作成すると、テストしやすいコードを設計できる場合があります。
個人的に私は、次のようにしてテストをより良くすることを学びました
- それに関するブログを読んでいると
- それについての本を読む
- 他人が書いたテスト済みのコードを読む
- もちろんたくさんのテストを書きます。上達するまでに数千回のテストが必要でした。
他のヒント
時にはそれが全体のテストベースから1つだけのテストスイートまたはテストケースを実行するために非常に便利になりますので私はofterそれを使用します。
これは良い習慣であるかどうか、私は思ったんだけど?
確かに、限り、あなたは時折ユニット・テストのフルセットを実行すると(CIサーバは完璧なサウンドを経由して)
..めったにすべてのテストを実行していないよりも優れている、定期的に「面白い」のテストを実行します
私はテスト(「スモークテスト」)のサブセットを持つことで問題に対処したい1分以下を取ることのはのあなたからのテストのフルセットを実行し、コミットする前に実行する必要がありますCIサーバます。
テストのあなたの完全なセットは、その後、私はそれらを分割して、それらを並列に実行するように見えるだろう> 15分かかる場合ます。
次に、あなたがコミットするその後、スモークテスト前、あなたが最初に最も興味を持っているテストを実行するために--filterを使用して、CIサーバからの残りの実行を持つことができます。