31

次のコードでTDD FIRSTの原則がどのように守られていないのか理解できません。

これらは、FIRST 原則に関する私のメモです。

  • Fast : テスト (のサブセット) をすばやく実行します (常にテストを実行するため)
  • 独立: 他のテストに依存しないため、任意のサブセットを任意の順序で実行できます
  • 反復可能: N 回実行して同じ結果を得る (バグを分離し、自動化を有効にするため)
  • セルフチェック: テストは合格したかどうかを自動的に検出できます (出力の人間によるチェックはありません)
  • タイムリー: テスト中のコードとほぼ同時に書かれました (TDD で、最初に書かれました!)

クイズの質問:

サリーは、毎月第 1 火曜日に自分の Web サイトに特別なレイアウトを持たせたいと考えています。次のコントローラーとテスト コードがあります。

# HomeController
 def index
   if Time.now.tuesday?
     render 'special_index'
   else
     render 'index'
   end
 end

 # HomeControllerSpec
 it "should render special template on Tuesdays" do
   get 'index'
   if Time.now.tuesday?
     response.should render_template('special_index')
   else
     response.should render_template('index')
   end
 end

守られていない最初の原則は何ですか?

  1. 速い
  2. 独立
  3. 繰り返し可能
  4. セルフチェック
  5. タイムリーな

どの FIRST 原則が守られていないのかわかりません:

  • Fast : テストに複雑な部分がないため、コードは高速に見えます。
  • Independent : テストは他のテストに依存しません。
  • Repeatable : テストは毎回同じ結果を取得します。'special_index'火曜日の場合と火曜日で'index'ない場合。
  • セルフチェック: テストは、合格したかどうかを自動的に検出できます。
  • 適時: コードとテスト コードの両方が同時にここに表示されます。

テストコードはコントローラーコードの後に​​提示されたので、クイズでタイムリーを選択しました。しかし、私は質問を間違えました。振り返ってみると、これは良い選択ではありませんでした。ここでどの FIRST 原則が守られていないのかわかりません。

4

3 に答える 3

45

火曜日が毎日ではないというわけRepeatableではありません:) このテストを月曜日に実行すると、1 つの結果が得られます。火曜日に実行すると、別の結果が得られます。

于 2013-08-02T19:33:35.000 に答える
2

FIRSTFIIRST、および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 の構文に関して、何がテストされ、テストが失敗した場合に何が間違っている可能性があるかを明確にする必要があります。「テストで障害を特定する」に関連して、上記を参照してください。

これらすべての具体的なポイントを考慮すると、(優れた) 単体テストを作成するのはほとんど簡単であることが、以前よりも明確になるはずです。

于 2017-03-30T23:17:25.177 に答える
0

独立性と再現性

日付から独立していないため、繰り返し実行できますが、技術的には同じ結果が得られます。

FIRST コンセプトに関する HomeController のテストを行う適切な方法は、評価段階の前に時間を変更することです

于 2014-11-25T07:34:39.600 に答える