测试用例并行运行
举例一个场景,有时我们会希望让多个测试用例并发的执行,去定位或者复现相关问题,那么怎么操作呢?
- 先来讲下TestNG测试用例并发运行有几种方式
- 运行的xml文件中配置
suite
,其中可以分四中并行方式,分别method
,tests
,classes
,instances
@Test
中设置参数threadPoolSize
- 运行的xml文件中配置
先来看xml
的配置方式
- parallel=“methods”
<suite name="My suite" parallel="methods" thread-count="5">
parallel="methods"
,TestNG会给每一个<methods>
下的<method>
的方法都起一个单独的线程去运行,即使方法之间存在依赖关系,也会以单独的线程去运行,但是这时候会按照你设置好的顺序,逐个起线程去运行,而非并发的形式。
单独方法运行也可以直接在Class中设置,如下:
@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000)
public void testServer() {
}
其中threadPoolSize
代表线程池的大小,invocationCount
代表测试用例执行的总次数,timeout
代表超时时间,既超出设置时间,所有线程必须终止。
- parallel=“tests”
<suite name="My suite" parallel="tests" thread-count="5">
parallel="tests"
,TestNG会给每个<tests>
下的<test>
都起一个单独的线程运行<test>
下所有测试用例,所以如果你存在多个线程不安全的测试用例,你就可以把他们放到同一个<test>
下的<classes>
中,在一个线程中按顺序执行。
- parallel=“classes”
<suite name="My suite" parallel="classes" thread-count="5">
paralledl="class"
,TestNG会启动独立的线程运行每个class中的所有method。
- parallel=“instances”
<suite name="My suite" parallel="instances" thread-count="5">
parallel="instances"
,TestNG会在一个线程里运行相同实例的所有方法,但是不同实例的方法由不同的线程运行。
还有一个细节,parallel参数只有在suite中才能设置,suite中还可以设置thread-count,既允许最多启动多少个线程执行任务。
xml和@Test配置结合使用
场景设想:
由于xml中只能把parallel参数设置在suite中,这样一来如果设置的是methods
,那么所有的运行方式都是一样的,自然这样对于只是想简单并发下是OK的,但是如果想几个method
以不同的方式运行,明显是无法满足的。那怎么办呢?xml
和@Test
结合使用就可以解决这个问题。
- 先来看个
xml
配置:
<suite name="Cancel Plan" verbose="1" parallel="methods">
<test name="Regression1">
<classes>
<class name="com.http.***.transfers.PlanInBoundTest">
<methods>
<include name="testInRuleIssued" />
<include name="testUpdateCancelFlag" />
</methods>
</class>
</classes>
</test>
</suite>
上面这个xml配置了parallel="methods"
,所以PlanInBoundTest
中的两个方法testInRuleIssued
和testUpdateCancelFlag
会并行的在两个不同线程中执行。但是现在需要testInRuleIssued
同时在三个线程中运行,testUpdateCancelFlag
只在一个线程中运行,那么我们可以这样设置两个method的@Test:
@Test(threadPoolSize = 3, invocationCount = 50)
void testInRuleIssued() {
}
/**
* 测试取消入库计划
*/
@Test(invocationCount = 50)
void testUpdateCancelFlag() {
}
当启动两个线程分别运行testInRuleIssued
和testUpdateCancelFlag
,发现testInRuleIssued
还配置了threadPoolSize=3
,那么就会按照这个配置来运行测试用例,所以这时会启动三个线程运行testInRuleIssued
方法,总计运行50次;另外会启动一个线程运行testUpdateCancelFlag
五十次。