【问题标题】:How do I control the order of execution of tests in Maven?如何控制 Maven 中测试的执行顺序?
【发布时间】:2012-08-18 00:43:25
【问题描述】:

我需要按顺序运行测试。我在任何地方都找不到充分的记录。我宁愿从命令行执行此操作。类似的东西

 mvn -Dtest=test1,test2,test3,test5 test

我该怎么做?

【问题讨论】:

    标签: testing maven


    【解决方案1】:

    您不能指定测试的运行顺序。

    解决方法是将runOrder parameter 设置为按字母顺序排列。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <runOrder>alphabetical</runOrder>
        </configuration>
    </plugin>
    

    然后你需要重命名你的测试以获得预期的顺序。

    但是,拥有依赖测试并不是一个好主意。单元测试必须是fIrst

    【讨论】:

    • 这是一个非常糟糕的主意,因为单元测试不应该相互依赖,如果您需要单元测试的顺序就是这种情况。
    • @khmarbaise 我完全同意你的看法。
    • @gontard 我认为你的回答说“我完全不同意你的观点”——我确实如此。测试应该是独立的,是的。但是,有时您无法模拟系统的某些部分。或者需要他们之间更真实的互动。您最终会在应该如何构建单元测试而不是让系统启动和运行方面陷入困境。
    • @Nik “你不能模拟零件”在我看来,你不是在编写单元测试,而是在编写集成测试。如果您的代码不可单元测试,我会建议您先编写测试(编写可测试代码的最佳方式)。但可能你不能,因为你正在使用现有的代码。最后对我来说,集成测试,就像单元测试一样,如果它们是独立的,会更好。
    • 这实际上在尝试在一组单独运行时成功的测试中找到罪魁祸首时非常有用,但在一起运行时并不总是如此。例如:字母顺序似乎在 Windows 上是默认的,但在 linux 上却不是,但这并不总是很明显,这可能会导致测试在一个系统上失败,而不是在另一个系统上。
    【解决方案2】:

    有一个 Maven Surefire 插件允许您指定 test order

    如果您的测试需要按顺序运行,因为它们相互依赖,我强烈建议您不要这样做。每个测试都应该是独立的并且能够独立运行。如果每个测试都是独立的,那么它们运行的​​顺序无关紧要。拥有独立的测试还意味着您可以重复运行单个测试,而无需重新运行整个测试链。这可以节省大量时间。

    【讨论】:

    • 虽然没有明确回答如何在 Maven 中执行此操作,但我最近确实在 JUnit 的文档中找到了这个链接。 github.com/junit-team/junit/wiki/Test-execution-order
    • 你说的大部分都是真的。当您进行一些昂贵的测试(例如 UI 测试)并且管理层不想投资于测试的独立性时,就会出现问题,因为他们想要短期收益而不是假设的长期收益。
    【解决方案3】:

    如果您的单元测试需要按特定顺序运行,可能是因为您的测试设计不当,或者您的应用设计不当。您的单元测试应该彼此独立。

    【讨论】:

    • 这句话太假了,我不知道从哪里开始回答。假设我正在测试一个交易系统。假设我的系统有 3 个主要组件 1) 分析市场,2) 未结订单 3) 报告 pnl。我的单元测试是独立的,因为它们测试单独的组件:1)构建量化模型 2)订单类型决策/执行,3)分析报告。为了测试工作流程,我需要按顺序运行它们。如果我没有任何订单,我无法报告 pnl。如果我的量化模型不存在,我将无法打开订单。
    • @Nik 如果您需要其他实体来测试您的方法,请使用 Mocks 而不是订购您的测试。
    • @Nik 在考虑之后,我什至不认为(这里是个人意见)测试工作流在单元测试中占有一席之地。我会在集成测试中这样做。
    【解决方案4】:

    如果您确实需要测试的顺序,那么您应该使用testng 而不是 JUnit,您可以在其中定义测试之间的依赖关系并基于特定的测试顺序。我知道在实践中,独立范式不起作用。

    【讨论】:

      【解决方案5】:

      您可以创建一个测试套件来运行所有测试并运行它。

      使用junit 4:-

      @RunWith(Suite.class)
      @Suite.SuiteClasses({Test1.class,
                           Test2.class,
                           Test3.class,
                           Test4.class,
                           Test5.class
      })
      public class TestSuite
      {
      }
      

      这将以正确的顺序运行它们。

      【讨论】:

      • @Suite.SuiteClasses( { AccountControllerTest.class, BrandsControllerTest.class, UserProfileControllerTest.class, RequestedBrandControllerTest.class, SettingsControllerTest.class } ) 当我尝试这个 SettingsControllerTest.class 在 AccountControllerTest.class 之前运行时跨度>
      【解决方案6】:

      surefire-plugin 的runOrder 参数会有所帮助,但只有按顺序执行类时才会有所帮助。在一个类中排序测试方法没有帮助(surefire-plugin 2.22.2,junit 5.6.1)。要使用 jUnit 实现测试类中的顺序,请使用 jUnit 通过 @TestMethodOrder(MethodOrderer.Alphanumeric.class) (jUnit 5) 控制类中测试顺序的功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        相关资源
        最近更新 更多