我想以特定的顺序执行@Test注释的测试方法。
例如:
public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}
我想确保每次运行MyTest时都在test2()之前运行test1(),但我找不到@Test(order=xx)这样的注释。
我认为这对JUnit来说是非常重要的功能,如果JUnit的作者不想要订单功能,为什么?
我想以特定的顺序执行@Test注释的测试方法。
例如:
public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}
我想确保每次运行MyTest时都在test2()之前运行test1(),但我找不到@Test(order=xx)这样的注释。
我认为这对JUnit来说是非常重要的功能,如果JUnit的作者不想要订单功能,为什么?
当前回答
下面是JUnit的一个扩展,可以生成所需的行为:https://github.com/aafuks/aaf-junit
我知道这与JUnit哲学的作者相违背,但是当在没有严格单元测试的环境中使用JUnit时(如在Java中实践的那样),这将非常有帮助。
其他回答
如果希望在JUnit 5中以特定顺序运行测试方法,可以使用下面的代码。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class MyClassTest {
@Test
@Order(1)
public void test1() {}
@Test
@Order(2)
public void test2() {}
}
如果订单很重要,你应该自己下订单。
@Test public void test1() { ... }
@Test public void test2() { test1(); ... }
特别是,如果有必要,您应该列出要测试的一些或所有可能的顺序排列。
例如,
void test1();
void test2();
void test3();
@Test
public void testOrder1() { test1(); test3(); }
@Test(expected = Exception.class)
public void testOrder2() { test2(); test3(); test1(); }
@Test(expected = NullPointerException.class)
public void testOrder3() { test3(); test1(); test2(); }
或者,所有排列的完整测试:
@Test
public void testAllOrders() {
for (Object[] sample: permute(1, 2, 3)) {
for (Object index: sample) {
switch (((Integer) index).intValue()) {
case 1: test1(); break;
case 2: test2(); break;
case 3: test3(); break;
}
}
}
}
这里,permute()是一个简单的函数,它将所有可能的排列迭代到数组的Collection中。
我最终认为我的测试没有按顺序运行,但事实是,混乱是在我的异步作业中。在使用并发性时,您还需要在测试之间执行并发性检查。 在我的例子中,作业和测试共享一个信号量,因此下一个测试挂起,直到正在运行的作业释放锁。
我知道这与这个问题并不完全相关,但也许可以帮助找到正确的问题
不确定我同意,如果我想测试“文件上传”,然后测试“文件上传插入的数据”,为什么我不希望这些是相互独立的?我认为能够分开运行它们是非常合理的,而不是在一个歌利亚测试案例中同时运行它们。
当测试用例作为一个套件运行时,您想要的是完全合理的。
不幸的是,现在没有时间给出一个完整的解决方案,但看看类:
org.junit.runners.Suite
它允许您以特定的顺序(从任何测试类)调用测试用例。
这些可能用于创建功能、集成或系统测试。
这将使您的单元测试保持原样,没有特定的顺序(推荐),无论您是否这样运行它们,然后将这些测试作为更大图景的一部分重新使用。
我们在单元测试、集成测试和系统测试中重用/继承相同的代码,有时是数据驱动的,有时是提交驱动的,有时是作为一个套件运行。