并行测试可以提高测试效率,可以在XML配置文件中设置parallel属性来启用并发测试
一、方法中的并发
可以在方法上直接设置线程数和执行次数,在如下例子中threadPoolSize表示线程数,invocationCount表示总的执行次数,表示3个线程,总共执行10次
@Test(threadPoolSize = 3,invocationCount = 10)
public void test(){
Assert.assertEquals(1,1);
System.out.println("Thread "+Thread.currentThread().getId());
}
执行结果

二、XML中的并发
1.基本格式
在testng的配置文件中,层级关系如下所示,每个xml文件只能有一个suite,代表一个测试套件;一个suite中可包含多个test,默认情况下,多个test会顺序执行,若希望多个test以不可预知的顺序运行,可以将preserve-order属性设置为false;每个test里可以写需要运行的测试用例的class,如果不写,默认会执行所有用例;每个class可以指定执行和不执行的用例,如果不写method,默认执行该类全部用例。
-suite:套件,包含一个或多个test
-test:测试集,包含一个或多个classes
-classes:测试类集合,包含一个或多个class
-class:测试类,包含一个或多个方法
在testng中,test、classes、methods级别的并发,可以在testng.xml文件的suite tag中设置,如下所示:
<suite name="parallelTest" parallel="tests" thread-count="3">
<suite name="parallelTest" parallel="classes" thread-count="3">
<suite name="parallelTest" parallel="methods" thread-count="3">
共同点:都是最多启动3个线程来执行用例
不同点:
- tests 级别:不同 test tag 下的用例可以在不同的线程执行,相同 test tag 下的用例只能在同一个线程中执行。
- classes 级别:在test tag相同的前提下,不同 class tag 下的用例可以在不同的线程执行,相同 class tag 下的用例只能在同一个线程中执行。
- methods 级别:所有用例都可以在不同的线程去执行。
2.案例Demo
测试类
Demo1.java
public class Demo1 {
@Test
public void test01(){
Assert.assertEquals(1,1);
System.out.println("Demo1类中的test01:Thread"+Thread.currentThread().getId());
}
@Test
public void test02(){
Assert.assertEquals(1,1);
System.out.println("Demo1类中的test02:Thread"+Thread.currentThread().getId());
}
}
Demo2.java
public class Demo2 {
@Test
public void test03(){
Assert.assertEquals(1,1);
System.out.println("Demo2类中的test03:Thread"+Thread.currentThread().getId());
}
@Test
public void test04(){
Assert.assertEquals(1,1);
System.out.println("Demo2类中的test04:Thread"+Thread.currentThread().getId());
}
}
tests级别的并发
1)相同test tag下的用例,均由同一个线程执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="parallelTest" parallel="tests" thread-count="2">
<test verbose="2" preserve-order="true" name="E:/ideaProject/java_web_auto">
<classes>
<class name="com.web.auto.test.Demo1" />
<class name="com.web.auto.test.Demo2" />
</classes>
</test>
</suite>
执行结果

2)不同test tag下的用例,由不同线程执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="parallelTest" parallel="tests" thread-count="2">
<test name="test01">
<classes>
<class name="com.web.auto.test.Demo1" />
</classes>
</test>
<test name="test02">
<classes>
<class name="com.web.auto.test.Demo2" />
</classes>
</test>
</suite>
执行结果

classes级别的并发
1)在class tag相同的前提下,相同class tag下的用例,均由同一个线程执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="parallelTest" parallel="classes" thread-count="2">
<test name="test01">
<classes >
<class name="com.web.auto.test.Demo1" />
<class name="com.web.auto.test.Demo1" />
</classes>
</test>
</suite>
运行结果

2)在class tag相同的前提下,不同class tag下的用例,由不同线程执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="parallelTest" parallel="classes" thread-count="2">
<test name="test01">
<classes >
<class name="com.web.auto.test.Demo1" />
<class name="com.web.auto.test.Demo2" />
</classes>
</test>
</suite>
运行结果

methods级别的并发
所有用例都可以在不同的线程去执行,即在线程数足够的情况下,每个方法都可以被分配一个独立的线程来执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="parallelTest" parallel="methods" thread-count="5">
<test name="test01">
<classes >
<class name="com.web.auto.test.Demo1" />
<class name="com.web.auto.test.Demo2" />
</classes>
</test>
</suite>
运行结果

1001

被折叠的 条评论
为什么被折叠?



