前言
TestNG有多种并发方式支持,方法的并发,class级的并发,test级的并发等;
根据实际应用可以灵活的配置和使用,下面分别对几种并发方法进行说明:
一、方法级并发
方法级并发即method级并发,此种并发方式需要将xml中的suite
标签的parallel
属性设置为methods
并添加属性thread-count
并设置其值,其会将所有的方法按照设定的并发数进行并发,譬如总共有4个测试用例,并发数设置为3,则会开三个线程,那么必然会有两个用例是在同一个线程内的,跟用例在哪个class内没关系,范例如下:
测试用例类一ThreadTest.java
:
package com.demo.test.testng;
import org.testng.annotations.Test;
public class ThreadTest {
@Test()
public void test1()
{
long id = Thread.currentThread().getId();
System.out.println("test1-1 thread id:"+id);
}
@Test
public void test2()
{
long id = Thread.currentThread().getId();
System.out.println("test1-2 thread id:"+id);
}
}
测试用例类二ThreadTest2
:
package com.demo.test.testng;
import org.testng.annotations.Test;
public class ThreadTest2 {
@Test()
public void test1()
{
long id = Thread.currentThread().getId();
System.out.println("test2-1 thread id:"+id);
}
@Test
public void test2()
{
long id = Thread.currentThread().getId();
System.out.println("test2-2 thread id:"+id);
}
}
xml设置并发数为3
,并发类型为methods
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="threadSuite" parallel="methods" thread-count="3">
<test name="Test">
<classes>
<class name="com.demo.test.testng.ThreadTest"/>
<class name="com.demo.test.testng.ThreadTest2"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
执行结果如下:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
D:\software\workspace\testng\src\main\java\com\demo\test\testCase\ThreadTestXml.xml
test1-1 thread id:12
test2-1 thread id:14
test1-2 thread id:13
test2-2 thread id:13
===============================================
threadSuite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
如上图所示,确实是开了三个线程,且有两个相同线程号的用例并非同一个测试类;
二、class级并发
此并发方式需要将xml中的suite
标签内的属性parallel
属性设置为classes
,且添加属性thread-count
并设置其值即可实现class级别并发,其会一个class内的所有方法放在一个线程内,根据线程数设置和总的class数来分配线程,譬如如果设置线程数为3
,而class
数目为2
,则会开两个线程来分别运行两个class
,而如果设置线程数为3
,且class数目为4
则将会有两个class
在一个线程内,如下为一个简单的范例:
两个用例类如下:
ThreadTest.java
package com.demo.test.testng;
import org.testng.annotations.Test;
public class ThreadTest {
@Test()
public void test1()
{
long id = Thread.currentThread().getId();
System.out.println("test1-1 thread id:"+id);
}
@Test
public void test2()
{
long id = Thread.currentThread().getId(