Java 如何使用Junit按顺序运行测试方法

Java 如何使用Junit按顺序运行测试方法,java,selenium-webdriver,junit,automated-tests,Java,Selenium Webdriver,Junit,Automated Tests,我正在使用JUnit和SeleniumWebDriver。我希望按照在代码中编写测试方法的顺序运行测试方法,如下所示: @Test public void registerUserTest(){ // code } @Test public void welcomeNewUserTest(){ // code } @Test public void questionaireNewUserTest(){ // code } 但它不起作用,它总是按以下顺序执行我的测试方

我正在使用JUnit和SeleniumWebDriver。我希望按照在代码中编写测试方法的顺序运行测试方法,如下所示:

@Test
public void registerUserTest(){
    // code
}

@Test
public void welcomeNewUserTest(){
    // code
}

@Test
public void questionaireNewUserTest(){
    // code
}
但它不起作用,它总是按以下顺序执行我的测试方法:

welcomeNewUserTest()
registerUserTest()
questionaireNewUserTest()
我在某处读到一个答案,如果我用后缀Test命名我的方法,那么JUnit将按照我在代码中的顺序执行它们。显然,这不起作用


有什么帮助吗?谢谢

所以对于这些步骤相互依赖的测试,您应该将它们作为一个单元来执行。你真的应该这样做:

@Test
public void registerWelcomeAndQuestionnaireUserTest(){
    // code
    // Register
    // Welcome
    // Questionnaire
}
正如@Jeremiah在下面提到的,有几种独特的方法可以让单独的测试不可预测地执行

我已经说过了,这是你的解决方案

如果需要单独的测试,可以使用,然后通过
NAME\u升序
来完成。这是我唯一知道的方法

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestMethodOrder {

    @Test
    public void testA() {
        System.out.println("first");
    }
    @Test
    public void testC() {
        System.out.println("third");
    }
    @Test
    public void testB() {
        System.out.println("second");
    }
}
将执行:

testA()、testB()、testC()

就你而言:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ThisTestsEverything{

    @Test
    public void T1_registerUser(){
        // code
    }

    @Test
    public void T2_welcomeNewUser(){
        // code
    }

    @Test
    public void T3_questionaireNewUser(){
        // code
    }

}

您不能按照编写方法的顺序运行测试方法。 重点是测试必须相互独立。JUnit不鼓励依赖测试

但是如果你非常想要


这里有@FixMethodOrder注释。请阅读以下内容

在要执行测试的类上方使用以下命令

@FixMethodOrder(MethodSorters.JVM)
public class TestMethodOrder {

    @Test
    public void signup() {
        System.out.println("Signup");
    }

    @Test
    public void login() {
        System.out.println("Login");
    }

    @Test
    public void navigate() {
        System.out.println("Navigate");
    }
}

MethodSorters.JVM注释将按照您在文件中实际编写的方式执行测试。(就像Java代码执行的方式一样,逐行)

您可以使用
@FixMethodOrder(methodsorter.NAME\u升序)
注释对方法进行排序。像

@FixMethodOrder(MethodSorters.DEFAULT)
公共类DefaultOrderOfExecutionTest{ 私有静态StringBuilder输出=新StringBuilder(“”)

}

您可以通过3种方式执行排序:

  • MethodSorters.DEFAULT-此默认策略使用哈希代码比较测试方法。在哈希冲突的情况下,将使用字典顺序
  • MethodSorters.JVM-此策略利用了自然的JVM顺序,每次运行的顺序可能不同
  • MethodSorters.NAME\u升序-此策略可用于按字典顺序运行测试

  • 有关更多详细信息,请参阅:

    如果我正确理解了您的场景,这是一种糟糕的测试方法-您的测试应该相互独立。@DmitryZaitsev:是的,我知道。因为我编写了验收测试,而且它非常大,所以我只是尝试将它分解为一些小的测试方法。试着看看Junit是否可以按顺序运行它们,可能是重复的感谢。我真的像你说的那样,把它们作为一个整体来执行。我只是想知道是否有机会这样做。和@FixMethodOrder的工作原理。就像我找的一样。谢谢我不知道it@LouisT哈哈,很好,你们都改变了方法,如果需要的话,你们现在有了自己的解决方案。在使用排序注释时,需要记住的一点是,根据测试的执行方式,它仍然可能出现错误行为。例如,如果使用SureFire,则需要在该配置中定义RunOrder:此外,如果使用可以在测试中引入多线程的执行工具(如Maven),则测试可能会再次无序执行。我不确定这一点,但如果你开始看到意想不到的结果,那就值得记住。这是错误的。JVM返回的方法的顺序在每次运行时可能不同。在文档()中:publicstaticfinalmethodsortersjvm:按照JVM返回的顺序保留测试方法。请注意,JVM的顺序可能因运行而异
    @Test
    public void secondTest() {
        output.append("b");
    }
    
    @Test
    public void thirdTest() {
        output.append("c");
    }
    
    @Test
    public void firstTest() {
        output.append("a");
    }
    
    @AfterClass
    public static void assertOutput() {
        assertEquals(output.toString(), "cab");
    }