単体テストの順序について混乱しています。 StackOverflowの多くの投稿では、単体テストは独立して小規模である必要があると述べています。 IMHO、集約または構成の場合、メンバーオブジェクトはコンテナオブジェクトの前にテストする必要があります。
Test_Procedureクラスがあるとしましょう。
Test_Procedureオブジェクトには、1つ以上のTest_Stepクラスが含まれています。
Test_Stepオブジェクトには、Setup_Section、Actions_Section、およびClose_Sectionクラスが含まれています。
上記のシナリオでは、私の理解では、Setup_Section、Actions_Section、およびClose_Sectionは、Test_Stepクラスの前に単体テストする必要があります。同様に、Test_Stepクラスは、Test_Procedureクラスの前に単体テストする必要があります。 Setup_Sectionクラスに障害がある場合、最初にそれを単体テストすると、直接の原因が示されます。 Test_Procedureクラスの単体テストは失敗しますが、Test_Stepクラスが失敗したことが示されます。次に、Test_Stepクラスが失敗した理由、そして最後にTest_Stepステップクラスが失敗した方法を見つける必要があります。それは余分な作業です。
IMHO、Test_Stepクラスは、メンバークラスが合格した場合にのみ単体テストを行う必要があります。そうでなければ、それは時間と労力の無駄です。
この質問は継承にも当てはまります。親クラスは、子クラスの前にテストする必要があります。
Googleのテストフレームワークでは、テストの注文は許可されていません。
ユニットテストではテストの順序は重要ではないと人々が言うのはなぜですか?
モジュールテストを記述しているため
違いがあり、どちらにも利点があります。
ユニットテストは小さく、制約する必要があります。単体テストのほとんどすべてが、Plain Old Dataまたは共同編集者のいずれかです。唯一の「実際の」オブジェクトは、その動作が検証されているオブジェクトです。これにより高速になり、失敗した場合は、ユニットのコード自体が正しくないことが明らかになります(データとテスト自体が正確であると想定)。
モジュールテストはオーケストレーションについてです。いくつかの実際のオブジェクト(およびおそらくいくつかのモック境界オブジェクト)があり、特定の結果を達成できるかどうかを確認するために調整されます。個々のオブジェクトは「正しい」が、それらが相互作用するため、これらの相互作用は「正しい」とは限らないことが前提です。そのため、失敗した場合、失敗の明確な理由は、相互作用が正しくないことです。これには、個々のオブジェクトの調整、またはオーケストレーションの構成の変更が必要になる場合があります(テストのセットアップと検証が正しいことを前提としています)。
構成と継承
構成により、テストは明らかにモジュールカテゴリに分類されます。結果を得るために一緒に働くいくつかの「実際の」オブジェクトがあります。
テストに「実際の」オブジェクトが1つしかない場合は明らかではありませんが、継承も同様です。その理由は、「実際の」オブジェクトは継承されたデータと動作を組み合わせたものであるからです。
ニュアンス
今、あなたは少し目を細める必要があります。クラスはデータと動作の組み合わせであるため、定義上はモジュールです。ただし、単一のインスタンスのみを使用し、共同作業者を模擬するクラスの大部分に対して作成されたテストは、単体テストと見なされます。
区別はある程度分析のレベルに依存します。単一のオブジェクトを介して提示されたとしても、データベースエンジンのテストは単体テストとは見なされません。
逆に、文字列(両方がクラスである)は、それらの文字オブジェクトが別個の「実際の」オブジェクトであり、連携して動作するように調整されている場合でも、おそらく単体テストカテゴリに分類されます。
何かが単体テストではなくなり、モジュールテストになり始める場所を明確にするための厳格なルールはありません。私の直感は、外部から課せられたオーケストレーションがどれだけ発生するかに集中しています。
注文
単体テストは、特定の実行順序を必要としません。それらは独立したプロパティをテストし、それらの失敗はオブジェクトがその期待に応えていないためであることは明らかだからです。
モジュールテストには実行順序が必要です。 「実際の」共同作業者のそれぞれが単体テストされるまで、実行しないでください。
テスト値
ただし、ユニットテストが失敗した場合でも、モジュールテストを実行します。少なくとも時間の許す限り。
なぜ?
コンポーネントが動作しない場合でも、モジュールが期待どおりに動作する可能性があるためです。これにより、テスト自体が正しくないことが明らかになったり、特定の構成がコンポーネントレベルの欠陥を回避する理由についての洞察が得られたりする可能性があります。
ユニットテストではテストの順序は重要ではないと人々が言うのはなぜですか?
理想的な世界では、allのテストをparallelで実行するためです。これにより、フィードバックの取得にかかる時間が最小限に抑えられます。たとえば、テスト駆動開発を行っている場合は、設計に注意を払い、テストを使用してその設計を測定する必要があります。
happens-before
テスト間の関係では、最小限のレイテンシを増やします。
順序付けが意味をなすいくつかの状況があります。たとえば、安価なテストと高価なテストのカバレッジが大幅に重複している場合、失敗することがわかっている高価なテストにお金を「浪費」するのではなく、安価なテストが成功することを確認できます。
実装アクティビティの一部として「単体テスト」を実行している人々は、通常、高価なテストを実行していません。投資収益率はありません。
テストの順序すべきではありませんユニットテストでは問題になります。個別にテストすることを意図しているためですユニット。ParentTests
クラスのテストがすべて実行されるようにコードが編成されている場合ChildTests
によってテストされたコード、私はどちらかを主張します
Parent
クラスまたはParent
クラスとChild
クラスの結合が強すぎます。従来の開発主導型テストでは、テスト間の重複を回避するために責任が十分に分離されたクリーンなアーキテクチャを完成させるのは非常に難しい場合があります。 TDDは、アーキテクチャについて考えることを強制することでこれを支援しますbefore実装の開始ただし注意してください:TDDはnotを実行して、アーキテクチャの進化に伴ってアーキテクチャをクリーンに保つためにリファクタリングについて必要な理解を提供しますが、それは可能です。
単体テストを互いに依存させる正当な理由はありません。
どうして?なぜなら、以前のテストで提供されたものは何でも保存できるからです。
現在、どのテストを最初に実行するかは重要ではありません。キャッシュしたものを正確に生成するテストがあることだけが重要です。
単体テストから時間を絞ります。それはあなたの友達ではありません。