我想用测试NG做一个测试设计。硒 和 测试NG,我把每个 @测试 在一个单独的类中,并使用一次 @BeforeSuite & @AfterSuite 为所有类,原因是。
xml
文件。那么我想的是如何只登录一次,而这个会话可以被后续所有的测试使用,目前我做的是。
基地... 类。
public class Base {
protected static WebDriver driver;
@BeforeSuite
public void setup() {
System.setProperty("webdriver.chrome.driver", "/Users/.../chromedriver");
driver = new ChromeDriver();
}
@AfterSuite
public void tearDown() {
driver.quit();
}
}
LoginApps 类。
public class LoginApps extends Base{
@Test(groups= {"logintest"})
@Parameters({"data"})
public void loginApps(String data) {
driver.get("https://TheUrl.com/");
//some code here
}
}
案件1 类。
public class Case1 extends Base{
@Test(dependsOnGroups= {"logintest"})
@Parameters({"data"})
public void case1(String data) {
driver.get("https://TheUrl.com/");
//some code here
}
}
注 : 以上代码在单机运行时可以正常工作。<test>
在套件中。
问题是如果像下面这样并行运行的话 xml
配置。
testng.xml:
<suite name="SuiteTest" parallel="tests" thread-count="2">
<test name="Test1">
<parameter name="data" value="data1"></parameter>
<classes>
<class name="com.main.LoginApps"/>
<class name="com.main.Case1"/>
.....
More class
</classes>
</test>
<test name="Test2">
<parameter name="data" value="data2"></parameter>
<classes>
<class name="com.main.LoginApps"/>
<class name="com.main.Case1"/>
.....
More class
</classes>
</test>
</suite>
该代码通过创建 driver
实例只需一次,而这两个 <test>
在同一会话中重叠运行。我想这是由于我在声明 driver
作为 static
在 基地 类。但如果我把 static
这将使事情变得更糟,仍然会造成 driver
实例只运行一次,代码只运行第一次的 @Test
(在这里只是 登录应用),所有后续的测试将得到一个 NullPointerException
异常。
我使用 测试NG v7.0.0与 Maven :
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
要并行运行我想象中的设计,如何解决?
创建具有线程安全的驱动,确保两次驱动会话都是唯一的。
public class ThreadLocalDriver {
private static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();
public synchronized static void setTLDriver(WebDriver driver) {
threadLocalDriver.set(driver);
}
public synchronized static WebDriver getTLDriver() {
return threadLocalDriver.get();
}
}
public class BaseClass {
@BeforeMethod
public void setup (String deviceName, String platformVersion) throws IOException {
DesiredCapabilities caps = new DesiredCapabilities();
// Add caps here
ThreadLocalDriver.setTLDriver(new ChromeDriver(caps));
}
@AfterMethod
public synchronized void teardown(){
ThreadLocalDriver.getTLDriver().quit();
}
}