2011-12-06 9 views
6

私は最近、彼らがTDDを使用する会社に入社したが、それは例えば、我々はテストを持って、私にとってはまだ明らかではありません。この特定のテストはなぜ有用なのでしょうか?

[TestMethod] 
public void ShouldReturnGameIsRunning() 
{ 
    var game = new Mock<IGame>(); 
    game.Setup(g => g.IsRunning).Returns(true); 
    Assert.IsTrue(game.Object.IsRunning); 
} 

それの目的は何?私が理解する限り、これは何もテストしていません!私はそれがインターフェイスを嘲笑していると言って、IsRunningのために真実を返すので、それは決して異なる値を返しません...

私はおそらく誰もが良い練習などだと言っているように、またはこのテストは間違っていますか?

+3

予想通りMOQ通常休みはこの無意味ではありません動作することを証明しています。 – sarnold

+3

この質問には2つの異なることがあります。「TDDの目的は何ですか? 「このテストのポイントは何ですか?」 - あなたの頭の中に2つの別々のものを保つように注意してください。 TDDの価値は、単一の(おそらく貧弱な)テストから公正に判断することはできません。 – Bevan

+0

私はこれをhttp://stackoverflow.com/questions/tagged/tdd?sort=votes&pagesize=50の複製としてクローズすることができます。 –

答えて

5

このテストは無効です。 Moqは、テスト中のメソッドによって使用されるオブジェクトを「模擬する」ために使用されるフレームワークです。 IsRunningをテストしていた場合は、特定の実行パスを実行させるなど、IsRunningが依存するメソッドに対して特定の実装を提供するためにMockを使用できます。

人々は、テストが最初に優れていることを一日中あなたに伝えることができます。最初にテストを書いたコードではバグが少なくて済むことに気づくでしょう。これにより、あなたとあなたの同僚の時間が節約され、おそらくコードの品質が向上します。

+0

hmm私は疑問に思っています...テストされていないIGameインターフェースの実装があります。これのアイデア... – user1082693

+0

IGameインターフェイスの別の実装を持つ意味はありません、彼らはインターフェイスの代わりに、ゲームオブジェクトをテストする必要があります、右か?どのようにコードの設計を運転するのですか?つまり、IsRunningプロパティが必要であることをどのように定義する必要がありますか? – user1082693

+0

@ user1082693:そうです。今度は 'IGame'のメソッドの戻り値に基づいてメソッドの動作をテストしていた場合、Moqは確実に便利になります。テスト目的のためだけに' IGame'の全く新しいサブクラスを作成するのは苦労でしょう。特定のプロパティをテストする場合、私はインターフェイスや抽象クラスのようなコード構造にこれらのルールを適用させます。 –

3

テストが良い練習であるコードの前に書かれている可能性があります。

これはツールで作成された無意味なテストであるともいえます。

+0

ここにテストを作成するツールはないと思うので、コードの前にテストを書いたのでしょう。hmmm – user1082693

+6

「ツール」の定義に依存します! :) – griegs

+3

+1私たちはどちらかといえば、 "tool"という言葉の一般的な意味を意味することができます; –

6

このテストではインターフェイスを抜粋し、インターフェイスがIsRunningというブールゲッターを公開していることを確認しています。

このテストは、interfaceが存在する前に書かれている可能性があり、おそらくIGameの具体的なクラスのいずれかが存在する前に書かれている可能性があります。プロジェクトが成熟していれば、実際の実装を行い、そのレベルの動作を検証する他のテストがあり、おそらく理論的な形をスタブするのではなく、より伝統的な分離主義的なコンテキストでモックを使用すると思います。

これらの種類のテストの価値は、形状やオブジェクトがどのように使用されるかを考えるように強制することです。 「ゲームがまだ何をしようとしているのか正確にはわかりませんが、実行中かどうかを確認したいと思っています...」という行に沿ったものです。このテストスタイルは、設計の決定を促し、動作を検証するためのものです。

私の意見では、地球上で最も貴重なテストではありませんが、その目的を果たしています。

編集:私はこれを入力していた昨晩電車に乗っていましたが、答えに直接Andrew Whitakerのコメントを書いたかったのです。

インタフェース自体のシグネチャが、希望する契約の実施に十分であると主張できます。ただし、これは実際にインターフェイスをどのように扱うか、最終的にテストしようとしているシステムの検証方法によって異なります。

明示的にこの機能をテストとして示す際には、具体的な値が存在する可能性があります。これがIGameの望ましい機能であることを明示的に確認しています。

あなたはIsRunningのパブリックゲッターを公開したいと思うことをデザイナーが知っているので、インターフェースに追加することができます。しかし、別の開発者がこれを取得してプロパティを見ることはできますが、コード内の他の場所でその用途を見ることはできません。削除の対象となるかもしれません(通常は良いことです)害を与えずに。しかしながら、この試験の存在は、この正当性が存在すべきであることを明示している。

このテストがなければ、開発者はインタフェースを変更して実装を破棄することができ、プロジェクトはまだコンパイルされ、一見正しく実行されます。そして、後で誰かがインタフェースが変更されたことに気付くはずです。

このテストでは、誰もそれを使用していないかのように見えても、テストスイートは失敗します。テストの自己文書化の性質は、IGameが実際にIsRunningゲッターを公開する必要がある場合、少なくとも会話を生成するはずのShouldReturnGameIsRunning()を示しています。

+1

クール私はそれを得る...私は明日彼らに尋ねるので、それはおそらくデザインを駆動する必要があります、そして、私はロジックをテストするために、より多くのテストを作成する必要がありますよね? – user1082693

+0

@ 32bitkid:これは私の意見かもしれませんが、これはテストの過労ではありませんか?インターフェイスのメソッドのシグネチャを単に定義するだけでは、このテストでテストされている「契約」を作成できませんか? –

+1

@AndrewWhitaker。私はそれがあなたがテストしようとしているシステムのバリデーションについてのあなたの考え方にかかっていると思います。これが明示的に、これが 'IGame'のための望ましい機能であるというテストとして何らかの価値があるかもしれません。それが署名のみであれば、どこでも使用できれば、害なく取り除くことができるように見えるかもしれません。このテストは、この正当性が存在すべきであることを明示していますそうでない場合でも、誰もそれを使用していないとしても、テストは "無効"または "役に立たない"と書く簡単なルートを取るのではなく、非常に洞察力のある答えのために、 –

1

もう一つの可能​​性は、当時、その特定の模擬フレームワークの使い方を理解していなかった誰かによってコードが書かれたことと、学習するための1つ以上の簡単なテストを書いたことです。ケント・ベックは、元のTDDブックでこの種の「学習テスト」について話しました。

0

このテストには過去に問題があった可能性があります。具体的なクラスをテストしていた可能性があります。抽象クラスをテストしていた可能性があります。テストする抽象クラスを模擬するのが時々意味があるためです。私は、TDDのやり方のフォロワーが、このような小さな混乱をどのように残していたのかを知ることができます。デッドコードとデッドテストコードのクリーンアップは、実際には赤、緑、リファクタの自然なワークフローには適合しません(テストを壊さないためです)。 しかし、歴史は読者を混乱させるだけのテストの正当性ではありません。だから、良いboyscoutとそれを削除してください。私の正直なoppinionで

0

これは単なるゴミですが、それだけで

関連する問題