在这个post中,我问了一个小问题,这是一个更大问题的一部分。由于我还没有得到答复,我在这里提出我的问题:
假设JUnit按顺序执行测试用例是否合理:测试用例在下一个测试用例开始之前结束。它是否在JUnit版本之间有所不同(我的优先级是在JUnit4上)?如果没有,是否有一种简单的方法可以强制JUnit按顺序执行测试?
谢谢
答案 0 :(得分:27)
是的,默认情况下我相信它会按顺序运行测试。
JUnit 4.6引入了一个实验ParallelRunner
来并行运行测试 - 我不知道它的当前状态。我希望并行性默认仍然是“选择加入”功能。 (从其他答案来看,看起来现在这里仍然存在,但形式略有不同 - 仍然选择加入。)
答案 1 :(得分:17)
自JUnit 4.7起支持并行执行测试。但据我所知,它永远不会自动完成,你需要特别配置它,例如像这里:http://java.dzone.com/articles/running-junit-tests-parallel
但不要忘记:
良好的自动化测试应该是独立的,孤立的和可重复的,这使它们成为同时运行的理想选择。
我不知道您为什么要问,但如果不符合上述标准,您可能需要考虑您的测试设计。
答案 2 :(得分:5)
强烈而合理的猜测:是的,JUnit默认是单线程的。
否则,如果某些测试并行运行,则会因为并发问题导致代码中断或失败而无法知道测试是否失败。
答案 3 :(得分:3)
是,
还要考虑@before
和@after
,您可以使用代码恢复下次测试运行的状态。
答案 4 :(得分:1)
是。正如评论中某处所提到的,您应该仔细规划测试用例设置和拆卸(所有超类都会影响这些操作),以及测试设置和拆卸。
另外,在次要说明中,据我所知,JUnit并不保证测试用例的执行顺序(也就是说,除非它们在套件中,我猜)。这很重要,应该促使您在测试之间执行非常精确的清理和SUT状态恢复,并避免依赖于其他测试用例的结果的测试用例。你可能会说这是一种反模式:)。
答案 5 :(得分:0)
默认情况下,JUnit 使用确定性但不可预测的顺序 (MethodSorters.DEFAULT) 运行测试。
在 Junit 5 中:如果您想按顺序运行测试
@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
@Order(1)
public void firstTest() {
output.append("a");
}
@Test
@Order(2)
public void secondTest() {
output.append("b");
}
@Test
@Order(3)
public void thirdTest() {
output.append("c");
}
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "abc");
}
}
答案 6 :(得分:-5)
根据我的经验,我可以说我们可以通过命名具有Test的方法名称来序列化类中的测试。 例如:
@Test
public ..... firstTest ()
{
}
@Test
public .... thirdTest()
{
}
@Test
public....secondTest()
{
}
订单是firstTest,thirdTest,secondTest