【问题标题】:Choose order to execute JUnit tests选择执行 JUnit 测试的顺序
【发布时间】:2010-04-19 17:15:53
【问题描述】:

我想选择执行 JUnit 测试的顺序。 我有 4 个类,里面有几个测试方法,我的目标是执行例如 A 类的方法 Y,然后是 B 类的方法 X,最后是 A 类的方法 Z。

你能帮忙吗?

【问题讨论】:

    标签: java netbeans junit testing


    【解决方案1】:

    从 4.11 版本开始,您可以使用注解指定执行顺序并按方法名称排序:

    import org.junit.Test;
    import org.junit.FixMethodOrder;
    import org.junit.runners.MethodSorters;
    
    @FixMethodOrder(MethodSorters.NAME_ASCENDING)
    public class MyTest {
    
        @Test
        public void test1Create() {
            System.out.println("first");
        }
    
        @Test
        public void test2Update() {
            System.out.println("second");
        }
    }
    

    See JUnit 4.11 Release Notes

    【讨论】:

    • 你是对的。但它再次将基于 ASCII 代码执行。所以'A'将在'a'之前执行。但这是正确的答案。
    • 使用@FixMethodOrder注解时,遵循方法顺序。
    【解决方案2】:

    通常,您无法指定单独的单元测试运行的顺序(尽管您可以在 TestNG 中指定优先级,并为每个测试设置不同的优先级)。但是,单元测试应该能够独立运行,因此测试的顺序应该无关紧要。这是一个不好的做法。如果您需要按特定顺序进行测试,您应该重新考虑您的设计。如果您详细说明需要订单的原因,我相信我们可以提供建议。

    【讨论】:

    • +1,虽然我认为这个建议的措辞不够有力。单元测试应该能够独立运行;这是根本。如果你的不是,那么你做错了什么。
    • 好吧...我是新手...所以问题是:我正在使用 OpenKM(一个文档管理系统)并且我有一个测试文件夹操作的类,即测试创建、重命名和删除文件夹。所以你是在告诉我,创建、重命名和删除都必须在同一个方法上,而不是分开依赖上一个方法?
    • 一般情况下,您将有一个设置和拆除方法,将文件夹置于已知状态。例如, setup 方法可以创建一个文件夹(如果它仍然存在,则 teardown 将删除它)。您的删除和重命名测试可以在该文件夹上运行。 create 测试可以验证该文件夹是否在 setup 方法中正确创建,或者它可以创建一个全新的文件夹(或 setup 方法中创建的文件夹的子文件夹)。
    【解决方案3】:

    JUnit 对这个问题的回答是创建一个像这样的测试方法:

      @Test public void testAll() {
           classA.y();
           classB.x();
           classA.z();
      }
    

    在某些情况下(设置和拆卸很重要),这显然是一个不令人满意的答案,但是单元测试的 JUnit 观点是,如果测试不是独立的,那么你做错了。

    如果以上不能满足您的需求,请查看 TestNG。

    【讨论】:

      【解决方案4】:

      创建一个 TestSuite 并按所需顺序调用测试方法。 @Yishai 是正确的,因为 JUnit 的设计使每个测试都是独立的。因此,如果您正在调用 可以 独立运行的测试方法,那么创建 TestSuite 以涵盖特定调用顺序的场景应该没有问题。

      【讨论】:

        【解决方案5】:

        可以以任意顺序进行测试的一般评论/想法太强了。

        这真的取决于你在测试什么。

        例如,我正在测试一个我们有 changePassword 操作的服务器。

        我认为测试的顺序很明显很关键。在 changePassword 之后,旧密码不再起作用,之前,它起作用。

        我不想在每次测试后恢复服务器状态,工作量太大。完成所有测试后,我可以做一次。

        【讨论】:

          【解决方案6】:

          如果前面的答案不令人满意,我注意到 Sun JVM JUnit 似乎总是按照定义的顺序执行单元测试。 显然这不是一个好主意。

          【讨论】:

          • 仅供未来读者参考,Java 7 之前的 JVM 似乎就是这种情况,但从 Java 7 开始,顺序是非确定性随机的。但是 JUnit 4.11+ 使用 FixMethodOrder 注释定义顺序的能力有限。
          【解决方案7】:

          您可能对此感兴趣:JExample

          使用相互依赖的测试进行测试的不同方法。

          【讨论】:

            【解决方案8】:

            你可以使用@Order()注解

            【讨论】:

            • 如果您在此答案中添加更多详细信息,人们会发现它更有帮助
            【解决方案9】:

            你可以像 @Order 注释那样做

            @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
            public class MyTest {
                 
                @Test
                @Order(1)
                @DisplayName("First")
                public void firstTest() {
                    System.out.println("a");
                }
                 
                @Test
                @Order(2)
                @DisplayName("Second")    
                public void secondTest() {
                    System.out.println("b");
            
                }
              
                @Test
                @Order(3)  
                @DisplayName("Third")  
                public void thirdTest() {
                    System.out.println("c");
                }
            }
            

            输出

            a
            b
            c
            

            【讨论】:

              猜你喜欢
              • 2018-04-23
              • 1970-01-01
              • 2019-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多