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

rek*_*nuc 16 testing maven

我需要按顺序运行测试.我没有在任何地方找到这个充分记录.我更喜欢从命令行执行此操作.就像是

 mvn -Dtest=test1,test2,test3,test5 test
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

gon*_*ard 36

您无法指定测试的运行顺序.

执行此操作的解决方法是将runOrder参数设置为按字母顺序排列.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <runOrder>alphabetical</runOrder>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

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

然而,进行依赖测试并不是一个好主意.单元测试必须是第一个.

  • 这是一个非常糟糕的主意,导致单元测试不应该依赖于彼此,如果您需要单元测试的顺序就是这种情况. (4认同)
  • 请注意,您也可以从命令行定义它:`mvn test -Dsurefire.runOrder=reversealphabetical` - 这对于测试测试独立性非常有用 - 尝试不同的顺序;) (3认同)
  • @gontard 我认为你的回答是“我完全不同意你的观点”——我也这么认为。测试应该是独立的,是的。但是,有时您无法模拟系统的某些部分。或者他们之间需要更现实的互动。您最终会为如何构建单元测试而绞尽脑汁,而不是让系统启动并运行。 (2认同)
  • @Nik"你不能嘲笑部件"对我说你不是在编写单元测试而是在进行集成测试.如果您的代码不是单元可测试的,我建议您先编写测试(编写可测试代码的最佳方法).但也许你不能,因为你正在使用现有的代码.最后对我来说,如果它们是孤立的,那么集成测试就像单元测试一样好得多. (2认同)
  • 实际上,这在尝试在一组测试中找到罪魁祸首时非常有用,这些测试在单独运行时会成功,但在同时运行时并不总是成功。例如:字母似乎是Windows上的默认设置,但不是Linux上的默认设置,但这并不总是很明显,这可能会导致测试在一个系统而不是另一个系统上失败。 (2认同)

khm*_*ise 5

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


Pet*_*son 5

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

使用junit 4: -

@RunWith(Suite.class)
@Suite.SuiteClasses({Test1.class,
                     Test2.class,
                     Test3.class,
                     Test4.class,
                     Test5.class
})
public class TestSuite
{
}
Run Code Online (Sandbox Code Playgroud)

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