web-dev-qa-db-ja.com

jUnitによるデータ駆動型テスト

JUnitでデータ駆動型テストを作成するには何を使用しますか?

(私の定義)データ駆動型テストは、外部ソース(ファイル、データベースなど)からデータを読み取り、行/ファイル/その他ごとに1つのテストを実行し、テストランナーに結果を表示するテストです。個別のテストがありました-各実行の結果は、1つの大きな集合体ではなく、個別に表示されます。

29
ripper234

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

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

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

39
matt

これは、@ DataSourceを備えたTestNGが優れている点です。それが私がJUnitよりも好む理由の1つです。その他は、依存関係と並列スレッドテストです。

9
duffymo

hsqldb などのインメモリデータベースを使用して、データベースに「プロダクションスタイル」のデータセットを事前に入力するか、空のhsqldbデータベースから開始してデータを入力できます。テストを実行するために必要な行。その上で、 JUnit および Mockito を使用してテストを記述します。

8
digiarnie

dbUnitjMock 、jUnit 4の組み合わせを使用します。その後、スイートまたは個別に実行できます。

4
Bostone

あなたのニーズに合った "DataDrivenTestCase"でTestCaseを拡張したほうがいいです。これが実際の例です: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

パラメータ化されたテストとは異なり、わかりやすい名前のテストケースが可能です。

3
Mathieu

私は@ DroidIn.netと一緒にいますが、それはまさに私がやっていることですが、質問に文字通り「そして、別のテストがあるかのようにテストランナーに結果を表示する」には、JUnit4パラメーター化ランナーを見る必要があります。 DBUnitはそれを行いません。これをたくさん行う必要がある場合、正直なところ、TestNGはより柔軟ですが、JUnitで完全に実行できます。

JUnit理論のランナーも見ることができますが、私の思い出は、データドリブンデータセットには適さないということです。JUnitは大量の外部データを扱うことを目的としていないため、これはある種の意味があります。

1
Yishai

これはかなり古いトピックですが、私は自分のシェアを貢献することを考えました。 JUnitによるデータ駆動型テストのサポートは、あまりにも親しみが少ないと感じています。たとえば。パラメータ化を使用するには、コンストラクタを作成する必要があります。 Theories runnerでは、テストメソッドに渡される一連のテストデータを制御できません。

このブログ投稿シリーズで特定されているように、さらに欠点があります: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

現在、JUnitから拡張されたフレームワークであり、ユーザーに多くの機能を提供することを目的としたEasyTestの形で、包括的なソリューションが提供されています。その主な焦点は、JUnitを使用してデータ駆動型テストを実行することですが、JUnitに実際に依存する必要はありません。これが参照用のgithubプロジェクトです: https://github.com/anujgandharv/easytest

誰かが自分の考え/コード/提案を提供することに興味があるなら、今がその時です。単純にgithubリポジトリに移動して問題を作成できます。

1
Anuj

一部のテストは、インターフェイス駆動型に適しています。

データベース/ファイルの読み取りがインターフェース呼び出しによって取得される場合、インターフェースを実装するためのユニットテストを取得するだけで、ユニットテストクラスは必要なデータを返すことができます。

0
Fortyrunner

現在、ID番号を含むpropsファイルがあります。これはひどくもろいですが、何かを始めるのは簡単です。私たちの計画は、最初にこれらのID番号をantビルドの-Dプロパティでオーバーライドできるようにすることです。

私たちの環境では、実行前に(たとえばdbUnitによって)ロードできない、ひどく絡み合ったデータを持つレガシーDBを使用しています。最終的に、単体テストがDBにクエリを実行してテスト対象のプロパティを持つIDを検索し、そのIDを単体テストで使用する場所に到達したいと考えています。遅くなり、より適切には「単体テスト」ではなく統合テストと呼ばれますが、アプリがテストデータに対して完全に実行されても実際のデータで失敗する状況を回避するために、実際のデータに対してテストします。

0
Ed Griebel

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

0
monksy