単体テストの使用方法


11

前に何度も質問がありましたが、特定の傾斜twds mvc開発がありました。

私は非常にいい子で、対応する単体テストですべてのコントローラーアクションをコーディングしてきました。正直に言うと、私は実際に初期のユニットテストのほとんどの骨を書くために小さなT4テンプレートを作成し、使用法に応じて適切に調整しました。パーシャルビューを含むビューでテストを処理する方法がよくわからないことは認めますが、それは別の質問の話です。

今、私が判断するのが難しい部分は、サービスレイヤーでカバレッジをどれだけ深くするかです。その理由は、私のサービスメソッドのいくつかは(良くも悪くも)実際にさまざまなlinqクエリを実行し、メソッド内の後続のロジックに個別の情報を提供するためです。私はこれらのメソッドを分解して、各linqステートメントに必要なロジックのみを呼び出し、メソッド内でそれらを適用できることを知っています。ただし、多くの場合、linqの「関数」の再利用は一切行われないため、これによりコードのレベルが過度にリファクタリングされると考えられます。

私が求めているのは、メソッド内で複雑なロジックが発生している場合、必要な結果および/または予想されるエラーを単にアサートするテストメソッドがあるか、すべてのロジックラインもシミュレートしてテストする必要があるということです。私が見ている方法、テストを正しく行うために、メソッドロジック(行ごと)も何らかの種類のカバレッジを取得する必要があります。しかし、それは(私の素朴な意見では)テストと実装されたメソッドをテスト自体にコテージ業界を作成するように密接に整列させようとする(私は彼らがそうであるべきだと知っています)ことを試みる終わりのないサイクルにつながる可能性があります。

私の質問は、これを簡単なこととは思わないTDD信者の一部を怒らせるかもしれません。TDDキャンプにいないので、これは私にとって「はい」ので、問題です。

ところで-アイデアのためにこれをチェックアウトしていました:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

今着実にdownvotesにfwdを探しています:)

[編集] -シングルの利益のために(今のところシングル!!)「近い」投票者。この質問は主観的なものではありません。私は非常に焦点を絞った主題に関するコンセンサスを探しています。私は否定的な情熱をかき立てようとはしていません。テクノロジーの欠陥を公開しようとは思っていません。私は大ファンです。したがって、曖昧さや誤報がある場合に質問を再構築するのに役立つ可能性があるため、閉会に投票する場合、私の利益のために丁寧なコメントをドロップしてください。この質問は、mvc人口の大部分に利益をもたらす可能性があります。

ありがとうございました!!

ジム


終了する(最初の)投票は私のものですが、「主観的で議論的な」(これはそうではありません)ではなく、「programmers.stackexchange.comに移行する」として、これは単一の特定のプログラミングの質問ではないためです明確な答え。

aakashm、感謝し、理解しました。掘り出し物ではなく、知りたかっただけです:)
ジム

回答:


4

まず第一に、あなたが話していることはTDDのようには聞こえません。TDDは、Test-> Code-> Refactorのパターンに従うことにより、システムの設計を推進することに関するテストファーストアプローチを意味します 。おそらくあなたの最初の問題はテストの目的でしょうか、あなたはコードを書くときにそれらを書いていますか?もしそうなら、私はあなたのテスト内のほとんどすべてのロジックが何らかのユニットテストに関連していることを期待するでしょう。したがって、高いコードカバレッジは、TDDを適用した間接的な結果です。

TDDを行っているときは、書きたいコードを動機付けるのに十分なテストコードを書きます。また、テスト最初に失敗することを確認します。基本的に、この方法で何が必要かを自問してください。次に、コーディングしますが、テストに合格するのに十分です。探しているものでない場合は、追加のテストを作成し、メソッドをリファクタリングします。

事実後のコードカバレッジはTDDの順守を測定する効果的な方法ではありませんが、通常、TDDを使用して記述されたコードのコードカバレッジは非常に高く、すべてのコードが何らかのテストによって動機付けられている必要があります。

TDDテストは、デザインとドキュメントを推進し、デザインを他の人にわかりやすい言葉で説明するのに役立ちます(そのため、テストに名前を付ける方法は非常に重要です)。

しかし、このとりとめのないことはあなたの質問に直接答えることはありませんので、サービス(非UI)コードのコードカバレッジをかなり高くする必要があります。最初に書かれた;-)。事実は(多くの人は意見が異なるかもしれませんが)一般に、テストが多いほど良いということです。多くの高品質のオープンソースプロジェクトには、実行中のコードよりもはるかに多くのテストコードがあります。

さらに、次の場合はいつでもテストを作成する必要があります。

  1. 新しいコードを書いているので、テストで設計を進めて文書化し、コードが何をすべきかについての仮定を説明する必要があります。コーディングする前に作成する必要があります。

  2. あなたはバグを見つけました。失敗したテストはバグを実証するはずです。バグが修正されると、テストに合格するはずです。

  3. メソッドまたはクラスの動作の性質を変更する方法でコードを変更します(ただし、コードの1つの領域が変更されたときに多くのテストが失敗した場合、これは脆弱なテストを示します)。これにより、テストはコードを正しく文書化します。

個人的には、TDDの学習は興味深い課題であり、TDDの良い「直感」を開発するには時間がかかることがわかりました。練習、練習、練習は私にとって学ぶための最良の方法です。それと、オープンソースプロジェクトからのテストコードの読み取り、そして現在、私の変更を加えた新しいテストの作成中にそれらに貢献しています。


クリス+1-私はあなたのジブのカットが好きです:-)、しかしもっと重要なことは、ユニットテストとTDDの分離を指摘します(区別を理解しました)。私はややハイブリッドモデルです(イケ!!)
ジム

ええ、おそらくあなたが慣れ親しんでいるものだと思いましたが、それでも言及する価値があります。また、私たちは皆、おそらくある程度ハイブリッドモデルを持っていると思います。しかし、私は最近、もっと多くのテストを最初にやっていることに気付いています。MSpecと仕様スタイルのテストへの切り替えが役立ったと感じています。私はまだいくつかのコードを書いていますが、最初にテストするのは面倒です。
クリスニコラ

...私は恥ずかしいことにあなたの最後の文に同意してうなずいています:)
ジム

0

メソッドの戻り値のみをテストすることは、その中のすべてのブランチをテストすることよりも強力ではないことは明らかです。代替入力は正しい動作を保証されません。

一方、すべてをテストするのに十分な時間や忍耐がない場合があります。

できることは、テストでカバーするコードの量(80〜90%など)を決定し、これを検証する自動化ツールを使用してそれを実施することです。
コードの書き込みサイクルも終了しない場合にのみ、テストの書き込みの「終了しないサイクル」が発生します。


cosmin-あなたは明らかに私のコードを見ていません。トレッドミルに戻る... :
ジム

0

コードが適切に機能することをどの程度確実にしたいですか?ユニットテストは、実装が仕様どおりに行う必要があることを実装が実行しているかどうかを確認するための、プログラマーバッグの中の1つのツールです。おそらく100%をカバーする必要はありませんが、コードのより重要な部分をカバーするユニットテストを作成する必要があります。メソッドが単独でだけでなく、うまく機能することを確認することは常に良いことです。したがって、より重要な「論理行」のいくつかをカバーするテストを書くようにしてください。


0

Visual Studioでコードカバレッジをオンにした状態で単体テストを実行すると、コードがどの程度適切にカバーされているかを適切に(グラフィカルに)示すことができます。

組み込みのMSTestフレームワークを使用していない場合、サードパーティのコードカバレッジ製品を調べてNUnitを使用するか、こちらの手順に従う必要がある場合があります。https//stackoverflow.com/questions/2665799/does-vs2010-code -coverage-support-nunit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.