testng入门教程12 TestNG执行多线程测试
testng入门教程 TestNG执行多线程测试
testng入门教程 TestNG执行多线程测试
并行(多线程)技术在软件术语里被定义为软件、操作系统或者程序可以并行地执行另外一段程序中多个部分或者子组件的能力。TestNG允许我们以并行(多线程)的方式来执行测试。这就意味着基于TestNG测试组件的配置,多个线程可以被同时启动然后分别执行各自的测试方法。相对于传统的单线程执行测试的方式,这种多线程方式拥有很大的优势,主要是它可以减少测试运行时间,并且可以验证某段代码在多线程环境中运行的正确性。
目录
- 并行执行测试的优势
 - 如何并行地执行测试方法
 - 如何并行地执行测试类
 - 如何并行地执行同一测试套件内的各个测试组件
 - 如何配置需要在多线程环境中执行的测试方法
 
并行执行测试的优势
并行(多线程)执行测试可以给用户带来很多好处,主要包括以下两点:
1)减少了执行时间:并行测试也就意味着多个测试可以在同一时间被同时执行,从而减少了整体测试所花费的时间。
2)允许多个线程并行地测试同一个测试组件:有了这个特性,我们就能够写出相应的测试用例来验证应用程序中包含多线程部分的代码的正确性。
以上特性被广泛地应用在QA领域的自动化功能测试方面。通过简单的配置,QA人员就可以很轻松地使得他们的测试用例在多个浏览器或者操作系统中并行地执行。
TestNG提供了三种不同类型的配置方案来实现并行测试。
如何并行地执行测试方法
TestNG为我们提供了多种方式来实现并行测试,其中一种就是每一个独立的线程分别执行各自的测试方法。这种方式能够显著地减少测试执行时间,这是因为当有越多的测试方法被并行执行时,总体测试消耗时间将会越少。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
 | 
package com.howtodoinjava.parallelism;import org.testng.annotations.AfterMethod;import org.testng.annotations.BeforeMethod;import org.testng.annotations.Test;public class ParallelMethodTest{    @BeforeMethod    public void beforeMethod() {        long id = Thread.currentThread().getId();        System.out.println("Before test-method. Thread id is: " + id);    }    @Test    public void testMethodsOne() {        long id = Thread.currentThread().getId();        System.out.println("Simple test-method One. Thread id is: " + id);    }    @Test    public void testMethodsTwo() {        long id = Thread.currentThread().getId();        System.out.println("Simple test-method Two. Thread id is: " + id);    }    @AfterMethod    public void afterMethod() {        long id = Thread.currentThread().getId();        System.out.println("After test-method. Thread id is: " + id);    }} | 
上述测试类包含了两个测试方法,每个测试方法在执行时都会在控制台中打印出一条信息。每个测试方法以及它们各自的beforeMehod、afterMethod方法都会通过Thread.currentThread.getId()这段代码打印出执行该测试方法的线程的ID。
在项目中新建一个名为methods-test-testng.xml的文件并将下述代码写入该文件中。
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
<suite name="Test-method Suite" parallel="methods" thread-count="2" >  <test name="Test-method test" group-by-instances="true">    <classes>      <class name="com.howtodoinjava.parallelism.ParallelMethodTest" />    </classes>  </test></suite> | 
在Eclipse中选中该文件并且以TestNG测试套件方式运行它。你将会在控制台中看到以下输出信息:
| 
 1 
2 
3 
4 
5 
6 
 | 
Before test-method. Thread id is: 10Before test-method. Thread id is: 9Simple test-method Two. Thread id is: 10Simple test-method One. Thread id is: 9After test-method. Thread id is: 10After test-method. Thread id is: 9 | 
注意:上述截图中的ThreadId可能与你本地控制台中输出的ThreadId不同,这是因为ThreadId的值是在程序运行时由JVM动态指派的。
从上述测试结果中我们可以很清晰地看出:上述两个测试方法以及各自相应的beforeMethod和afterMethod方法是在两个独立的线程中执行的。我们可以通过在控制台中输出的ThreadId来证明这一点。
如何并行地执行测试类
在下个例子中,我们会说明如何并行地执行测试类:同一个测试组件(test execution)中的各个测试类将会在独立的线程中并行地执行。
ParallelClassesTestOne.java
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
 | 
public class ParallelClassesTestOne{    @BeforeClass    public void beforeClass() {        long id = Thread.currentThread().getId();        System.out.println("Before test-class. Thread id is: " + id);    }    @Test    public void testMethodOne() {        long id = Thread.currentThread().getId();        System.out.println("Sample test-method One. Thread id is: " + id);    }    @Test    public void testMethodTwo() {        long id = Thread.currentThread().getId();        System.out.println("Sample test-method Two. Thread id is: " + id);    }    @AfterClass    public void afterClass() {        long id = Thread.currentThread().getId();        System.out.println("After test-class. Thread id is: " + id);    }} | 
ParallelClassesTestTwo.java
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
 | 
public class ParallelClassesTestTwo{    @BeforeClass    public void beforeClass() {        long id = Thread.currentThread().getId();        System.out.println("Before test-class. Thread id is: " + id);    }    @Test    public void testMethodOne() {        long id = Thread.currentThread().getId();        System.out.println("Sample test-method One. Thread id is: " + id);    }    @Test    public void testMethodTwo() {        long id = Thread.currentThread().getId();        System.out.println("Sample test-method Two. Thread id is: " + id);    }    @AfterClass    public void afterClass() {        long id = Thread.currentThread().getId();        System.out.println("After test-class. Thread id is: " + id);    }} | 
在项目中新建一个名为classes-test-testng.xml的文件并将下述代码写入该文件中:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
<suite name="Test-class Suite" parallel="classes" thread-count="2" >  <test name="Test-class test" >    <classes>      <class name="com.howtodoinjava.parallelism.ParallelClassesTestOne" />      <class name="com.howtodoinjava.parallelism.ParallelClassesTestTwo" />    </classes>  </test></suite> | 
在Eclipse中选中该文件并且以TestNG测试套件方式运行它。你将会在控制台中看到以下输出信息:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
Before test-class. Thread id is: 10Before test-class. Thread id is: 9Sample test-method One. Thread id is: 9Sample test-method One. Thread id is: 10Sample test-method Two. Thread id is: 10After test-class. Thread id is: 10Sample test-method Two. Thread id is: 9After test-class. Thread id is: 9 | 
从上述测试结果中我们可以很清晰地看出:上述两个测试类以及各自相应的beforeClass和afterClass方法是在独立的两个线程中执行的。我们可以通过在控制台中输出的ThreadId来证明这一点。
如何并行地执行同一测试套件内的各个测试组件
接下来我们会一起学习如何并行地执行同一个测试套件内的各个测试组件,即各个测试组件会分别在独立的线程中执行。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
 | 
package com.howtodoinjava.parallelism;import org.testng.annotations.AfterClass;import org.testng.annotations.AfterTest;import org.testng.annotations.BeforeClass;import org.testng.annotations.BeforeTest;import org.testng.annotations.Parameters;import org.testng.annotations.Test;public class ParallelSuiteTest{    String testName = "";    @BeforeTest    @Parameters({ "test-name" })    public void beforeTest(String testName) {        this.testName = testName;        long id = Thread.currentThread().getId();        System.out.println("Before test " + testName + ". Thread id is: " + id);    }    @BeforeClass    public void beforeClass() {        long id = Thread.currentThread().getId();        System.out.println("Before test-class " + testName + ". Thread id is: "                + id);    }    @Test    public void testMethodOne() {        long id = Thread.currentThread().getId();        System.out.println("Sample test-method " + testName                + ". Thread id is: " + id);    }    @AfterClass    public void afterClass() {        long id = Thread.currentThread().getId();        System.out.println("After test-method  " + testName                + ". Thread id is: " + id);    }    @AfterTest    public void afterTest() {        long id = Thread.currentThread().getId();        System.out.println("After test  " + testName + ". Thread id is: " + id);    }} | 
在项目中新建一个名为suite-test-testng.xml的文件并将以下代码写入该文件中:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
 | 
<suite name="Test-class Suite" parallel="tests" thread-count="2">    <test name="Test-class test 1">        <parameter name="test-name" value="test-method One" />        <classes>            <class name="com.howtodoinjava.parallelism.ParallelSuiteTest" />        </classes>    </test>    <test name="Test-class test 2">        <parameter name="test-name" value="test-method One" />        <classes>            <class name="com.howtodoinjava.parallelism.ParallelSuiteTest" />        </classes>    </test></suite> | 
在Eclipse中选中该文件并且以TestNG测试套件方式运行它。你将会在控制台中看到以下输出信息:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
Before test Test One. Thread id is: 9Before test Test Two. Thread id is: 10Before test-class Test One. Thread id is: 9Before test-class Test Two. Thread id is: 10Sample test-method Test One. Thread id is: 9Sample test-method Test Two. Thread id is: 10After test-method  Test Two. Thread id is: 10After test-method  Test One. Thread id is: 9After test  Test One. Thread id is: 9After test  Test Two. Thread id is: 10 | 
从上述测试结果中我们可以很清晰地看出:上述两个测试组件是在独立的两个线程中分别执行的。我们可以通过在控制台中输出的ThreadId来证明这一点。
如何配置一个需要在多线程环境中执行的测试方法
之前我们讨论了如何并行(多线程)地执行测试方法,测试类以及测试组件。TestNG同时也提供了一种灵活的方式来配置需要在多线程环境下运行的测试方法:只要在该测试方法的@Test注解上配置一些信息,我们就能启用多线程模式。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
public class IndependentTest{    @Test(threadPoolSize = 3, invocationCount = 6, timeOut = 1000)    public void testMethod()    {        Long id = Thread.currentThread().getId();        System.out.println("Test method executing on thread with id: " + id);    }} | 
上述测试方法是通过在@Test注解中配置threadPoolSize这个属性来进入多线程模式的。threadPoolSize被设为3,这就说明了该测试方法将会在三个不同的线程中同时执行。剩余两个属性:invocationCount配置的是该测试方法应被执行的总次数,timeOut配置的是每次执行该测试方法所耗费时间的阈值,超过阈值则测试失败。
在项目中新建一个名为independent-test-testng.xml的文件,并写入下述代码:
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
<suite name="Independent test Suite" >  <test name="Independent test">    <classes>     <class name="com.howtodoinjava.parallelism.IndependentTest" />    </classes>  </test></suite> | 
在Eclipse中选中该文件并以TestNG测试套件方式运行。你将会在控制台中看到以下输出信息
| 
 1 
2 
3 
4 
5 
6 
 | 
Test method executing on thread with id: 11Test method executing on thread with id: 10Test method executing on thread with id: 9Test method executing on thread with id: 11Test method executing on thread with id: 11Test method executing on thread with id: 10 | 
在这里,我们可以看出该测试方法被执行了多次,而且它的执行次数跟invocationCount所指定的次数相同。而且从输出信息中,我们也可以很清晰地看到该测试方法每次执行都是在不同的线程中完成的。当我们需要按照某一固定次数,在多线程环境下运行某些测试方法时,上述特性会很有帮助,因为它避免了我们把整个测试套件都并行执行多次的代价。
原文链接: Lokesh Gupta 翻译: ImportNew.com- 杨 昆仑
译文链接: http://www.importnew.com/14508.html
testng入门教程12 TestNG执行多线程测试的更多相关文章
- testng入门教程10 TestNG参数化测试
		
在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大的不同数量的测试.参数测试,允许开发人员运行同样的测试,一遍又一遍使用不同的值. TestNG让你 ...
 - testng入门教程9 TestNG依赖测试
		
有时候,你可能需要在一个特定的顺序调用方法在测试案例,或你想分享一些数据和方法之间的状态.TestNG支持这种依赖测试方法之间的显式依赖它支持声明. TestNG允许指定依赖,无论与否: 使用属性de ...
 - testng入门教程8 TestNG异常测试
		
TestNG跟踪异常处理代码提供了一个选项.可以测试是否需要代码抛出异常或不抛出. @Test注释expectedExceptions 参数一起使用.现在,让我们来看看@Test(expectedEx ...
 - testng入门教程7 TestNG组测试
		
在TestNG中组测试是一个新的创新功能,它不存在于JUnit框架,它允许调度到适当的部分方法和瓶坯复杂的测试方法分组.您不仅可以声明属于群体的那些方法,但你也可以指定一组包含其他组.然后,TestN ...
 - testng入门教程6 TestNG忽略测试
		
有时,我们的代码是没有准备好,如果测试用例写入到测试方法/代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例. 测试方法是标注了@Test(enabled ...
 - TestNG入门教程-12-Java代码执行testng.xml和失败后重跑
		
前面我们都在IDEA上右键testng.xml文件来运行testng用例,这个在编写测试用例过程是 可以这么做,但是,如果测试用例写完了,也是这么做吗?有没有什么方法,例如自动化去实现.测试脚本维护后 ...
 - testng入门教程11 TestNG运行JUnit测试
		
现在,您已经了解了TestNG和它的各种测试,如果现在担心如何重构现有的JUnit代码,那就没有必要,使用TestNG提供了一种方法,从JUnit和TestNG按照自己的节奏.也可以使用TestNG执 ...
 - TestNG 入门教程【转】
		
TestNG 入门教程[转] 国庆7天假期,大部分朋友都出去旅游了,微信圈里全是晒旅游的照片, 东南亚游,欧洲游呀,真是羡慕呀. 悲惨的我只去了上海野生动物园, 在家休息,利用这段假期,把之前学过的东 ...
 - testng入门教程16数据驱动(把数据写在xml)
		
testng入门教程16数据驱动(把数据写在xml) testng入门教程16数据驱动(把数据写在xml)把数据写在xml文件里面,在xml文件右键选择runas---testng执行 下面是case ...
 
随机推荐
- CSS改变插入光标颜色caret-color简介及其它变色方法(转)
			
一.CSS改变输入框光标颜色的原生属性caret-color CSS caret-color属性可以改变输入框插入光标的颜色,同时又不改变输入框里面的内容的颜色. 例如: input { color: ...
 - Android studio Unable to start the daemon process
			
Unable to start the daemon process.This problem might be caused by incorrect configuration of the da ...
 - 数据库操作相关(sql语句-php)
			
文件:db.config.smarty.php 这个文件主要是用于数据库配置 <?php $db = array( 'host'=>'localhost', 'user'=>'roo ...
 - python计算均值方差
			
用Python求均值与方差,可以自己写,也可以借助于numpy,不过到底哪个快一点呢? 我做了个实验,首先生成9百万个样本: nlist=range(0,9000000) nlist=[float(i ...
 - Python 重定向获取真实url
			
通常的返回url: http_headers = { 'Accept': '*/*','Connection': 'keep-alive', 'User-Agent': 'Mozilla/5.0 (W ...
 - 计蒜客 30990 - An Olympian Math Problem - [简单数学题][2018ICPC南京网络预赛A题]
			
题目链接:https://nanti.jisuanke.com/t/30990 Alice, a student of grade 6, is thinking about an Olympian M ...
 - array string mysql IN LIKE
			
$ids = $_POST['ids']; $str = implode(',',$ids); $str = '('.$str.')'; $db_region->region_del($str) ...
 - Common Gateway Interface  Python CGI编程
			
https://en.wikipedia.org/wiki/Gateway_(telecommunications) In telecommunications, the term gateway r ...
 - Python日期格式化知识
			
Python中日期格式化是非常常见的操作,Python 中能用很多方式处理日期和时间,转换日期格式是一个常见的功能.Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时 ...
 - Ubuntu 16.04配置国内高速apt-get更新源
			
https://www.linuxidc.com/Linux/2017-11/148627.htm Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更 ...