43

OK、 TDDの使用を開始することについては、すでに質問があることを知っています。しかし、一般的なコンセンサスはそれを実行することであると私は知っていると思います。しかし、ゲームに頭を入れるには次の問題があるようです。

  • コレクションを操作するとき、ジェネリックなどに基づいて、それが機能することを「知っている」場合でも、明らかな追加/削除/挿入が成功するかどうかをテストしますか?
  • 一部のテストは、実装に永遠にかかるようです。文字列出力を操作する場合など、この種のことを実行するための「より良い」方法はありますか?(たとえば、解析する前にオブジェクトモデルをテストし、解析を小さな操作に分割してそこでテストします)私の考えでは、常に「最終結果」をテストする必要がありますが、それは大きく異なり、設定が面倒です。
  • 私は使用するテストフレームワークを持っていないので(仕事は1つにお金を払わない)、もっと「練習」することができます。商用利用が無料の良いものはありますか?(現時点では、良い' olDebug.Assertを使用しています:)
  • おそらく最大の..時々私は何が起こらないと期待するのかわからない..つまり、あなたはあなたの青信号を得るが、私はいつも私がテストを逃しているかもしれないと心配している..あなたはもっと深く掘り下げてコードを作成するか、そのままにして、後ですべてが失敗するのを待ちます(これにはさらにコストがかかります)。

だから基本的に私がここで探しているのは「それをするだけ」ではなく、もっと「私はこれをした、これに問題があった、これによってそれらを解決した」..個人的な経験:)

4

11 に答える 11

50

まず、自分のコーディング スタイルで TDD を使い始めたときにフラストレーションを感じるのは当然のことです。がっかりしてやめないでください。しばらく時間を与える必要があります。これは、コードで問題を解決する方法についての私たちの考え方における大きなパラダイム シフトです。手続き型プログラミングからオブジェクト指向プログラミングに切り替えたときのように考えるのが好きです。

次に、テスト駆動開発は何よりもまず、コンポーネントが公開する API とその機能をどのように使用するかを最初に記述するテストを作成することによって、コンポーネントの設計を具体化するために使用される設計活動であると感じています。テストは、たまたま取り組んでいるタスクを満足させるのに十分な機能をカプセル化できるようになるまで、テスト対象のシステムを形作り、形成するのに役立ちます。

上記の段落を念頭に置いて、あなたの質問を見てみましょう。

  1. テスト対象のシステムでコレクションを使用している場合は、アイテムを挿入するためにコードが呼び出されたことを確認し、コレクションのカウントをアサートするように期待を設定します。内部リストで Add メソッドをテストする必要はありません。アイテムを追加するメソッドが呼び出されたときに呼び出されたことを確認するだけです。これを行うには、テスト フレームワークを使用して、モック フレームワークをミックスに追加します。
  2. 文字列を出力としてテストするのは面倒です。すべての結果を説明することはできません。テスト対象のシステムの機能に基づいて、期待するものだけをテストできます。テストは常に、テスト対象の最小の要素に分割する必要があります。つまり、多くのテストを行うことになりますが、小さくて高速で、必要なものだけをテストするだけのテストです。
  3. 選択できるオープンソースのテスト フレームワークは多数あります。どちらが良いか議論するつもりはありません。気に入ったものを見つけて使い始めましょう。
  4. 実行できることは、実行したいことを考慮してテストをセットアップすることだけです。機能にバグを導入するシナリオが発生した場合、少なくともそのシナリオをテストに追加し、テストに合格するまで機能を変更するための機能に関するテストがあります。テストを見逃した可能性のある場所を見つける 1 つの方法は、コード カバレッジを使用することです。

質問 1 の回答で、あざける用語を紹介しました。TDD の武器庫にモッキングを導入すると、テスト対象のシステムの一部ではない部分を抽象化してテストが劇的に簡単になります。モック フレームワークに関するいくつかのリソースを次に示します。

プロセスについて読む以外に、TDD を使用する際に役立つ 1 つの方法は、人々がそれを行っているのを見ることです。DNRTV で JP Boodhooのスクリーン キャストを見ることをお勧めします。これらをチェックしてください:

OK、これらは、私が紹介した用語がどのように使用されているかを理解するのに役立ちます. また、 Resharperと呼ばれる別のツールと、それが TDD プロセスを容易にする方法についても紹介します。TDD を行う場合、このツールはあまりお勧めできませんでした。プロセスを学習しているようで、他のツールを使用してすでに解決されている問題のいくつかを見つけているだけです。

プラグマティック プログラマーのテスト駆動開発に関するKent Beck の新しいシリーズを追加してこれを更新しなければ、私はコミュニティに対して不正を行っていると思います。

于 2008-08-24T17:19:30.090 に答える
6

私自身の経験から:

  1. 基盤となるフレームワークのコードではなく、独自のコードのみをテストしてください。したがって、ジェネリックリストを使用している場合は、追加、削除などをテストする必要はありません。

  2. 2はありません。あそこを見てください!サル!!!

  3. NUnitは行く方法です。

  4. すべての結果をテストすることはできません。予想されることをテストしてから、例外または無効な応答が発生すると予想されるいくつかのエッジケースをテストします。テストし忘れたことが原因でバグが発生した場合、(バグを修正する前に)最初に行うべきことは、バグが存在することを証明するためのテストを作成することです。

于 2008-08-24T10:49:10.543 に答える
2

これについての私の見解は次のとおりです。

  • フレームワークコードをテストしない場合は+1ですが、フレームワーククラスから派生したクラスをテストする必要がある場合があります。
  • 一部のクラス/メソッドのテストが面倒な場合は、設計に問題があることを強く示している可能性があります。私は「1つのクラス-1つの責任、1つの方法-1つの行動」の原則に従うようにしています。そうすれば、より小さな部分でそれを行うことにより、複雑なメソッドをはるかに簡単にテストできるようになります。
  • xUnitの場合は+1。Javaの場合は、TestNGも検討してください。
  • TDDは単一のイベントではなく、プロセスです。したがって、最初からすべてを想像しようとしないでください。ただし、コードで見つかったすべてのバグが、発見されたら実際にテストでカバーされていることを確認してください。
于 2008-08-24T11:17:45.247 に答える
2

私は、TDD で最も重要なこと (そして、実際には多少再帰的な方法での大きな成果の 1 つ) は、依存関係をうまく管理することだと思います。複雑なセットアップを必要とせずに、モジュールが分離してテストされていることを確認する必要があります。たとえば、最終的に電子メールを送信するコンポーネントをテストしている場合は、電子メールの送信者を依存関係にして、テストでモックできるようにします。これは 2 番目のポイントにつながります - モックはあなたの友達です。モック フレームワークとそれらが促進するテストのスタイル (従来の状態ベースではなく動作)、およびそれらが推奨する設計の選択 ( 「教えて、尋ねるな」の原則) に慣れてください。

于 2008-08-24T12:46:34.880 に答える
2

TDD の本質を簡単に覚えるための 3 つのインデックス カードに示されている原則が良いガイドであることがわかりました。

とにかく、あなたの質問に答えるために

  1. 自分で書いたものでない限り、動作することが「わかっている」ものをテストする必要はありません。あなたがジェネリックを書いたのではなく、Microsoft が書いたのです ;)
  2. テストのために多くのことを行う必要がある場合は、オブジェクト/メソッドもやりすぎている可能性があります。
  3. TestDriven.NETをダウンロードして、Visual Studio で単体テストをすぐに開始します (Express エディションの場合を除く)。
  4. 正しいことをテストするだけです。うまくいかない可能性のあるものすべてをテストする必要はありません。そのためには、テストが失敗するまで待つ必要があります。

真剣に、やってみろよ、おい。:)

于 2008-08-24T13:14:47.993 に答える
0

昨年、私はTDDの利点をますます確信するようになりました。その過程で私が学んだこと:1)依存性注入はあなたの友達です。プラグインアーキテクチャをアセンブルするための制御コンテナとフレームワークの反転について話しているのではなく、テスト対象のオブジェクトのコンストラクタに依存関係を渡すだけです。これにより、コードのテスト容易性に多大な利益がもたらされます。2)私は改宗者の情熱/熱意を持って出発し、モックのフレームワークをつかみ、可能な限りモックを使用することに着手しました。これは、多くの苦痛なセットアップを必要とする脆弱なテストにつながり、リファクタリングを開始するとすぐに失敗しました。正しい種類のテストダブルを使用してください。インターフェイスを尊重する必要がある偽物、テスト対象のオブジェクトにデータをフィードバックするためのスタブ、相互作用が気になる場所のみをモックします。3)テストは小さくする必要があります。各テストでテストされる1つのアサーションまたは相互作用を目指します。私はこれをやろうとします、そしてほとんど私はそこにいます。これは、テストコードの堅牢性と、後で再検討する必要がある場合のテストの複雑さに関するものです。

私がTDDで抱えていた最大の問題は、標準化団体からの仕様と、デファクトスタンダードであるその標準のサードパーティによる実装を扱うことでした。私は多くの本当に素晴らしい単体テストを仕様書にコーディングしましたが、フェンスの反対側の実装では標準がより多くの助言文書であることがわかりました。彼らはそれでかなり緩く遊んだ。これを修正する唯一の方法は、実装と単体テストでテストし、必要に応じてテストとコードをリファクタリングすることでした。本当の問題は、コードと単体テストがあればすべてが良かったという私の信念でした。そうではありません。単体テストと同時に、実際の出力を作成して機能テストを実行する必要があります。プロセス全体を通して、ユーザーや利害関係者の手に渡る小さなメリット。

于 2008-09-17T11:07:07.397 に答える
0

私はTDDの専門家ではありませんが、次のように考えています。

  • 完全に些細なこと(ゲッター/セッターなど)の場合は、何らかの理由でコードに自信がない場合を除いて、テストしないでください。
  • 非常に単純ですが、重要な方法である場合は、テストしてください。とにかく、テストはおそらく簡単に書くことができます。
  • 何が起こらないと期待するかということになると、特定の潜在的な問題がテストしているクラスの責任である場合、それが正しく処理されることをテストする必要があります。現在のクラスの責任ではない場合は、テストしないでください。

xUnitテストフレームワークは多くの場合無料で使用できるため、.Netを使用している場合は、NUnitを確認し、Javaを使用している場合はJUnitを確認してください。

于 2008-08-24T10:55:18.640 に答える
0

上記のアドバイスは良いことです。無料のフレームワークのリストが必要な場合は、ウィキペディアのxUnitフレームワークリストよりも遠くを探す必要はありません。お役に立てれば :)

于 2008-08-24T11:18:12.157 に答える
0

これに加えて、このスレッドを閲覧している人々にとって役立つかもしれないので、テストを開始する際の私の考え (このディスカッションと私自身の調査に従って) についてブログ投稿を投稿したと思います。

" TDD – テスト駆動開発の開始" - これまでに素晴らしいフィードバックをいくつか受け取りました。

これが役立つことを願っています!:)

于 2008-09-22T07:53:46.577 に答える
0

私の意見では(走行距離は異なる場合があります):

1-書いていない場合は、テストしないでください。あなたがそれを書き、それに対するテストを持っていなければ、それは存在しません。

3- 誰もが言ったように、xUnit は無料で優れています。

2 & 4 - 何をテストするかを正確に決定することは、自分自身と永遠に議論できることの 1 つです。私は、契約による設計の原則を使用して、この線を引こうとしています。詳細については、「オブジェクト指向ソフトウェアの構築」または「The Pragmatic Programmer」を参照してください。

于 2008-08-24T12:49:23.717 に答える
0

テストは短く、「アトミック」に保ちます。各テストで最小の仮定をテストします。各 TestMethod を独立させ、統合テスト用にメソッドごとに新しいデータベースを作成します。テストごとにデータを作成する必要がある場合は、"Init" メソッドを使用します。モックを使用して、テスト対象のクラスをその依存関係から分離します。

私はいつも「これがすべてのケースで機能することを証明するために書く必要があるコードの最小量はどれくらいですか?」と考えています。

于 2008-08-24T18:33:10.147 に答える