是否可以生成测试并运行它们?
我有例如我想检查的URL列表是否指向404页面和其他一些测试。我不想为每个链接创建一个单独的测试。那将是很多工作。
如果不可能,是否可以从测试指向另一个测试,如果另一个测试失败,那么第一个测试是否会继续?
对于我的测试,我使用Groovy和Gebish,Gradle和JUnit4。
答案 0 :(得分:1)
我认为您正在寻找的是parameterized测试,而不是生成的测试。如果我理解正确,您希望针对许多不同的事情运行相同的测试。
在参数化测试中,您可以通过声明一个返回数据的静态方法,然后告诉JUnit使用Parameterized
运行器来运行测试。然后使用参数作为测试数据实例化每个测试类,测试方法可以访问该测试数据。
@RunWith(Parameterized.class)
public class FibonacciTest {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
});
}
private int fInput;
private int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
另一种方法是theories。根据理论,您将测试数据嵌入到测试类中,作为使用@Datapoint
注释的不同静态字段,并为每个数据点重复调用每个测试方法,并将特定数据点作为参数传递。再一次,你有一个特殊的跑步者来实现它......
@RunWith(Theories.class)
public class UserTest {
@DataPoint
public static String GOOD_USERNAME = "optimus";
@DataPoint
public static String USERNAME_WITH_SLASH = "optimus/prime";
@Theory
public void filenameIncludesUsername(String username) {
assumeThat(username, not(containsString("/")));
assertThat(new User(username).configFileName(), containsString(username));
}
}