TestNG在执行测试时,默认suitethreadpoolsize=1,-randomizesuites=false,即非并发顺序执行测试。
但是TestNG提供了多种方式,以支持测试的并发多线程执行。
java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml 通过配置testng.xml实现
方法级别
测试类:
package TestNg.paraller;
import org.testng.annotations.Test;
public class Testone {
@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);
}
}
package TestNg.paraller;
import org.testng.annotations.Test;
public class Testtwo {
@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);
}
}
testng.xml问件
<?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="TestNg.paraller.Testone"></class>
<class name="TestNg.paraller.Testtwo"></class>
</classes>
</test>
<!-- <listeners>
<listener class-name="report.ExtentReport"></listener>
</listeners>-->
<!-- 这是reportNG的监听类-->
<!-- <listeners>
<listener class-name="org.uncommons.reportng.HTMLReporter"></listener>
<listener class-name="org.uncommons.reportng.JUnitXMLReporter"></listener>
</listeners>-->
<listeners>
<listener class-name="report.ZTestReport"></listener>
</listeners>
</suite>
方法级别运行,一次运行三个方法,顺序是不确定的
类级别
类级别运行,按类运行,一次运行一个类中的方法。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="classes" thread-count="3" verbose="2">
<test name="Test">
<classes>
<class name="TestNg.paraller.Testone"></class>
<class name="TestNg.paraller.Testtwo"></class>
</classes>
</test>
<listeners>
<listener class-name="report.ExtentReport"></listener>
</listeners>
</suite>
书写两个Test测试
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="classes" thread-count="3" verbose="2">
<test name="Test">
<classes>
<class name="TestNg.paraller.Testone"></class>
<class name="TestNg.paraller.Testtwo"></class>
</classes>
</test>
<test name="Test2">
<classes>
<class name="TestNg.paraller.TestThree"></class>
</classes>
</test>
<listeners>
<listener class-name="report.ExtentReport"></listener>
</listeners>
</suite>
会先执行第一个Test类,在执行第二个Test
Test级别
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="tests" thread-count="3" verbose="2">
<test name="Test" preserve-order="true" enabled="true">
<classes>
<class name="TestNg.paraller.Testone"></class>
<class name="TestNg.paraller.Testtwo"></class>
</classes>
</test>
<test name="Test2">
<classes>
<class name="TestNg.paraller.TestThree"></class>
</classes>
</test>
<listeners>
<listener class-name="report.ExtentReport"></listener>
</listeners>
</suite>
在test级别运行,上下两个test是一起运行的,上面运行一个方法,下面也运行一个方法
instances级并发
package TestNg.paraller;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
public class FactoryTest {
private String host;
private int port;
public FactoryTest(String host, int port)
{
this.host=host;
this.port=port;
}
@Test
public void login()
{
long id = Thread.currentThread().getId();
System.out.println("login, host:"+host+";port"+port+";id:"+id);
}
@Test(dependsOnMethods="login")
public void logout()
{
long id = Thread.currentThread().getId();
System.out.println("logout, host:"+host+";port"+port+";id:"+id);
}
@Factory
public static Object[] create()
{
List<FactoryTest> list = new ArrayList<FactoryTest>();
list.add(new FactoryTest("10.10.10.1", 8080));
list.add(new FactoryTest("10.10.10.2", 8080));
return list.toArray();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="instances" thread-count="4" verbose="2">
<test name="Test" preserve-order="true" enabled="true">
<classes>
<class name="TestNg.paraller.FactoryTest"></class>
</classes>
</test>
<listeners>
<listener class-name="report.ExtentReport"></listener>
</listeners>
</suite>
测试结果如下:
测试用例级并发
线程池为3,一次执行6次,时间为1000毫秒
package TestNg.paraller;
import org.testng.annotations.Test;
public class ThreadTest {
@Test(threadPoolSize = 3, invocationCount = 6, timeOut = 1000)
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);
}
}
通过suit 和test标签设定测试用例的顺序以及测试的并发性,可以用来实现并发执行多测试用例。