2011-01-23 7 views
2

私はTDDを初めて使用していて、どこから始めるべきか不思議でした。私は思ったほど多くのことを読んだことがあります。私は思っているほど私は思うように投げつけずに、何をテストするのか、テストしないのか、まだ混乱しています。たとえば、私は読んで、データベースに対してテストを実行すべきではないことを知っているので、嘲笑の枠組みに入っています。我々は偽のデータを返すように私たちのリポジトリを模倣します。私の質問は、データ定数の要件をテストすることですか?例えば、要件が述べることができる、人は常にこのように、名前を持っている必要があります。TDDとテストデータ

Assert.IsNotNull(personObject.Name); 

は常に真でなければ、どのように私が持っている「偽」のデータなしでそれをテストするのですか?そのタイプの要件をテストするのに気が付いていますか?

+2

ユニットテストではなく、データベースに対してテストする必要があります。 – coreyward

+0

適切な単体テストであるかどうか分からないでください。通常の単体テストとともにデータベースをテストしないという実用的な理由は、スピードです。私はあなたが本物のものをテストすることをお勧めします。はい、テストは遅くなりますが、小規模なプロジェクトではそれほど難しくありません。一方、リリース前の日には、虚偽のインターフェイスを実装することを忘れてしまったという厄介な驚きは得られません。 –

答えて

4

あなたの要件は「人は常に名前を持つべきです」としましょう。どこから始めることができますか?

まず、明確にする必要があります。私は、あなたが「いつも名前を持つべきです」と言うとき、あなたは名前として「空でない文字列を持つべきではない」ということを意味すると信じています。

私たちが実際に意味することは、「人がデータベースに格納されているときにその名前をnullまたは空にすることはできません」ということです。攻撃の第1の行は、データベースに制約を加えてそれを強制することです。ただし、その制約を取り除く悪質なDBAからあなたを守るものはありません。したがって、システムについて真であると思うものをテストし、変更があった場合には失敗したテストによってフラグが立てられます。この目的のために、 "私のアプリがヌル名を持つPersonをDBに保存すると、DBが悲惨に失敗する"のようなテストを書くでしょう。これは単体テストではなく、より統合的なテストであり、古い古い単体テストよりも書く方が複雑です。

ただし、これは依然として制約を削除し、ヌル名を持つレコードを直接作成する不正なDBAのシナリオをカバーしていません。言い換えれば、あなたのアプリは正しいデータに戻ってくることを信じることができないので、あなたのドメインはヌルネームの人の可能性にどのように対処したいのですか?

非常にリテラルなアプローチは、Personがnull以外のNameでのみ構築できることを強制することができ、それ以外の場合はスローします。それは単体テストと実施を容易にするでしょうが、恐らく開発が苦痛になるでしょう。より快適なアプローチは、Personに制約を設けることではなく、壊れたルールに対してPersonを検証できるValidatorクラスです。これは、あなたがPerson(比喩的)に望む何かを行うことができ、そのPersonが依然として有効な状態にあるかどうかを検証できるので、より美味です。

これは非常に簡単にテスト可能である)

1の利点があります、このようなバリデータのためのユニットテストを作成することは、

2ケーキの一部である)不正なDBAの問題に対処する:あなたが検証できるようになりましたバリデーターを適用することによって、アプリの外部に出入りするものすべて

私は怠惰な開発者であり、これは私が始めるところです。データに関係するものよりもテストがはるかに簡単ですが、問題に対処するため、バリデーターに行ってください。言い換えれば、私は単体テスト(つまり、完全にメモリ)を可能な限り保有し、コード/ドメインでビジネスロジックをできるだけ多く保持する傾向があります。テストしやすくなりました。

0

受け入れテストまたは統合テストを使用して、データベースと制約をカバーすることができます。

たとえば、1つのプロジェクトでは、NHibernateバインディングをチェックしたばかりのテストで、別の「統合」パッケージがありました。 NHibernateを使用していない場合は、リポジトリでこれを行い、データベース接続を維持してください。このレベルから制約、参照整合性などを検証できます。

あなたはまだTDDの他の側面に関するガイダンスを探しているなら、開始する、Dan North's post on BDDを試してみてください。

「私はプログラマは、開始する場所を知りたいと思ったものをテストするために、何ではない...問題を抱えていましたテストする方法、一度にどれだけテストするか、テストと呼ぶもの、そしてテストが失敗する理由を理解する方法」を参照してください。