TestNG并行执行

时间:2020-02-23 14:41:57  来源:igfitidea点击:

我们可以并行运行TestNG测试。
仅当我们使用TestNG XML套件执行测试用例时,此功能才可用。

TestNG默认测试执行

当我们运行TestNG类时,方法按照其名称的字母顺序出现。
让我们看一个简单的TestNG测试类。

package com.theitroad.parallel;

import java.time.LocalDateTime;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class NewTest {
	@Test(dataProvider = "dp")
	public void foo(Integer n) {
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Foo Executing Input = " + n);
	}
	
	@Test(dataProvider = "dp")
	public void bar(Integer n) {
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Bar Executing Input = " + n);
	}

	@DataProvider
	public Object[] dp() {
		Object[] ints = new Object[100];
		for (int i = 0; i < 100; i++)
			ints[i] = i;
		return ints;
	}

	@AfterTest
	public void afterTest() {
		System.out.println("After Test Time = " + LocalDateTime.now());
	}

	@BeforeTest
	public void beforeTest() {
		System.out.println("Before Test Time = " + LocalDateTime.now());
	}

}

当我们在类上运行时,它将生成如下所示的输出。

Before Test Time = 2016-06-01T15:03:21.406219
Bar Executing Input = 0
Bar Executing Input = 1
...
Bar Executing Input = 99
Foo Executing Input = 0
Foo Executing Input = 1
...
Foo Executing Input = 99
After Test Time = 2016-06-01T15:03:24.058081

注意,bar()方法首先被执行,一旦所有测试执行结束,便执行foo()方法。

下面的XML套件文件将获得类似的结果。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNGXMLTest Test Suite">
	<test name="TestNGXMLTest Test" verbose="2">
		<classes>
			<class name="com.theitroad.parallel.NewTest" 
		</classes>
	</test>
</suite>

并行的TestNG方法

由于这两种测试方法无关,我们可以并行运行它们并节省时间。
为了达到这个目的,我们将不得不在我们的"测试"中添加"并行"和"线程计数"。

以下是我们更新的XML套件文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNGXMLTest Test Suite">
	<test name="TestNGXMLTest Test" verbose="2" parallel="methods" thread-count="2">
		<classes>
			<class name="com.theitroad.parallel.NewTest" 
		</classes>
	</test>
</suite>

运行测试套件时,将获得以下输出。

Before Test Time = 2016-06-01T15:06:38.268674
Bar Executing Input = 0
Foo Executing Input = 0
...
Foo Executing Input = 99
After Test Time = 2016-06-01T15:06:39.572976

注意,通过并行运行测试方法,我们几乎将测试执行时间减少了一半。

TestNG并行执行要点

  • 我们可以对测试和套件元素都使用" parallel"属性。

  • 并行属性的可能值为:方法,测试,类和实例。
    我们已经看到了如何并行执行方法。

  • 在较旧的TestNG版本中,还允许并行值使用true和false,但现在已弃用它们。

并行运行TestNG的类

假设我们要并行运行测试类。
我们还希望测试类中的方法能够并行运行。
我们可以通过在套件级别使用" parallel =" classes"",在测试级别使用" parallel =" methods""来做到这一点。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNGXMLTest Test Suite" parallel="classes">
	<test name="TestNGXMLTest Test" verbose="2" parallel="methods"
		thread-count="10">
		<classes>
			<class name="com.theitroad.parallel.NewTest" 
			<class name="com.theitroad.utils.TestUtils" 
			<class name="com.theitroad.main.Test5" 
		</classes>
	</test>
</suite>

TestNG Suite运行并行测试

让我们看一个更复杂的示例,其中我们并行运行TestNG套件测试。
再次将其中一些测试配置为并行执行类/方法。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="TestNGXMLTest Test Suite" parallel="classes">
	<test name="TestNGXMLTest Test 1" verbose="2" parallel="tests"
		thread-count="10">
		<classes>
			<class name="com.theitroad.main.Test5" 
		</classes>
	</test>
	<test name="TestNGXMLTest Test 2" verbose="2" parallel="classes"
		thread-count="10">
		<classes>
			<class name="com.theitroad.utils.TestUtils" 
			<class name="com.theitroad.main.Test5" 
		</classes>
	</test>
	<test name="TestNGXMLTest Test 3" verbose="2" parallel="methods"
		thread-count="10">
		<classes>
			<class name="com.theitroad.parallel.NewTest" 
		</classes>
	</test>
</suite>