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

时间:2012-03-12 13:30:25

标签: java junit operating-system junit4

我正在使用JUnit4。

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

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

  

由于JUnit并行运行,测试方法因某些原因而失败   执行上一个测试方法时出现的记录。这个   只发生在我的同事机器(Windows 7),而不是我的机器(Cent   OS 6)。

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

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

谢谢,

5 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:24)

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

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

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

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

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

答案 2 :(得分:7)

JUnit无法保证测试顺序。

原因是单元测试是原子的 - 所有设置都应该在设置/拆除方法中进行,而不是通过其他测试。

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

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

答案 3 :(得分:2)

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

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

如果您在Windows上测试失败但在Cent OS上没有出现问题,则可能是运行顺序问题,您需要修复它。请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional?的回答。

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

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

答案 4 :(得分:-2)

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