如何按特定顺序运行 Maven 测试? [复制]

Posted

技术标签:

【中文标题】如何按特定顺序运行 Maven 测试? [复制]【英文标题】:How to run maven tests in a specific order? [duplicate] 【发布时间】:2014-08-06 19:26:43 【问题描述】:

我有一个 Maven 项目和几个测试类。

我想使用插件surefire 以特定顺序运行这些测试。

例如,我有:

ClassTest1.java ClassTest2.java ClassTest3.java ClassTest4.java

我想运行 Class 1,然后是 2,然后是 3,最后是 4。

如何在 pom.xml 中指定它?

【问题讨论】:

除了已经给出的所有答案,您还可以看看 TestNG,它支持一些测试排序。 【参考方案1】:

一种解决方法是将runOrder 参数设置为按字母顺序排列,然后将您的测试重命名为按字母顺序排列。

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

但不建议这样做 - 单元测试应该相互独立。执行顺序应该无关紧要。

【讨论】:

非常感谢您的帮助!!我很感激:) 如果我为每个方法设置了优先级,如优先级 = 0、1、2。在这种情况下,它会随机运行类。即使我已经像这样将类重命名为 TC_000、TC_001、TC_002。并且每个类 - 方法都以 priority=0 开头,依此类推。【参考方案2】:

您可以使用runOrder 参数执行此操作。

来自文档:

定义运行测试的顺序。支持的值为 “按字母顺序排列”、“按字母顺序排列”、“随机”、“每小时” (偶数小时按字母顺序排列,奇数小时按字母倒序排列), “failedfirst”、“balanced”和“filesystem”。

查看完整描述here。

这是一个例子

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

【讨论】:

如何从命令行使用它? mvn test -Drunorder=alphabetical : is this correct?【参考方案3】:

我建议您在 testng.xml 中定义顺序,然后通过 maven 创建配置文件并运行它。这是您可以尝试的代码示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium Automation" parallel="false">
    <test name="Test1">
        <classes>
            <class name="some.package.Class1"/>
            <class name="some.package.Class2"/>
            <class name="some.package.Class3"/>
        </classes>
    </test>
</suite>

然后在 POM.xml 中您可以创建如下配置文件并引用您要执行的 testNG.xml。

<profile>
    <id>any id</id>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
            <suiteXmlFiles>
                <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
            </suiteXmlFiles>
        </configuration>
    </plugin/>
</profile>

【讨论】:

【参考方案4】:

您可以使用 JUnitCore 以特定顺序执行测试。这是一个基本的实现。

public static void main(String[] args)

    List<Class> testCases = new ArrayList<Class>();

    //Add test cases
    testCases.add(Class1.class);
    testCases.add(Class2.class);
    for (Class testCase : testCases)
           
                runTestCase(testCase);
           


private static void runTestCase(Class testCase)

    Result result = JUnitCore.runClasses(testCase);
    for (Failure failure : result.getFailures())
    
        System.out.println(failure.toString());
    

您是否有理由要求它们按特定顺序执行?理想情况下,测试不应相互依赖。

【讨论】:

【参考方案5】:

你可以用junit创建一个testsuite类,然后用surefire来运行这个类,它会按照你给的顺序运行,例如:

import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses( 
Test1.class
Test2.class
Test3.class
Test4.class
) 

public class TestSuite  

 

【讨论】:

以上是关于如何按特定顺序运行 Maven 测试? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JUnit4 中按特定顺序运行测试方法?

使用 Maven,我如何运行特定的测试?

按特定顺序运行 PHPUnit 测试

如何按特定顺序对 .then() 调用进行排序? [复制]

如何按特定顺序从列表中删除字符串而不输入其值? [复制]

测试时按特定顺序加载 Rails 夹具