如何按特定顺序运行maven测试?

时间:2014-06-16 21:41:46

标签: java maven selenium jenkins

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

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

例如,我有:

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

我想要运行Class 1,然后运行2,然后运行3,最后运行4.

如何在pom.xml中指定它?

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

来自文档:

  

定义测试运行的顺序。支持的值是   “按字母顺序”,“反向字母”,“随机”,“每小时”   (按字母顺序排列均匀,在奇数小时内按字母顺序排列),   “失败第一”,“平衡”和“文件系统”。

请参阅完整说明here

这是一个例子

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

答案 2 :(得分:2)

我建议你在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>

答案 3 :(得分:0)

您可以使用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());
    }
}

您是否需要按特定顺序执行这些操作?理想情况下,测试不应相互依赖。

答案 4 :(得分:0)

您可以使用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 { 

}