【问题标题】:How to run test methods in order with Junit如何使用 Junit 按顺序运行测试方法
【发布时间】:2016-03-17 16:43:47
【问题描述】:

我正在使用 JUnit 和 Selenium Webdriver。我想按照我在代码中编写它们的顺序运行我的测试方法,如下所示:

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

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

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

但它不起作用,它总是按这个顺序执行我的测试方法:

welcomeNewUserTest()
registerUserTest()
questionaireNewUserTest()

如果我用后缀 Test 命名我的方法,我会在某处读到答案,然后 JUnit 会按照我在代码中对它们的排序方式执行它们。显然,这行不通。

有什么帮助吗?谢谢

【问题讨论】:

  • 如果我正确理解了你的场景,那是一种不好的测试方法——你的测试应该相互独立。
  • @DmitryZaitsev:是的,我知道。因为我写的是验收测试,而且它真的很大,我只是试着把它分解成小的测试方法。试试看Junit能否按顺序运行它们

标签: java selenium-webdriver junit automated-tests


【解决方案1】:

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

@Test
public void registerWelcomeAndQuestionnaireUserTest(){
    // code
    // Register
    // Welcome
    // Questionnaire
}

正如@Jeremiah 下面提到的,有一些独特的方法可以使单独的测试无法预测地执行。

既然我已经说过了,这就是你的解决方案。

如果您想要单独的测试,您可以使用@FixMethodOrder,然后通过NAME_ASCENDING 进行。这是我知道的唯一方法。

@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
    }

}

【讨论】:

  • 谢谢。我实际上确实像你说的那样,将它们作为一个整体执行。我只是想知道是否有机会这样做。 @FixMethodOrder 有效。这就像我寻找的那样。谢谢。我不知道它
  • @LouisT 哈哈,太好了,你们俩都改变了自己的方法,如果需要的话,现在有了自己的解决方案。
  • 使用排序注解时要记住的一点是,根据测试的执行方式,它仍然可能出现异常行为。例如,如果您使用 SureFire,您需要在该配置中定义 RunOrder:maven.apache.org/surefire/maven-surefire-plugin/… 此外,如果您使用可以在测试中引入多线程的执行工具(例如 Maven),您的测试可能会再次执行命令。我不确定这一点,但如果您开始看到意想不到的结果,请记住这一点。
【解决方案2】:

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

但是如果你很想要...

有@FixMethodOrder 注释。请阅读以下Annotation Type FixMethodOrder

【讨论】:

    【解决方案3】:

    您可以使用@FixMethodOrder(MethodSorters.NAME_ASCENDING) 注解对方法进行排序。喜欢,

    @FixMethodOrder(MethodSorters.DEFAULT)
    

    公共类 DefaultOrderOfExecutionTest { 私有静态 StringBuilder 输出 = new StringBuilder("");

    @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");
    }
    

    }

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

    1. MethodSorters.DEFAULT- 此默认策略使用其哈希码比较测试方法。如果发生哈希冲突,则使用字典顺序。
    2. MethodSorters.JVM- 此策略利用自然 JVM 排序 - 每次运行可能不同。
    3. MethodSorters.NAME_ASCENDING- 此策略可用于按字典顺序运行测试。

    更多详情请参考:The Order of Tests in JUnit

    【讨论】:

      【解决方案4】:

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

      @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 代码的执行方式一样,逐行执行)

      【讨论】:

      • 这是错误的。每次运行时,JVM 返回的方法顺序可能不同。在文档 (junit.org/junit4/javadoc/4.12/org/junit/runners/…) 中:public static final MethodSorters JVM:按照 JVM 返回的顺序保留测试方法。请注意,来自 JVM 的顺序可能因运行而异
      猜你喜欢
      • 2012-03-28
      • 2013-03-23
      • 2020-04-17
      • 1970-01-01
      • 2018-04-23
      • 2015-12-21
      • 2015-09-21
      • 1970-01-01
      相关资源
      最近更新 更多