2009-11-30 16 views
29

jUnitでデータ駆動型テストを書くにはどうすればよいですか?jUnitによるデータ駆動テスト

データ駆動型テストとは、外部ソース(ファイル、データベースなど)からデータを読み取り、1行/ファイル/何であれ1回のテストを実行し、その結果をaテストランナーは別々のテストを持っているかのように - 各ランの結果は別々に表示され、1つの大きな集計では表示されません。

答えて

37

JUnit4では、Parameterizedテストランナーを使用してデータ駆動型テストを実行できます。

これはあまり詳しくは書かれていませんが、基本的な考え方は、オブジェクト配列のコレクションを返す静的メソッド(@Parametersと注釈付き)を作成することです。これらの配列はそれぞれテストクラスのコンストラクタの引数として使用され、通常のテストメソッドはコンストラクタで設定されたフィールドを使用して実行できます。

@Parametersメソッドで外部テキストファイルを読み込んで解析するコードを作成したり、別の外部ソースからデータを取得したりするコードを記述すると、テストを再コンパイルせずにこのファイルを編集して新しいテストを追加できます。

+0

私が実行したいテストを除外しようとする主なメソッドから、テストクラスに引数を渡したいとします。それをしてもいいですか? –

0

通常、データ駆動型テストでは、テスト可能な小さなコンポーネントを使用してデータを処理します。 (ファイル読み込みオブジェクト、モックオブジェクト)データベースの場合、アプリケーションのモック外のリソースは他のシステムをシミュレートするために使用されます。 (Webサービス、データベースなど)。通常、データと出力を処理する外部データファイルがあることがわかります。この方法でデータファイルをVCSに追加することができます。

4

私たちは現在、小道具はそれで私たちのID番号を持つファイル持っスイートとして、または別々

+2

Untilsは、すべて一緒に配置するための素晴らしいフレームワークです。 – dustmachine

+0

あなたはUnitils(http://www.unitils.org/)を意味しますか?面白いですね、実際、チップのおかげで! – Bostone

0

その後、あなたはそれを実行することができエーテルdbUnitjMockとJUnit 4の組み合わせを使用します。これはひどく脆いですが、何かを得るのは簡単です。私たちの計画では、最初に、これらのID番号を-Dプロパティでオーバーライドすることができます。

私たちの環境では、実行前に読み込めない(たとえばdbUnitなどの)ひどく絡み合ったデータを持つレガシーDBを使用しています。最終的には、ユニットテストでDBにクエリを実行して、テスト対象のプロパティでIDを見つけ、そのIDをユニットテストで使用する場所に移動したいと考えています。それは遅く、「ユニットテスト」ではなく、統合テストと呼ばれますが、テストデータに対して完全に実行され、実際のデータでは失敗する状況を避けるために、実際のデータに対してテストします。

8

私はhsqldbのようなメモリ内のデータベースを使用しているため、データベースを「実動スタイル」のデータセットで事前に設定することができます。空のhsqldbデータベースから開始して、私のテストを実行する必要があります。さらに、JUnitMockitoを使ってテストを書きます。

+2

この回答に投票した理由は不明です。これは確かに有効なアプローチです。 – serg10

0

いくつかのテストでは、インターフェイス駆動に適しています。

データベース/ファイルの読み込みがインターフェイス呼び出しによって取得された場合、単体テストを取得してインターフェイスを実装するだけで、単体テストクラスは任意のデータを返すことができます。

1

私は@ DroidIn.netと一緒にいるのですが、これはまさに私がやっていることです。あなたの質問に文字通り答えるために、 "別のテストをしているかのようにテストランナーに結果を表示します" JUnit4パラメータ化されたランナー。 DBUnitはそれをしません。正直なところ、TestNGの方が柔軟性がありますが、JUnitで絶対に行うことができます。

また、JUnit Theoriesのランナーも見ることができますが、私は、JUnitが大量の外部データを処理しているわけではないため、データ駆動型データセットにはあまり意味がないことを思い出しています。

9

これは、@DataSourceとともにTestNGが輝く場所です。それが私がJUnitを好む理由の1つです。その他は依存関係と並列スレッドテストです。

+0

+1これは私が書いたものです:-) – Davide

+0

7年後、私は自分の考えを変えました。私はJUnitに固執しがちです。パラメータ化されたテストが役立ちます。 – duffymo

1

これはかなり古い話題ですが、私はまだ私の分担に貢献することを考えました。 JUnitのデータ駆動型テストのサポートは、あまりにもあまりにも面倒でもないと感じています。たとえば。パラメータ化を使用するには、コンストラクタを記述する必要があります。 Theoriesランナでは、テストメソッドに渡される一連のテストデータを制御することはできません。

このブログ記事シリーズで識別されるように多くの欠点があります。http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

はAAフレームワークはJUnitの外に延長され、与えることを意味しているEasyTestの形でかなりきれいに沿って来て包括的なソリューションが用意されました多くの機能をユーザーに提供します。その主な焦点は、JUnitを使用してデータ駆動型テストを実行することですが、実際にJUnitに依存する必要はありません。 https://github.com/anujgandharv/easytest

誰でも自分の思考/コード/提案を寄稿することに興味があれば、これは時間です。単にgithubリポジトリに行き、問題を作成することができます。

2

あなたのニーズに合った "DataDrivenTestCase"を使ってTestCaseを拡張するほうがよいです。 ここでは動作例を示します。 http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

パラメータ化されたテストとは異なり、テストケースはきれいです。

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+0

@マチュー。これは熱いものです。テストフレームワークが出てきますが、これは普通の古いjunitでも安定しています。どうもありがとうございます! – Bastl

関連する問題