当我们有成千上万个自动化测试用例时,为了提高测试用例的执行速度,往往我们需要对测试用例进行并发执行。并发执行的方式很多,而较为简单的方式就是通过TestNG提供的并发来完成。


DataProvider 的并发

上节我们已经知道了如果通过@DataProvider进行数据驱动,那当我们有多个数据源时我们想一次性执行多个数据源该如何设置呢?
我们只需要在DataProvider 标签中添加 parallel参数并设置值为true便可。

代码例子:

  1. @DataProvider(name = "data1",parallel = true)
  2. public Object[][] data2() {
  3. return new String[][]{
  4. {"name", "gsfdg", "fadsf"},{"a","v","c"}
  5. };
  6. }
  7. //在@Test注解中指定dataProvider参数并设置获取数据的来源 testData
  8. @Test(dataProvider = "data1")
  9. public void dataDriverTest(String name, String i, String b) throws InterruptedException {
  10. System.out.println(name + i + b);
  11. Thread.sleep(5000);
  12. }

代码里面我们在data2()方法中添加了@DataProvider注解,并添加了parallel=true参数,那么所有用到该数据源的测试方法都将并发执行,所以如下图当这个脚本运行起来时,我们会发现IDEA 同时执行多个测试。但是当我们的数据源操作10条时,默认同时执行10条数据,也就是DataProvider的默认线程为10。那如何更改这个默认值呢?这时我们就得去修改TestNG的执行xml文件。

13-2-Web-自动化测试----并发执行 - 图1


TestNG 执行xml文件介绍

以往我们在执行@Test时,往往是通过IDE工具直接选取方法或者类右键 —> run 的方式来执行,其实真正执行的是一个xml文件,这个xml文件InteliJ IEDA会默认生成于: C:\Users\用户名.IntelliJIdea\system 底下的“temp-testng-customsuite.xml”。

我们简单查看下这个文件。层级由外到内分别为suite -> test -> class -> method 。一个里面可以包含多个,一个里面可以包含多个,并用嵌套。里面又可以包含。

看到这个suite,test,class,method是不是想起TestNG的注解,BeforeSuite、AfterSuite、BeforeTest、AfterTest、BeforeClass、AfterClass、BeforeMethod、AfterMethod。之前你可能还分不清他们之间的执行顺序,这回对应上这个xml文件,是不是就容易理解了,例如里面包含了两个class,两个class都包含了BefreSuite方法, 那么执行时,会优先执行完成这个两个BefreSuite。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  3. <suite name="Default Suite">
  4. <!-- name 属性值可以随便取 -->
  5. <test name="Selenium_Demo_v3">
  6. <classes>
  7. <class name="com.selenium.demo.TestDemo">
  8. <!--被运行的Class 名-->
  9. <class name="com.selenium.demo.WaitTest">
  10. <methods>
  11. <!--include 表示运行该 Test-->
  12. <include name="waitTest"/>
  13. <!--exclude 表示不运行改类下的该 Test-->
  14. <exclude name="test1"/>
  15. </methods>
  16. </class> <!-- com.selenium.demo.WaitTest -->
  17. </classes>
  18. </test> <!-- Selenium_Demo_v3 -->
  19. </suite> <!-- Default Suite -->

设定DataProvider 的并发数

当我们知道初步了解了TestNG的执行xml后,我们只需要简单修改下标签,在里面添加“data-provider-thread-count”属性并设置值,那么我们就可以设定DataProvider的并发数。

<suite name="Default Suite" data-provider-thread-count="20">

注意通过IDEA执行时,不可以在测试方法上右键 —>run ,而是需要在执行的xml文件上右键 —>run


test,class , method 级别的并发

TestNG除了支持DataProvider的并发外,也支持test, class , method 级别的并发。设置基本一样都是在 标签添加parallel 和 thread-count 参数,其中parallel参数表示采用哪种级别的并发,thread-count参数表示并发的线程数,如下示例:

<suite name="Default Suite" parallel="tests" thread-count="10">
<suite name="Default Suite" parallel="classes" thread-count="10">
<suite name="Default Suite" parallel="methods" thread-count="10">

说明:

tests 级别:我们在执行的xml中配置多个标签,则每个标签内的测试用例执行在同一个线程中。
classes 级别: 我们在执行的xml中配置多个标签,则每个标签内的测试运行在同一个线程中。
methods 级别:则运行所有的执行xml中配置的测试用例都于不同的线程中。


并发的带来的问题

尽管并发可以大大缩短我们的测试时间,但是从实践中我们会发现做并发执行脚本时,对脚本的设计需要考虑更多复杂的场景,例如脚本与脚本间依赖等,脚本的测试数据传递等等都需要在编写脚本时考虑进来。