我正在尝试运行并行测试以配置套件文件。这些测试适用于使用Selenium的Web应用程序。套件文件由多个测试组成。每个测试包含多个测试类。每个测试中的第一个类用于初始化(@BeforeTest)WebDriver并关闭它(@AfterTest)。为了将其传递给其他类,WebDriver是静态的(原因是我们需要从最后一个测试类结束的地方继续进行测试)。
将套件配置为按顺序运行测试时,测试将成功运行。但是,当将该套件配置为并行运行测试时,所有套件测试都仅使用最后加载的Web驱动程序,而每个测试均未在各自的浏览器中运行。
你知道我如何克服这种情况吗?
检查以下套件模板:
<suite name="Register and Login functionality" parallel="tests" thread-count="2">
<test name="Test-1">
<parameter name="browser" value="chrome" />
<classes>
<class name="Init" />
<class name="Register" />
<class name="Login" />
</classes>
</test>
<test name="Test-2">
<parameter name="browser" value="chrome" />
<classes>
<class name="Init" />
<class name="Register" />
<class name="Login" />
</classes>
</test>
</suite>
Init测试类中的模板:
public class Init{
private static WebDriver driver;
public WebDriver getWebDriver(){
return this.driver;
}
@BeforeTest
public void setUp(){
driver = new ChromeWebDriver();
}
@AfterTest
public void quit(){
driver.stop();
}
}
注册测试类中的模板:
public class Register{
private WebDriver driver;
@BeforeClass
public void setUp(){
driver = Init.getWebDriver();
}
@Test
public void test1(){
........
........
}
@Test
public void test2(){
........
........
}
}
登录测试类中的模板:
public class Login{
private WebDriver driver;
@BeforeClass
public void setUp(){
driver = Init.getWebDriver();
}
@Test
public void test1(){
........
........
}
@Test
public void test2(){
........
........
}
}
答案 0 :(得分:0)
静态对象对于jvm将是单个的。对于您的情况,可以将它们存储在ThreadLocal对象中。只需更改您的init类。
public static class Init{
private static ThreadLocal<WebDriver> WEBDRIVER = new ThreadLocal<WebDriver>();
public static WebDriver getWebDriver(){
WebDriver driver= WEBDRIVER.get();
if (driver== null) {
driver = new ChromeWebDriver();
WEBDRIVER.set(driver);
}
return driver;
}
@AfterTest
public void quit(){
getWebDriver().quit();
}
}
如果您使用init作为基类扩展注册和登录类。然后,您可以简单地避免在套件xml中提及init类
答案 1 :(得分:0)
您在init类中使用静态webdriver,它将确保仅启动一个webdriver实例。
private static WebDriver driver;
正如您提到的那样,每个测试未在各自的浏览器中运行。。您需要更改静态Web驱动程序。删除静态Web驱动程序并为每个测试启动Web驱动程序,这将在新的浏览器中打开每个测试。