Testing 如何控制Maven中测试的执行顺序?

Testing 如何控制Maven中测试的执行顺序?,testing,maven,Testing,Maven,我需要按顺序运行测试。我在任何地方都找不到这方面的充分记录。我更愿意从命令行执行此操作。差不多 mvn -Dtest=test1,test2,test3,test5 test 如何执行此操作?您不能指定测试的运行顺序 解决方法是将设置为字母顺序 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</ar

我需要按顺序运行测试。我在任何地方都找不到这方面的充分记录。我更愿意从命令行执行此操作。差不多

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

如何执行此操作?

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

解决方法是将设置为字母顺序

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

org.apache.maven.plugins
.

有一个Maven插件,允许您指定


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

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

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

您可以创建一个测试套件,运行所有测试并运行该套件

对于JUnit4:-

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

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

surefire插件的
runOrder
参数将有所帮助,但只有当类按顺序执行时才有帮助。在一个类(surefire插件2.22.2、junit 5.6.1)中对测试方法进行排序没有帮助。要使用jUnit实现测试类内的顺序,请使用jUnit的特性,即通过@TestMethodOrder(methodOrder.Alphanumeric.class)(jUnit 5)控制类内的测试顺序。

这是一个非常糟糕的主意,因为单元测试不应该相互依赖,如果你需要单元测试的顺序,情况就是如此。@khmarbaise我完全同意你的观点。@gontard我想你的回答是“我完全不同意你”——我确实同意。测试应该是独立的,是的。但是,有时您无法模拟系统的某些部分。或者他们之间需要更现实的互动。最终,你会绞尽脑汁思考如何构造单元测试,而不是让系统启动并运行。@Nik“你不能模拟部件”听起来你不是在写单元测试,而是在写集成测试。如果您的代码不是单元可测试的,我建议您先编写测试(编写可测试代码的最佳方法)。但可能您不能,因为您正在使用现有代码。最后,对于我来说,集成测试,如单元测试,如果它们是孤立的,则会更好。事实上,当试图在一组测试中找到罪魁祸首时,这非常有用,这些测试在单独运行时成功,但在一起运行时并不总是成功。例如:字母顺序在windows上似乎是默认的,但在linux上却不是,但这并不总是很明显会导致一个系统而不是另一个系统的测试失败。这句话太假了,我不知道从哪里开始回答。假设我正在测试一个交易系统。假设我的系统有3个主要组件1)分析市场,2)未结订单3)报告pnl。我的单元测试是独立的,因为它们测试单独的组件:1)构建定量模型2)订单类型决策/执行,3)分析报告。为了测试工作流,我需要按顺序运行它们。如果我没有任何命令,我不能报告pnl。如果我的quant模型不存在,我就不能打开订单。@Nik如果您需要其他实体来测试您的方法,请使用mock而不是对测试进行排序。@Nik仔细考虑后,我甚至不认为(这里是我个人的意见)测试工作流在单元测试中占有一席之地。我会在集成测试中这样做,虽然对于如何在Maven中这样做没有明确的答案,但我最近确实在JUnit的文档中找到了这个链接。你说的大部分是真的。当您有一些昂贵的测试(如UI测试)时,问题就会出现。管理层不想投资于测试的独立性,因为他们想要短期收益,而不是假设的长期收益。@Suite.SuiteClasses({AccountControllerTest.class,BrandsControllerTest.class,UserProfileControllerTest.class,RequestedBrandControllerTest.class,SettingsControllerTest.class})尝试此设置时,AccountControllerTest.class在AccountControllerTest.class之前运行