Goal:并行独立运行 2 个类,其中每个测试将方法名称存储到稍后可以在测试中访问的变量中。
Issue:当测试并行运行时,它们开始在彼此之间共享数据,从而破坏测试。
如果您看到控制台输出,则这是错误的:
INFO: Name of Test from Before Method: classB_Method1
INFO: Name of Test from Before Method: classB_Method1
由于这是两个独立的类并且正在运行方法。和
我在这里设置了正确的名称:
!! Setting Method name to: classA_Method1
!! Setting Method name to: classB_Method1
输出应如下所示:
INFO: Name of Test from Before Method: classA_Method1
INFO: Name of Test from Before Method: classB_Method1
TestA
import java.lang.reflect.Method;
import org.testng.annotations.*;
import com.xxxx.util.*;
public class TestA {
@Test(/*dataProvider = "DP_MVPLoan_Login",*/ groups = {"parallel_test" }, invocationCount = 1, priority = 2, enabled = true)
public void classA_Method1(/*String... excelData*/) throws Exception {
}
/////////////////////////////////////////////////////////////////////////////
// ****SetUp and Tear Down
@BeforeTest(alwaysRun=true)
public void setupClass() throws Exception {
}
@BeforeMethod(alwaysRun=true)
public void setupMethod(Method method) throws Exception {
SeleniumHelperDebug.setCurrentMethodName(method.getName());
SeleniumHelperDebug.defaultBeforeMethod();
}
}
TestB
import java.lang.reflect.Method;
import org.testng.annotations.*;
import com.xxxx.util.*;
public class TestB {
@Test(/*dataProvider = "DP_MVPLoan_Login",*/ groups = { "parallel_test" }, invocationCount = 1, priority = 2, enabled = true)
public void classB_Method1(/*String... excelData*/) throws Exception {
}
/////////////////////////////////////////////////////////////////////////////
// ****SetUp and Tear Down
@BeforeTest(alwaysRun=true)
public void setupClass() throws Exception {
}
@BeforeMethod(alwaysRun=true)
public void setupMethod(Method method) throws Exception {
SeleniumHelperDebug.setCurrentMethodName(method.getName());
SeleniumHelperDebug.defaultBeforeMethod();
}
}
辅助方法
public class SeleniumHelperDebug {
//Name of the method/Test being run
private static String currentMethodName;
public static String getCurrentMethodName() {
return currentMethodName;
}
public static void setCurrentMethodName(String currentMethodName) {
System.out.println("!! Setting Method name to: "+ currentMethodName);
SeleniumHelperDebug.currentMethodName = currentMethodName;
}
//Setup Method. BeforeTest
public static void defaultBeforeMethod() throws Exception {
Thread.sleep(500);
/*setCurrentMethodName(method.getName());*/
System.out.println("INFO: Name of Test from Before Method: " +getCurrentMethodName() );
System.out.println("REMINDER: Keep Browser Window in Foreground to Help prevent F@ilures");
}
}
测试文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" verbose="2" thread-count="2">
<!--
<listeners>
<listener class-name="com.progressfin.util.WebDriverListener"></listener>
</listeners -->>
<tests>
<test name="Test" preserve-order="true">
<!-- <parameter name="browserName" value="firefox"></parameter> -->
<groups>
<run>
<include name="parallel_test"/>
</run>
</groups>
<classes>
<class name="com.xxxx.test.TestA" />
<class name="com.xxxx.test.TestB"/>
</classes>
</test> <!-- Test -->
</tests>
</suite> <!-- Suite -->
控制台输出
...
... TestNG 6.8.6 by Cédric Beust ([email protected] /cdn-cgi/l/email-protection)
...
[TestNG] Running:
C:\Users\samuel.safyan\workspace\JavaSelenium2\testNgParallelism2.xml
[TestRunner] Starting executor for test Test with time out:2147483647 milliseconds.
!! Setting Method name to: classA_Method1
!! Setting Method name to: classB_Method1
INFO: Name of Test from Before Method: classB_Method1
REMINDER: Keep Browser Window in Foreground to Help prevent F@ilures
INFO: Name of Test from Before Method: classB_Method1
REMINDER: Keep Browser Window in Foreground to Help prevent F@ilures
PASSED: classB_Method1
PASSED: classA_Method1
===============================================
Test
Tests run: 2, Failures: 0, Skips: 0
===============================================