如何使JUnit测试用例按顺序运行?
我正在使用JUnit4。
我在测试用例中有一组测试方法。
每个测试方法都插入一些记录并validation测试结果,最后删除插入的记录。
由于JUnit并行运行,因为在执行上一个测试方法期间存在一些记录,测试方法会失败。 这只发生在我的同事机器(Windows 7)中,而不是在我的机器(Cent OS 6)中。
我们需要的是测试方法必须通过我们所有的机器。
我已经尝试清除Setup()方法中的记录,但它再次只能在我的机器上运行。 JUnit中是否有任何选项可以使测试方法以统一的顺序运行?
谢谢,
JUnit 4.11现在支持使用@FixMethodOrder
注释指定执行顺序。
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/
JUnit无法保证测试顺序。
这样做的原因是unit testing是primefaces的 – 所有设置都应该在设置/拆除方法中进行,而不是由其他测试进行。
考虑将插入数据的代码移动到另一个辅助类中,该类可以由插入的测试和需要validation的类调用,并在@Before方法中调用该类。
如果可以的话,你还应该考虑一个模拟解决方案(例如Mockito)而不是直接命中数据库 – 模拟将大大有助于确保你的测试很好并且孤立,并且,作为一个好的附带好处,通常有助于指出你可以在哪里使用一些重构。
因为您并行运行测试,并且您正在访问数据库,所以您很可能遇到问题,因为数据库不一定处于每个测试的连贯状态。
解决方案:不要并行运行测试。 默认情况下,JUnit不会并行运行测试,因此要么在maven中设置选项,要么在JUnit中使用其中一个并行运行程序。
如果你在Windows上测试失败但在Cent操作系统上没有问题,那么它可能是运行顺序的问题,你需要修复它。 看看我的答案是否有JUnit4开始支持测试的订购? 这是有意的吗? 。
解决这个问题的方法(至少在JUnit术语中)是删除测试之间的依赖关系。 基本上,JUnit不支持排序,测试应该能够以任何顺序运行。
如果您确实需要在测试之间存在依赖关系,请使用TestNG,您可以在其中拥有依赖项。
即使您有数据层,并行运行测试也没有问题。 但是你需要额外的工作来为你的数据创建MOCK UP,所以它不会打到数据库。 您可以使用不同的模型框架,如Mockito,EasyMock和Arquillian。