使用不同的数据多次运行相同的JUnit测试用例


77

有没有办法告诉JUnit在继续下一个测试用例之前,用不同的数据连续运行一个特定的测试用例多次?


6
通过使用理论(如@dfa指出的那样),Junit会将所有测试视为一项测试,并且将更难确定哪个测试失败了。而参数化测试(如@jjnguy所指出的)将它们全部视为不同的测试,清楚地表明哪个测试失败了。
mindreader 2014年

Answers:


66

看看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};
}

我有几个测试用例遵循testxyz(),testpqr()之类的格式。我现有的测试类扩展了TestCase。
Giridhar

1
首先,您必须将它们转换为JUnit 4(在大多数情况下,只需使用@Test批注)
dfa

简直太好用了。在这种情况下,您曾建议我使用某些注释。我如何知道关于junit的注释以及要使用的注释?
Giridhar

如果我希望它像一组不同的测试那样工作,以便可以看到哪个数据点使测试失败怎么办?(即在您的示例中,我将有4个通过测试和1个失败,而不是一个失败的测试)
Manrico Corazzi 2010年

是否可以具有相同数据类型的数据点?例如:带有int []的两个数据点
Sarath,2015年


12

最近,我开始了zohhak项目。它使您可以编写:

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

1
请注意,默认情况下,分隔符为逗号,-如果这与您的测试数据冲突,则可以通过明确指定分隔符来更改分隔符,例如@TestWith({"25 USD# 0"}, separator = "#")
Robotnik '18

7

更好的方法(允许您使用多个测试方法)是将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项目。


3

这是我写的一篇文章,其中通过代码示例展示了重复运行测试的几种方法:

反复运行JUnit测试

您可以使用@Parametrized运行器,也可以使用帖子中包含的特殊运行器


3

如果您正在使用一个@RunWith在您的测试类,你可能需要看看这个


2018年1月19日下票。请有礼貌地解释您的想法。您可能会学到一些东西。
麦克啮齿动物'18年

这是一个非常傲慢的询问方式,通常可以确保没有人回答。您最好说“我们中的一个人可能会学到一些东西”,因为您自己很可能会错过一些东西。
TiggerToo

2

我总是只创建一个基于参数执行测试的助手方法,然后从JUnit测试方法中调用该方法。通常这意味着一个JUnit测试方法实际上会执行很多测试,但这对我来说不是问题。如果您需要多种测试方法,每个不同的调用都需要一种方法,那么建议您生成测试类。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.