2009-04-15 165 views
64

在继续进行下一个测试用例之前,有没有什么方法可以告诉JUnit多次使用不同的数据运行特定的测试用例?使用不同的数据多次运行相同的JUnit测试用例

+4

通过使用理论(正如@dfa指出的那样),Junit会将所有测试视为一项测试,并且会使得更难确定哪项测试失败。 虽然参数化测试(如@ jjnguy指出的)将它们全部视为不同的测试,清楚地表明哪个测试失败。 – mindreader 2014-05-02 18:12:32

回答

63

看看到junit 4.4 theories

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}; 
} 
+0

我有几个测试用例遵循像testxyz(),testpqr()这样的格式。现有的测试类扩展了TestCase。 – Giridhar 2009-04-15 17:58:35

+0

如果我正在使用这种格式,则没有运行。 – Giridhar 2009-04-15 17:59:29

2

我总是做一个帮助器方法,根据参数执行测试,然后从JUnit测试方法调用该方法。通常这意味着单个JUnit测试方法实际上会执行大量测试,但这对我来说不是问题。如果你想要多个测试方法,每个独立调用一个,我建议生成测试类。

3

这里是一个后我写的说明与示例代码重复运行测试的几种方法:

Run a JUnit test repeatedly

您可以使用@Parametrized跑步者,或者使用后期包含的特别跑步者

9

最近我开始zohhak项目。它可以让你写:

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

如果你不想或者不能使用定制的运行(例如,你已经在使用的其他选手一样,Robolectric亚军),你可以试试这个DataSet Rule

3

一个更好的方法(可以让你有一个以上的测试方法)是使用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) 
     ); 
    } 
} 

你可以得到jun​​itparams项目here

1

如果您已经在测试课堂中使用了@RunWith,那么您可能需要查看this

相关问题