微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 maven failsafe 并行运行套件

如何解决使用 maven failsafe 并行运行套件

我正在尝试并行运行我的测试,并且我有一个与我能够找到的所有其他用例不同的用例。

我的测试非常简单,如下所示:

src/test/java
+-features.areaA
| +-SomeStory.java
| +-AnotherStory.java
| ...
+-features.areaB
| +-DifferentStory.java
| +-OtherStory.java
| ...
...

测试使用 编写,它是 的包装器,测试管理器是

每个“区域”代表被测应用程序的一些隐蔽区域。一个区域内的测试不能并行运行,因为它们会破坏他们正在使用的数据。但是,不同区域之间的测试当然可以并行运行,因为没有冲突。

我尝试根据 配置我的 documentation。使用 parallel=suitesthreadCount=4threadCountSuites=4useUnlimitedThreads=true 中的任何一个,会导致一次只运行一个测试。

在Failsafe 插件的上下文中,我对“套件”的理解是错误的吗?是否可以并行化测试,以便将整个包一次一个地送入 VM 线程,但一个包中的类按顺序运行?

更新:

  • Maven 故障安全版本 2.22.2
  • JUnit 4.13 版

解决方法

没有“包”的概念。 “套件”的概念与 Suite 相关。

为了解决我上面的问题,我做了以下事情:

在每个“features.area”中,我创建了一个“TestSuiteStub”:

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

/**
 * This will be processed by groovy-maven-plugin.
 */
@RunWith(Suite.class)
@Suite.SuiteClasses({
/* add test Stories after this ANCHOR */
})
public class TestSuiteStub {
    /* Suite holder */
}

然后我将 groovy-maven-pluginexecute 目标和以下脚本一起使用:

// find all TestSuiteStub.java
new File("${project.build.testSourceDirectory}/features").  // exploits the "complication" in Maven interpolation and GStrings
  traverse(type: groovy.io.FileType.FILES,nameFilter: ~/TestSuiteStub\.java/) { stub ->
    println 'Using: ' + stub

    // in the same dir as TestSuiteStub.java,find all *Story.java
    def stories = new StringBuilder()
    new File(stub.parent).
      eachFileMatch(groovy.io.FileType.FILES,~/.*Story\.java/) { story ->
        stories.append story.name.replace('java','class')
        stories.append ',' // will leave a comma at end of list,but javac seems to be ok with that
      }
    println 'Found: ' + stories

    // write out TestSuite.java
    def suite = new File(stub.parent + '/TestSuite.java')
    suite.delete()
    println 'Writing: ' + suite
    stub.eachLine() { line ->

      if(line.contains('Stub'))
        suite.append line.replace('TestSuiteStub','TestSuite') + System.getProperty('line.separator')
      else
        suite.append line + System.getProperty('line.separator')

      if(line.contains('ANCHOR'))
        suite.append stories + System.getProperty('line.separator')
    }
  }

这将处理每个 TestSuiteStub 并生成一个 TestSuite。所以在运行这个之后(你可以使用 mvn test-compile 来运行它,而不用运行你的测试),我有类似的东西:

src/test/java
+-features.areaA
| +-SomeStory.java
| +-AnotherStory.java
| ...
| +-TestSuiteStub.java
| +-TestSuite.java
+-features.areaB
| +-DifferentStory.java
| +-OtherStory.java
| ...
| +-TestSuiteStub.java
| +-TestSuite.java
...

第一个 TestSuite 看起来像这样:

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

/**
 * This class will be processed by groovy-maven-plugin.
 */
@RunWith(Suite.class)
@Suite.SuiteClasses({
/* add test Stories after this ANCHOR */
SomeStory.class,AnotherStory.class,})
public class TestSuite {
    /* Suite holder */
}

为了让 选择这个,我这样配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>${failsafe.plugin.version}</version>
  <configuration>
    <includes>
      <include>features.*.*Suite</include>
    </includes>
    <parallel>suites</parallel>
    <threadCountSuites>4</threadCountSuites>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>

最后,我还在我的 *Suite.java 中添加了 .gitignore

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。