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

Java 如何使JUnit测试用例按顺序运行?,java,junit,operating-system,junit4,Java,Junit,Operating System,Junit4,我正在使用JUnit4 我在一个测试用例中有一套测试方法 每个测试方法都会插入一些记录并验证测试结果,最后删除插入的记录 因为JUnit是并行运行的,所以测试方法会因为某些原因而失败 在执行之前的试验方法期间存在的记录。这 仅在我的同事计算机(Windows 7)中发生,而不是在我的计算机(Cent)中发生 操作系统6) 我们需要的是测试方法必须通过我们所有的机器 我尝试过清除Setup()方法中的记录,但它同样只在我的机器上起作用。JUnit中是否有任何选项可以使测试方法以统一的顺序运行 谢谢

我正在使用JUnit4

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

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

因为JUnit是并行运行的,所以测试方法会因为某些原因而失败 在执行之前的试验方法期间存在的记录。这 仅在我的同事计算机(Windows 7)中发生,而不是在我的计算机(Cent)中发生 操作系统6)

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

我尝试过清除Setup()方法中的记录,但它同样只在我的机器上起作用。JUnit中是否有任何选项可以使测试方法以统一的顺序运行


谢谢,

JUnit中不保证测试顺序

这样做的原因是单元测试应该是原子的——所有的设置都应该在设置/拆卸方法中进行,而不是通过其他测试进行

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


你也应该考虑一个嘲弄的解决方案(eg Mockito),而不是直接击中数据库,如果你可以嘲笑,这将有很长的路要确保你的测试是好的和孤立的,并且作为一个很好的附带好处,通常有助于指出在哪里你可以使用一些重构。

因为你正在并行运行测试。当您访问数据库时,很可能会出现问题,因为数据库不一定在每次测试中都处于一致状态

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

如果在Windows而不是Cent OS上的测试失败之间仍然存在问题,那么可能是运行顺序有问题,您需要解决这个问题。看看我对你的回答

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


如果您确实需要在测试之间建立依赖关系,请使用TestNG,这样您就可以建立依赖关系。

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

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

  • 名称升序(methodsorter.NAME\u升序)对测试方法进行排序 按方法名称,按字典顺序排列

  • JVM(null)-按照 JVM。请注意,JVM my的顺序因运行而异

  • DEFAULT(MethodSorter.DEFAULT)将测试方法按 确定性但不可预测的秩序

  • 输出:

    Executing first test
    Executing second test
    Executing third test
    

    参考资料:

    即使有数据层,并行运行测试也没有问题。但是,您需要进行额外的工作来为数据创建模型,以便数据不会进入数据库。您可以使用不同的实体模型框架,如Mockito、EasyMock和Arquillian。

    谢谢您的回答,我会检查一下。您也可以使用DBUnit之类的工具来控制数据库设置和拆卸,但对于纯单元测试,Mockito更有意义,因为它允许测试完全独立。现在(2020年),我发现了另一个特性来分配方法的顺序,我不知道这个特性是什么时候引入的。它使用@Order(此处为正数)分配序号@DanielYang这是针对JUnit 5的,但问题是针对JUnit 4的。
    Executing first test
    Executing second test
    Executing third test