一、为什么使用多线程测试?
传统的测试使用单线程执行,多线程可以提高测试用例的执行效率。
二、如何使用?
- 注解实现
- xml实现
三、xml实现test,class,method级别的并发
test,class,method级别的并发,可以通过在testng.xml中的suite tag下设置,如:
<suite name="Testng Parallel Test" parallel="tests" thread-count="5">
<suite name="Testng Parallel Test" parallel="classes" thread-count="5">
<suite name="Testng Parallel Test" parallel="methods" thread-count="5">
它们的共同点都是最多起5个线程去同时执行不同的用例。
它们的区别如下:
- methods级别:所有用例都可以在不同的线程去执行。
- classs级别:不同class tag下的用例可以在不同的线程执行,相同class tag下的用例只能在同一个线程中执行。
- tests级别:不同test tag下的用例可以在不同的线程执行,相同test tag下的用例只能在同一个线程中执行。
搞清楚并发的级别非常重要,可以帮我们合理地组织用例,比如将非线程安全的测试类或group统一放到一个test中,这样在并发的同时又可以保证这些类里的用例是单线程执行。也可以根据需要设定class级别的并发,让同一个测试类里的用例在同一个线程中执行。
四、案例
案例1-注解
注解实现method级别的并发
import org.testng.annotations.Test;
public class MultiThreadByAnnotation {
//threadPoolSize为线程池内可以使用的线程数
//使用threadPoolSize个线程,将test方法执行invocationCount次
//timeOut配置的是每次执行该测试方法所耗费时间的阈值,超过阈值则测试失败
@Test(invocationCount = 10, threadPoolSize = 3,timeOut = 1000)
public void test(){
System.out.println("hello");
System.out.println("Thread Id: " + Thread.currentThread().getId());
}
}
执行MultiThreadByAnnotation,结果如下
使用了3个线程,将测试方法test执行了10次。
案例2-xml-parallel=“methods”
import org.testng.annotations.Test;
public class MultiThreadByXml {
@Test
public void test1(){
System.out.println("test1---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test2(){
System.out.println("test2---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test3(){
System.out.println("test3---Thread Id : " + Thread.currentThread().getId());
}
}
multiThread.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--parallel="methods",表示多线程级别为方法级别-->
<!--thread-count="2",表示线程数为2-->
<suite name="thread" parallel="methods" thread-count="5">
<test name="demo1">
<classes>
<class name="com.course.testng.multiThread.MultiThreadByXml"></class>
</classes>
</test>
</suite>
执行multiThread.xml,结果如下
案例3-xml-parallel=“classes”
import org.testng.annotations.Test;
public class MultiThreadByXml {
@Test
public void test1(){
System.out.println("test1---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test2(){
System.out.println("test2---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test3(){
System.out.println("test3---Thread Id : " + Thread.currentThread().getId());
}
}
import org.testng.annotations.Test;
public class MultiThreadByXml2 {
@Test
public void test21(){
System.out.println("test21---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test22(){
System.out.println("test22---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test23(){
System.out.println("test23---Thread Id : " + Thread.currentThread().getId());
}
}
import org.testng.annotations.Test;
public class MultiThreadByXml3 {
@Test
public void test31(){
System.out.println("test31---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test32(){
System.out.println("test32---Thread Id : " + Thread.currentThread().getId());
}
@Test
public void test33(){
System.out.println("test33---Thread Id : " + Thread.currentThread().getId());
}
}
multiThread.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--parallel="classes",表示多线程级别为class-->
<!--thread-count="2",表示线程数为2-->
<suite name="thread" parallel="classes" thread-count="2">
<test name="demo1">
<classes>
<class name="com.course.testng.multiThread.MultiThreadByXml"></class>
<class name="com.course.testng.multiThread.MultiThreadByXml2"></class>
</classes>
</test>
<test name="demo2">
<classes>
<class name="com.course.testng.multiThread.MultiThreadByXml3"></class>
</classes>
</test>
</suite>
案例4-xml-parallel=“tests”
multiThread.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--parallel="tests",表示多线程级别为test级别-->
<!--thread-count="2",表示线程数为2-->
<suite name="thread" parallel="tests" thread-count="2">
<test name="demo1">
<classes>
<class name="com.course.testng.multiThread.MultiThreadByXml"></class>
</classes>
</test>
<test name="demo2">
<classes>
<class name="com.course.testng.multiThread.MultiThreadByXml2"></class>
</classes>
</test>
</suite>
执行multiThread.xml,结果如下
网上看到一篇testng并发比较好的文章,分享下 简单聊聊 TestNG 中的并发