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

我正在使用JUnit4。

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

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

由于JUnit并行运行,因为在执行上一个测试方法期间存在一些记录,测试方法会失败。 这只发生在我的同事机器(Windows 7)中,而不是在我的机器(Cent OS 6)中。

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

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

谢谢,

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

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

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

  2. JVM(null) – 按JVM返回的顺序保留测试方法。 请注意,JVM的顺序因运行而异。

  3. 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/

JUnit无法保证测试顺序。

这样做的原因是unit testing是primefaces的 – 所有设置都应该在设置/拆除方法中进行,而不是由其他测试进行。

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

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

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

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

如果你在Windows上测试失败但在Cent操作系统上没有问题,那么它可能是运行顺序的问题,你需要修复它。 看看我的答案是否有JUnit4开始支持测试的订购? 这是有意的吗? 。

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

如果您确实需要在测试之间存在依赖关系,请使用TestNG,您可以在其中拥有依赖项。

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