FIRST、FIIRST、およびFASRCS
はい、混乱には部分的に理由があります。最初の原則が「私」に関して十分に完全または簡潔ではないということです。私が参加したコースでは、原則はFIIRSTと呼ばれていました
2番目の「I」は「Isolated」を表しています。上記のテストは他のテストから独立していますが、別のクラスまたはプロジェクトに分離されていません。
[更新しました]:
分離とは、次のことを意味します。
単体テストは、機能を SUT (テスト対象のシステム) から分離します。1 つの機能から機能を分離することもできます。これにより、単体テストまたはそれらに関連するコンポーネント テストと統合テスト、そしてもちろんシステム テストとの間に線が引かれます。
「テストは失敗を切り分けます。開発者は、何が問題なのかを知るために、テストやテスト対象のコードをリバース エンジニアリングする必要はありません。アサーションのテキストを含む各テスト クラス名とテスト メソッド名は、何がどこで間違っているかを正確に示す必要があります。」参考:FIRST原理の歴史
単体テストは、別の開発者成果物 (クラス、パッケージ、開発プロジェクト) および/または配信成果物 (Dll、パッケージ、アセンブリ) でテストする SUT から分離できます。
同じ SUT、特にそれらに含まれるアサートをテストする単体テストは、異なるテスト機能で互いに分離する必要がありますが、これは推奨事項にすぎません。理想的には、各単体テストには 1 つのアサートのみが含まれます。
さまざまなSUTをテストする単体テストは、互いに分離する必要があります。もちろん、他の種類のテストから分離する必要があります。
独立性とは、次のことを意味します。
単体テストは、特別な「セットアップ」機能と「ティアダウン」機能を除いて、互いに依存 (明示的な独立性) すべきではありませんが、これも議論の対象です。
特に、単体テストは順序に依存しない (暗黙の独立性) 必要があります。結果は、以前に実行された単体テストに依存してはなりません。これは些細なことのように思えますが、そうではありません。初期化やランタイムの開始を避けることができないテストがあります。共有 (クラスなど) 変数が 1 つだけで、SUT が以前に開始されていた場合は、異なる反応を示す可能性があります。オペレーティング システムに外部から呼び出しを行いますか? 最初にいくつかの dll がロードされますか? 少なくとも OS レベルでは、すでに潜在的な依存関係があります。エラーを発見しないために、マイナーな場合もあれば、不可欠な場合もあります。テストの最適な独立性を実現するために、クリーンアップ コードを追加する必要がある場合があります。
単体テストは、ランタイム環境から可能な限り独立し、特定のテスト環境や設定に依存しないようにする必要があります。これも一部「反復可能」に属します。以前に 20 のユーザー ダイアログに入力する必要はありません。サーバーを起動する必要はありません。データベースを利用可能にする必要はありません。別のコンポーネントは必要ありません。ネットワークは必要ありません。これを達成するために、多くの場合、テスト ダブルが使用されます (スタブ、モック、フェイク、ダミー、スパイなど)。
( Gerard Meszaros の古典的な作品: xUnit パターン。ここでは「テスト ダブル」という名前を作り、さまざまな種類の を定義しています)
(テストダブルズーの簡単な説明)
( Martin Fowler 2007 に従って、スタブ、モックなどについて考えます。クラシック)
- 単体テストが SUT から完全に独立していることはありませんが、理想的には、現在の実装から可能な限り独立し、テスト対象の関数またはクラス (SUT) のパブリック インターフェイスのみに依存する必要があります。
結論: この解釈では、「分離」という言葉は物理的な場所をより強調しており、これは論理的な独立性をある程度意味することがよくあります (例: クラス レベルの分離)。
より多くのアクセントや意味が主張されている可能性があるため、完全ではありません。
こちらのコメントも参照してください。
しかし、(優れた) 単体テストにはさらに多くの特性があります。Roy Osherove は、彼の著書「The art of unit testing」で、私が FIIRST 原則 (彼の本のサイトへのリンク) で正確に見つけられないいくつかの属性を発見しました。ここに私自身の言葉 (および頭字語) を付けて引用します。
SUTの完全な制御: 単体テストは SUT を完全に制御する必要があります。これは、テストおよびランタイム環境から独立していることと実質的に同一であることがわかります (たとえば、モックの使用など)。しかし、独立性は非常に曖昧であるため、別の手紙を使うことは理にかなっています.
自動化された(再現性とセルフチェックに関連していますが、同じではありません)まったく同じです)。これには、テスト (ランナー) インフラストラクチャが必要です。
Sモール、シンプル、または彼の言葉で言うと、「実装が簡単」です (繰り返しますが、関連していますが、同一ではありません)。「速い」に関連することが多い
関連性: テストは明日関連性があるはずです。これは達成するのが最も難しい要件の 1 つであり、「学校」によっては、TDD 中に一時的な単体テストが必要になる場合もあります。テストがコントラクトのみをテストする場合、これは達成されますが、高いコード カバレッジ要件には不十分な場合があります。
一貫した結果: 事実上、「十分な」独立性の結果です。一貫性とは、一部の人々が「反復可能」に含めるものです。本質的な重複がありますが、同一ではありません。
自己説明: 命名、テスト全体の構造、特に重要な行としての assert の構文に関して、何がテストされ、テストが失敗した場合に何が間違っている可能性があるかを明確にする必要があります。「テストで障害を特定する」に関連して、上記を参照してください。
これらすべての具体的なポイントを考慮すると、(優れた) 単体テストを作成するのはほとんど簡単であることが、以前よりも明確になるはずです。