【发布时间】:2015-02-26 20:45:49
【问题描述】:
我试图在我的 TestNG 项目中运行多个类,但其中一个类总是失败。
AbstractTest.java (sampleTest1 和 sampleTest2 类只包含一对一的 @Test 和 get() 方法)
public class AbstractTest {
private List<WebDriver> webDriverPool = Collections.synchronizedList(new ArrayList<WebDriver>());
private ThreadLocal<WebDriver> driverThread;
@BeforeTest
public void beforeTest()
{
this.driverThread = new ThreadLocal<WebDriver>() {
@Override
protected WebDriver initialValue() {
final WebDriver webDriver = new FirefoxDriver();
webDriverPool.add(webDriver);
return webDriver;
}
};
}
@AfterTest
public void afterTest() {
for (WebDriver driver : this.webDriverPool) {
driver.quit();
}
}
public WebDriver getDriver() {
return this.driverThread.get();
}
}
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="11" name="testSuite" parallel="tests">
<test name="Test1" group-by-instances="true">
<classes>
<class name="test.sample.sampleTest1" />
<class name="test.sample.sampleTest2" />
</classes>
</test> <!-- Test1 -->
</suite> <!-- testSuite -->
问题是其中一个线程看不到 WebDriver,它返回 null 并且会失败。我知道如果我将 ThreadLocal 更改为 static 它会起作用,但如果我并行运行测试会导致更多问题,我的目标是什么 :)
提前致谢!
【问题讨论】:
-
getDriver() 应该是静态和同步的。当然只有当你想在具有相同状态的类之间共享它时。如果您需要单独的类和驱动程序,那么您也可以使用静态方法,但您需要 setter 为每个测试类设置新状态。
-
能否请您写一下,我需要修改什么?我试过你写的,但还是不行。