web-dev-qa-db-ja.com

同じJUnitテストケースを異なるデータで複数回実行する

次のテストケースに進む前に、異なるデータで特定のテストケースを連続して複数回実行するようにJUnitに指示する方法はありますか?

74
Giridhar

junit 4.4理論 を見てください:

import org.junit.Test;
import org.junit.experimental.theories.*;
import org.junit.runner.RunWith;

@RunWith(Theories.class)
public class PrimeTest {

    @Theory
    public void isPrime(int candidate) {
          // called with candidate=1, candidate=2, etc etc  
    }

    public static @DataPoints int[] candidates = {1, 2, 3, 4, 5};
}
66
dfa

これは、パラメータ化されたテストの完璧な候補のようです。

しかし、基本的に、パラメータ化されたテストでは、異なるデータに対して同じテストセットを実行できます。

それについてのいくつかの良いブログ投稿があります:

24
jjnguy

最近、私は zohhak プロジェクトを開始しました。次のように記述できます。

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}
12
piotrek

より良い方法(複数のテストメソッドを使用できるようにする)は、JUnitをJUnitParamsで使用することです。

import junitparams.Parameters;
import org.junit.Test;

@RunWith(JUnitParamsRunner.class)
Public class TestClass() {

    @Test
    @Parameters(method = "generateTestData")
    public void test1(int value, String text, MyObject myObject) {
        ... Test Code ...
    }

    .... Other @Test methods ....

    Object[] generateTestData() {
        MyObject objectA1 = new MyObject();
        MyObject objectA2 = new MyObject();
        MyObject objectA3 = new MyObject();

        return $(
            $(400, "First test text.", objectA1),
            $(402, "Second test text.", objectA2),
            $(403, "Third test text.", objectA3)
        );
    }
}

Junitparamsプロジェクトを取得できます here

5
DavidR

これは、コード例を使用してテストを繰り返し実行するいくつかの方法を示した投稿です。

JUnitテストを繰り返し実行

@Parametrizedランナーを使用するか、投稿に含まれている特別なランナーを使用できます

3
Kreich

パラメーターに基づいてテストを実行するヘルパーメソッドを常に作成し、JUnitテストメソッドからそのメソッドを呼び出します。通常、これは単一のJUnitテストメソッドが実際に多くのテストを実行することを意味しますが、それは私にとって問題ではありませんでした。個別の呼び出しごとに1つずつ、複数のテストメソッドが必要な場合は、テストクラスを生成することをお勧めします。

テストクラスで既に@RunWithを使用している場合は、おそらく this を調べる必要があります。

2
mike rodent

カスタムランナーが不要または使用できない場合(たとえば、Robolectricランナーなどの別のランナーを既に使用している場合)、これを試すことができます DataSet Rule

1
Miklos Jakab