如何使 JUnit 测试用例按顺序运行?

Posted

技术标签:

【中文标题】如何使 JUnit 测试用例按顺序运行?【英文标题】:How to make JUnit test cases to run in sequential order? 【发布时间】:2012-03-28 21:42:02 【问题描述】:

我正在使用 JUnit4。

我在一个测试用例中有一套测试方法。

每个测试方法插入一些记录并验证一个测试结果,最后删除插入的记录。

由于 JUnit 并行运行,测试方法会因为某些原因而失败 以前的测试方法执行期间存在的记录。这 只发生在我同事的机器上(Windows 7),不在我的机器上(Cent 操作系统 6)。

我们需要的是测试方法必须在我们所有的机器中通过。

我已尝试清除 Setup() 方法中的记录,但它再次仅适用于我的机器。 JUnit 中是否有任何选项可以使测试方法以统一的顺序运行?

谢谢,

【问题讨论】:

【参考方案1】:

JUnit 4.11 现在支持使用@FixMethodOrder 注解指定执行顺序。

【讨论】:

【参考方案2】:

MethodSorters 是 Junit 4.6 发布后引入的一个新类。这个类声明了三种执行顺序,可以在你的测试用例执行时使用。

    NAME_ASCENDING(MethodSorters.NAME_ASCENDING) - 对测试方法进行排序 按方法名称,按字典顺序排列。

    JVM(null) - 按照返回的顺序保留测试方法 JVM。请注意,来自 JVM 的顺序因运行而异。

    DEFAULT(MethodSorter.DEFAULT) - 对测试方法进行排序 确定性但不可预测的顺序。

.

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

//Running test cases in order of method names in ascending order

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution 

    @Test
    public void secondTest() 
        System.out.println("Executing second test");
    

    @Test
    public void firstTest() 
        System.out.println("Executing first test");
    

    @Test
    public void thirdTest() 
        System.out.println("Executing third test");
    

输出:

Executing first test
Executing second test
Executing third test

参考:http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

【讨论】:

现在(2020年),我发现了另一个分配方法顺序的功能,我不知道这个功能是什么时候引入的。它使用@Order(此处为正数)来分配序数。 baeldung.com/…. @DanielYang 那是针对 JUnit 5,但问题是针对 JUnit 4。【参考方案3】:

即使您有数据层,并行运行测试也没有问题。但是您需要进行额外的工作来为您的数据创建 MOCK UP,这样它就不会影响数据库。您可以使用不同的模型框架,例如 Mockito、EasyMock 和 Arquillian。

【讨论】:

【参考方案4】:

因为您正在并行运行测试,并且您正在访问数据库,所以您很可能会遇到问题,因为对于每个测试,数据库不一定处于一致状态。

解决方案:不要并行运行测试。默认情况下,JUnit 不会并行运行测试,因此您要么在 maven 中设置选项,要么在 JUnit 中使用并行运行器之一。

如果您在 Windows 上的测试失败但在 Cent OS 上的测试之间仍然存在问题,那么这可能是运行顺序的问题,您需要修复它。请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional? 的回复。

解决这个问题的方法(至少在 JUnit 术语中)是删除测试之间的依赖关系。基本上,JUnit 不支持排序,测试应该能够以任何顺序运行。

如果你真的需要在测试之间建立依赖关系,请使用 TestNG,你可以在其中建立依赖关系。

【讨论】:

【参考方案5】:

JUnit 不保证测试的顺序。

这样做的原因是单元测试应该是原子的 - 所有的设置都应该发生在 setup / tear down 方法中,而不是其他测试。

考虑将插入数据的代码移动到另一个辅助类中,该辅助类可以被插入的测试和需要验证的类调用,并在 @Before 方法中调用该类。

如果可以的话,您还应该考虑使用模拟解决方案(例如 Mockito),而不是直接访问数据库 - 模拟将大大有助于确保您的测试良好且独立,并且作为一个很好的附带好处,通常帮助指出您可以在哪里使用一些重构。

【讨论】:

谢谢你的回答,我去看看。 你也可以使用 DBUnit 之类的东西来控制你的数据库设置和拆卸,但是对于纯单元测试,Mockito 更有意义,因为它允许测试完全独立。

以上是关于如何使 JUnit 测试用例按顺序运行?的主要内容,如果未能解决你的问题,请参考以下文章

pytest中的测试用例执行顺序

在Maven项目中运行JUnit 5测试用例

测试用例执行规范

如何从命令行运行 JUnit 测试用例

如何将循环运行的测试用例添加到通过 SOAPUI 生成的 Junit 报告中

selenium测试用例的执行顺序