原文链接:https://blog.csdn.net/taiyangdao/article/details/52159065
TestNG在执行测试时,默认suitethreadpoolsize=1,-randomizesuites=false,即非并发顺序执行测试。
但是TestNG提供了多种方式,以支持测试的并发多线程执行。
1. 针对多个测试规划的情况,为每个testng*.xml配置文件使用独立的线程执行
java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml
通过使用启动参数suitethreadpoolsize,为每个测试规划文件分配一个线程并发执行。
2. 在一个测试规划中,指定其线程并发的策略
1).通过启动测试的命令行参数-parallel
启动参数-parallel用以设置测试执行的默认并发策略。之所以说“默认并发策略”,是因为这里的设置可以被testng.xml配置文件中的并发策略所覆盖。
另外,启动测试时不设置-parallel参数,则默认策略是不使用并发线程。但究竟是否并发执行,还要看testng.xml中的配置。
java org.testng.TestNG -parallel methods -threadcount 4 testng.xml
说明:在当前测试规划的执行过程中,为每个测试方法的执行使用单独的线程,最多并发4个线程。对比于其他并发策略,测试方法的并发粒度最小,所以这也是最大程度的并发策略。
java org.testng.TestNG -parallel tests -threadcount 4 testng.xml
说明:在当前测试规划的执行过程中,为每个测试用例的执行使用单独的线程(该测试用例中的所有测试方法共享一个线程),最多并发4个线程。
java org.testng.TestNG -parallel classes -threadcount 4 testng.xml
说明:在当前测试规划的执行过程中,为每个测试类的执行使用单独的线程(该测试类中的所有测试方法共享一个线程),最多并发4个线程。
2).通过testng.xml配置文件
<suite name="My suite" parallel="methods" thread-count="4">
说明:在当前测试规划的执行过程中,为每个测试方法的执行使用单独的线程,最多并发4个线程。
<suite name="My suite" parallel="tests" thread-count="4">
说明:在当前测试规划的执行过程中,为每个测试用例的执行使用单独的线程(该测试用例中的测试方法共享一个线程),最多并发4个线程。
<suite name="My suite" parallel="classes" thread-count="4">
说明:在当前测试规划的执行过程中,为每个测试类的执行使用单独的线程(该测试类中的测试方法共享一个线程),最多并发4个线程。
<suite name="My suite" parallel="instances" thread-count="4">
说明:在当前测试规划的执行过程中,为每个测试类实例的执行始终使用唯一的线程(该测试实例中的测试方法共享一个线程),最多并发4个线程。
注意:这里的parallel默认值为"none"。曾经的"true", "false"已经过时了,不建议使用。
3. 在测试方法中,指定其可用的线程池
还可以单独为一个测试方法指定可使用的线程池,示例如下:
@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000) public void testServer() {...}
说明:该测试方法可在3个线程中并发执行,共被调用10次,执行超时10秒。
4. @DataProvider的并发
在定义数据源的时候,不仅仅可以为数据源指定name,还可以为其指定parallel属性,示例如下:
@DataProvider(name = "test1", parallel = true) public Object[][] createData1() { return new Object[][] { { "Cedric", new Integer(36) }, { "Anne", new Integer(37)}, }; }
说明:parallel属性默认false,表示使用该数据源的测试方法不能并发执行。parallel属性设置为true,表示使用该数据源的测试方法可以并发执行。
5. 注意:
在定义测试类的时候,如果@Test使用了singleThreaded=true属性,则该测试类的所有测试方法都只能在单线程中执行,无论其他设置如何。示例如下:
@Test(singleThreaded=true) public class Test1 { public void test1() { } public void test2() { } }