TestNG并行测试配置

时间:2013-01-10 21:24:50

标签: java maven-2 testng java-6

在Java 6上使用TestNG,这是我想在Maven项目中做的事情:

  1. 启动可以使用基于队列的testAbc
  2. 运行多线程的测试方法(DataProvider
  3. testAbc完成
  4. 的所有主题后,启动依赖testXyztestAbc)的测试

    我以为我已经正确配置了它,但我没有。

    目前我已将其配置为:

    @Test ( singleThreaded = false )
    public class AutomatedTest {
    
      @Test (
        alwaysRun = true,
        dataProviderClass = UseCaseProvider.class,
        dataProvider = "getUseCasesNoDependencies",
        skipFailedInvocations = false,
        threadPoolSize = 25
      )
      public void testAbc(UseCase useCase) {
        executeUseCase(useCase);
      }
    
      @Test (
        dependsOnMethods = {"testAbc"},
        dataProviderClass = UseCaseProvider.class,
        dataProvider = "getUseCasesDependencies",
        singleThreaded = true
      )
      public void testXyz(UseCase useCase) {
        executeUseCase(useCase);
      }
    }
    

    testAbc提供的@DataProvider中的所有测试需要很长时间才能运行,但同时可以运行多达25个(其中有好几百个)。 testXyz中的所有内容都不能并行运行,因为不仅所有情况都依赖于testAbc,而且处理对这样的线程池不友好。

    My Maven配置设置如下:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <parallel>methods</parallel>
            <threadCount>25</threadCount>
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    当我运行mvn -U test时,我看不到我的测试实际并行运行。 救命啊!

    $ mvn -version
    Apache Maven 2.2.1 (r801777; 2009-08-06 15:16:01-0400)
    Java version: 1.6.0_35
    Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    Default locale: en_US, platform encoding: MacRoman
    OS name: "mac os x" version: "10.7.5" arch: "x86_64" Family: "mac"
    

1 个答案:

答案 0 :(得分:3)

添加threadPoolSize

怎么样?
@Test ( singleThreaded = false, threadPoolSize = 5 )
public class AutomatedTest {
...

threadPoolSize属性允许您指定应为此次执行分配多少个线程。

修改

注意到你错过了invocationCount。请注意,如果未指定threadPoolSize,则会忽略invocationCount

所以请尽量离开@Test课程并更新testAbc

  @Test (
    alwaysRun = true,
    dataProviderClass = UseCaseProvider.class,
    dataProvider = "getUseCasesNoDependencies",
    skipFailedInvocations = false,
    threadPoolSize = 25,
    invocationCount = 25
  )
  public void testAbc(UseCase useCase) {
    executeUseCase(useCase);
  }