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>