【发布时间】:2020-08-08 02:11:35
【问题描述】:
我尝试使用 Selenium 和 TestNG 进行测试设计,我将每个 @Test 放在一个单独的类中,并使用一次 @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> 在同一个会话中重叠运行。我认为这是因为我在 Base 类中将driver 声明为static 的方式。但是如果我删除static,情况会更糟,仍然只创建一次driver实例,代码只运行第一个@Test(在这种情况下只有LoginApps),所有后续测试都会得到一个NullPointerException异常。
我将 TestNG v7.0.0 与 Maven 一起使用:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
要并行运行我想象的设计,我该如何解决?
【问题讨论】:
标签: java selenium selenium-webdriver testng access-modifiers