質問への回答
ユニットテストが多すぎるということはありますか?
確かに...たとえば、一見異なるように見えるが、実際には同じことをテストする複数のテストを行うことができます(論理的には、テスト対象の「興味深い」アプリケーションコードの同じ行に依存します)。
あるいは、決して外に出ないコードの内部をテストすることもできます(つまり、いかなる種類のインターフェイスコントラクトの一部でもありません)、それが理にかなっているかどうかについて議論することができます。たとえば、内部ログメッセージの正確な表現など。
私は、既存のアプリケーションの単体テストの作成を任されています。最初のファイルを完成させた後、元のコードの419行に対して717行のテストコードがあります。
それは非常に普通のように私を打つ。テストでは、実際のテストに加えて、セットアップと解体に多くのコード行を費やします。比率は改善される場合と改善されない場合があります。私自身は非常に重いテストであり、実際のコードよりも多くの場所と時間をテストに費やしています。
コードカバレッジを増やすと、この比率は管理不能になりますか?
比率はあまり考慮しません。テストを管理不能にする傾向がある他のテストの品質があります。コードをかなり単純に変更するときに、一連のテスト全体を定期的にリファクタリングする必要がある場合は、理由をよく調べる必要があります。そして、それらはあなたが持っている行の数ではなく、テストのコーディングにどのようにアプローチするかです。
単体テストの私の理解は、クラス内の各メソッドをテストして、すべてのメソッドが期待どおりに機能することを確認することでした。
これは厳密な意味での「ユニット」テストに適しています。ここで、「ユニット」はメソッドやクラスのようなものです。「ユニット」テストのポイントは、システム全体ではなく、1つの特定のコードユニットのみをテストすることです。理想的には、システムの残りすべてを削除します(doubleまたはその他を使用)。
しかし、プルリクエストで、技術リーダーは、より高いレベルのテストに焦点を当てる必要があると指摘しました。
それから、あなたは、人々がユニットテストと言ったときに、実際にユニットテストを意味していると仮定するというtrapに陥りました。「ユニットテスト」と言うが、まったく違うことを意味する多くのプログラマに会ったことがあります。
彼は、各機能を徹底的にテストするのではなく、問題のクラスで最も一般的に使用される4〜5つのユースケースをテストすることを提案しました。
確かに、重要なコードの上位80%に集中するだけで、負荷も軽減されます。上司を高く評価していることを感謝していますが、これは私にとって最適な選択ではありません。
私にとって、100%の単体テストのカバー率は高い目標ですが、50%にしか達していない場合でも、その50%の100%がカバーされていることがわかります。
「ユニットテストカバレッジ」とは何なのかわかりません。「コードカバレッジ」、つまり、テストスイートの実行後、コードのすべての行(= 100%)が少なくとも1回実行されたことを意味すると仮定します。
これは素晴らしい球場指標ですが、撮影できる最高の標準ではありません。コード行を実行するだけでは全体像ではありません。これは、たとえば、複雑なネストされたブランチを通るさまざまなパスを考慮していません。これは、テストが少なすぎるコードの断片を指し示す指標のようなものです(明らかに、クラスが10%または5%のコードカバレッジである場合、何かが間違っています)。一方、100%のカバレッジでは、十分なテストを行ったかどうか、または正しくテストしたかどうかはわかりません。
統合テスト
人は常に話しているときには、実質的に私を悩ますユニットのデフォルトでは、今日のテスト。私の意見(経験)では、ユニットテストは、ライブラリ/ APIのための素晴らしいです。よりビジネス志向の領域(手元の質問のようなユースケースについて話す場所)では、必ずしも最良の選択肢ではありません。
一般的なアプリケーションコードおよび平均的なビジネス(お金を稼ぐ、納期を守る、顧客満足度を満たすことが重要であり、主にユーザーの顔に直接あるバグ、または実際の災害につながる可能性のあるバグを回避する場合) NASAロケットの打ち上げについてはこちらをご覧ください)、統合テストまたは機能テストははるかに便利です。
これらは、行動駆動型開発または機能駆動型開発と密接に関係しています。定義上、これらは(厳密な)単体テストでは機能しません。
短くするために、統合/機能テストはアプリケーションスタック全体を実行します。Webベースのアプリケーションでは、それはアプリケーションを介してクリックするブラウザのように作用するであろう(となし、明らかにそれはありません持っているという単純なことを、非常に強力なフレームワークは、それを行うためにそこにある-チェックアウトにhttp://キュウリ。例としてio)。
ああ、最後の質問に答えるには、機能テストが実装されて失敗した後にのみ新しい機能がプログラムされるようにすることで、チーム全体に高いテスト範囲を提供します。はい、それはすべての機能を意味します。これにより、100%(ポジティブ)の機能カバレッジが保証されます。定義上、アプリケーションの機能が「なくなる」ことはありません。100%のコードカバレッジを保証するものではありません(たとえば、ネガティブな機能を積極的にプログラミングしない限り、エラー処理/例外処理を実行することはありません)。
バグのないアプリケーションを保証するものではありません。もちろん、明らかにまたは非常に危険なバグのある状況、間違ったユーザー入力、ハッキング(たとえば、周辺のセッション管理、セキュリティなど)のための機能テストを作成する必要があります。しかし、ポジティブなテストをプログラミングするだけでも大きな利点があり、最新の強力なフレームワークでかなり実現可能です。
機能/統合テストには明らかに独自のワームがあります(たとえば、パフォーマンス、サードパーティのフレームワークの冗長テスト、通常はダブルを使用しないので、私の経験では書くのが難しい傾向があります...) d毎日、100%コードカバレッジユニットテスト済みアプリケーション(ライブラリーではありません!)よりも100%ポジティブ機能テスト済みのアプリケーションを使用します。