2010-11-28 12 views
7

TDDを使用してビルドしたいクラスですが、失敗しました。それはSubMissionsと呼ばれる非常に基本的なクラスですが、SQLデータベースからいくつかのデータをフェッチするだけです。私のクラスで動作しないテスト駆動型開発

だから、私はTDDを使用して、それを構築しようとした。..

getSubMissionForPage()getSubMissionFromId()などのようなメソッドを持っています。私の最初のテストにはgetSubMissionPage()への呼び出しが含まれていましたが、これはデータを返すことだけです。だから、このテストを失敗させることは、どんなデータも返すことができるので、難しいです。失敗する方法を考え出すことができませんでした。

あなたのテストを失敗させることは、何を実装するかを知るための最初のステップだと知っていますが、実際にテストに失敗する方法がないときはどうしますか?

+1

これらの状況では、データベースに予期した特定のデータが返される可能性があります。おおよそ正しいデータが得られていることを確認するために、その行のIDや行数などを確認することができます – obfuscation

答えて

8

外部データソースに依存している場合は、いつでもテストは失敗する可能性があります。接続がDBに落とされた場合はどうなりますか?データを取得しようとしているテーブルが存在しない場合はどうなりますか?戻ってきたデータが期待したデータでない場合はどうなりますか?

DBに接続するテストクラスは、mock the DBに何らかの方法が必要であるため、HelloWorld.javaをテストするより少し難解です。 Mock Objects hereについて詳しく知ることができます。

簡単な答え、あなたのテスト/ソフトウェアは、いつも失敗する可能性があります。あなたのテストが失敗すると思わないなら、あなたは問題の空間について十分に考えているわけではありません。

+0

+1は短い答えです。 –

+0

はい、テストは常に失敗する可能性がありますが、TDDを実行している最中にテストを失敗させる方法についての質問には答えません。 –

2

テストするいくつかの標準的なタイプのものがあります。データが本当に何かである場合、何かが有効です。

データベースをテストすることは、おそらくTDDに潜入する最良の方法ではありません。依存関係のないクラスから始めましょう。チェスのゲームを想像してみて、好きなクラスを持っているかもしれません:私は以来、場所を開始すると

  • スクエア
  • 場所(行、ボード上の正方形のCOL)

依存関係はありません。Squareは位置に依存しているため、SquareはSquareにのみ依存しているため、Boardに依存します。

3

TDDの美しさは、テストを書くのが難しい場合、設計上の潜在的な問題を指摘しています。この場合、データアクセスロジックの抽象化。

たとえば、依存関係注入を使用して、ロジックテストからデータアクセステストを分離できるようにするデータアクセスリポジトリ(テストケースの擬似または模擬テストを使用)にインターフェイスで送信できます。つまり、データアクセスを処理するSubmissionRepositoryを構築し、サブミッションクラスはビジネスロジックを処理し、基本的なcrudおよびshaping操作のためにリポジトリに移動します。

当然ながら、ある時点では、統合テストの一部としてデータアクセスをテストする必要がありますが、より分離された設計を推進するためにTDDから始める演習を常に使用します。

+0

例として、IDを指定して偽のレコードを返す偽のリポジトリを作成するか、最初の2つの関数をテストし、リポジトリが無効なIDなどを処理する方法などを考慮することができます。 –

+0

+1の依存関係注入。それは確かにtdd –

+0

+1と繋がって、外部リソースを偽装したり偽造したりします。 – JeffH

0

1つのメソッドごとにテストを書く必要はありません。テストが簡単すぎて壊れないと思うなら、テストを書くことはできません。あなたはまだテストを書くべきだと主張する人もいますが、必要がないケースがあると思います。

このJUnitのよくある質問を見てみましょう:http://junit.sourceforge.net/doc/faq/faq.htm#best_3

0
  1. を任意の実行時例外をスローし、そのテストが失敗した見るためにあなたのクラスを変更します。
  2. は例外を期待するテストをmofifyし、そのテストが失敗した参照

(1)及び(2)あなたはテストが動作していることを確認するために役立つはずであるだけで練習しました。

次に、テストに失敗した原因は何でしょうか。ここで 3.一貫性のないデータ

は、これらの理由をシミュレートする方法があり 1.接続なし2. DBへの間違ったDBスキーマ: 1.あなたのDBをシャットダウンし、私は次のようにあなたのケースで理由のリストが見えると思います接続に使用している資格証明/ jdbc URLを変更してください。 2.興味のあるテーブルを削除するか、列の名前を変更します。 3.データに一貫性を持たせるのは少し難しいです。これは、通常、DB制約が正しく定義されていない場合に発生します。スキーマをより一般的にするために、人々がそれを行うことがあります。あなたの場合ではない場合は#3を忘れてください。

TDDで幸運を祈る! 今後、テストシナリオはより洗練されたものになると思います。

1

「getSubMissionPage」は特定のデータを返すだけではありません。特定のリクエストを行い、そのリクエストに基づいてアッシングを返すことになっています。

モックデータソースを使用し、クラスがそれの要求を行い、データをオブジェクトに正しくマッピングすることをテストするには、「SubMissions」を設定する必要があります。

+0

あなたはそうです、実際に特定のキーを持つMapデータ型の戻り値を返します。実際にそれらのキーが存在することを保証するテストケースが良いでしょうか? –

+0

はヌルを戻すことから始まります。次に、必要なキーがマップに存在することを確認します。 –

3

テストが失敗するようにするには、RuntimeExceptionをスローします。 Eclipseはメソッドスタブを適切なUnsupportedOperationExceptionで埋めます。

テストを緑色にするには、スローする代わりにnullを返すだけです。

追加のテストまたは2回強制するまで、データベースに接続するのはまったく気にしないでください。

+0

'throw new RuntimeException(" fail ");'通常はうまくいくでしょう。 –

+0

+1私は通常 'throw new UnsupportedOperationException();'を使います。この答えには絶対に同意してください。 –

+0

+1とUnsupportedOperationException()に対する別の投票。テストを失敗させることができない場合は、既にコードを実装しているからです。テストを受けたら、それをしてください。あなたのクラスは、単にSQLデータを取得するだけではなく、データベース接続を作成し、クエリをまとめて実行しています。あなたはそれらのいくつかを委任し、それらを嘲笑することができます。 – Lunivore

5

データベースからの取得は、TDDから開始する場所ではありません。

ネット上のTDDの例を見るとよいでしょう。 Bob Martinのbowling game scoringは楽しい場所です。言われていること

...

私の最初のテストは唯一の目的は、データを返すことですgetSubMissionPage()の呼び出しを含んでいました。だから、このテストを失敗させることは、どんなデータも返すことができるので、難しいです。失敗する方法を考え出すことができませんでした。

目的はデータを返すのではなく、正しいデータを返すことです。

これをテストする方法は、特定の結果を返すようにするデータベースを提供することです。もちろん、正しいコードを書くまではそうはなりません。したがって、テストが失敗したのを見てから、まずテストを書いてください。

データベースに関連するTDDの難しい部分は、実際のデータベースを使ったテストが遅くなることがあり、テストではデータが変更されることがあるため、テストを繰り返し行うことが難しい場合があります。これらの問題に対処するには、DbUnitなどのツールの助けを借りて、JDBCを模擬し、メモリ内のデータベースを使用し、テストが永続的な変更を行わないようにロールバックを使用することができます。

しかし、あなたはデータベースのものから始めるのが最良です。

関連する問題