gpt4 book ai didi

java - TestNG 中的并行执行

转载 作者:行者123 更新时间:2023-12-01 17:13:31 24 4
gpt4 key购买 nike

我尝试使用SeleniumTestNG进行测试设计,我将每个@Test放在一个单独的类中,并使用一次<对于所有类来说,strong>@BeforeSuite & @AfterSuite,原因是:

  1. 代码易于维护
  2. 数据驱动,以便能够选择要运行的类 xml 文件。

然后我想到的是如何只登录一次并且 session 可以被所有后续测试使用,到目前为止我所做的是:

类:

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> 在同一 session 中重叠运行。我认为这是因为我声明driver的方式如static类中。但是如果我删除 static ,这会让事情变得更糟,仍然创建driver仅实例一次,代码仅运行第一个 @Test (在本例中仅 LoginApps),所有后续测试都将得到 NullPointerException 异常(exception)。

我将 TestNG v7.0.0 与 Maven 一起使用:

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>

要并行运行我想象的设计,我该如何修复它?

最佳答案

创建具有线程安全性的驱动程序,以确保两次驱动程序 session 都是唯一的。

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();
}
}

关于java - TestNG 中的并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61409468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com