TestNG 并行测试陷入僵局
TestNG Parallel Tests are going in Deadlock
我已经准备了一个使用 selenium 并使用 TestNG 并行执行的框架,我正在通过将并行关键字设置为 "tests" 的代码生成 testng.xml 文件。我的测试 运行 很好,但在生成结果后,构建/JVM 永远不会终止它进入死锁。调试代码后,我发现下面标有 ** 的行导致死锁问题。
private Runnable getTask() {
boolean timedOut = false; // Did the last poll() time out?
for (;;) {
int c = ctl.get();
int rs = runStateOf(c);
// Check if queue empty only if necessary.
if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
decrementWorkerCount();
return null;
}
int wc = workerCountOf(c);
// Are workers subject to culling?
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
if ((wc > maximumPoolSize || (timed && timedOut))
&& (wc > 1 || workQueue.isEmpty())) {
if (compareAndDecrementWorkerCount(c))
return null;
continue;
}
try {
Runnable r = timed ?
**workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :**
**workQueue.take();**
if (r != null)
return r;
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
}
}
万一请帮忙..
< Thread [main] (Running)
Thread [TestNG] (Running)
Thread [TestNG] (Running)
Daemon Thread [Exec Default Executor] (Running)
Daemon Thread [Exec Stream Pumper] (Running)
Daemon Thread [Exec Stream Pumper] (Running) >
测试用例脚本
@Test public void Test_test() {
try {
////code///
driver.close();
} catch (Exception err) {
System.out.println(err.getMessage());
Fail(err.getMessage());
}finally{
Closereport();
driver.quit();
}
}
正如我所怀疑的,线程停滞的问题是由于您与 ExtentReports 的集成不当造成的。你需要解决这个问题。也许您可以参考文档 here 来获取一些样本。
除此之外,您可能想要修复我在您共享的代码中观察到的这些一般异常。
- 从您的代码中删除静态变量。你有很多静力学,当你运行并行测试时,这会导致问题。
- 你有一个子classed
RuntimeException
但是class似乎没有任何与异常相关的东西。
- 您的
WebDriver
测试 classes 中的实例管理应该使用 @BeforeClass
和 @AfterClass
以确保在使用后正确清理浏览器.
- 请尝试遵循 maven 文件夹结构约定,以便它的代码可读性更好(因为人们已经习惯了
src/main/java
/src/test/java
(对于源代码)和 src/main/resources
/src/test/resources
(资源)
使用同步更新了代码以消除死锁
我已经准备了一个使用 selenium 并使用 TestNG 并行执行的框架,我正在通过将并行关键字设置为 "tests" 的代码生成 testng.xml 文件。我的测试 运行 很好,但在生成结果后,构建/JVM 永远不会终止它进入死锁。调试代码后,我发现下面标有 ** 的行导致死锁问题。
private Runnable getTask() {
boolean timedOut = false; // Did the last poll() time out?
for (;;) {
int c = ctl.get();
int rs = runStateOf(c);
// Check if queue empty only if necessary.
if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
decrementWorkerCount();
return null;
}
int wc = workerCountOf(c);
// Are workers subject to culling?
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
if ((wc > maximumPoolSize || (timed && timedOut))
&& (wc > 1 || workQueue.isEmpty())) {
if (compareAndDecrementWorkerCount(c))
return null;
continue;
}
try {
Runnable r = timed ?
**workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :**
**workQueue.take();**
if (r != null)
return r;
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
}
}
万一请帮忙..
< Thread [main] (Running)
Thread [TestNG] (Running)
Thread [TestNG] (Running)
Daemon Thread [Exec Default Executor] (Running)
Daemon Thread [Exec Stream Pumper] (Running)
Daemon Thread [Exec Stream Pumper] (Running) >
测试用例脚本
@Test public void Test_test() {
try {
////code///
driver.close();
} catch (Exception err) {
System.out.println(err.getMessage());
Fail(err.getMessage());
}finally{
Closereport();
driver.quit();
}
}
正如我所怀疑的,线程停滞的问题是由于您与 ExtentReports 的集成不当造成的。你需要解决这个问题。也许您可以参考文档 here 来获取一些样本。
除此之外,您可能想要修复我在您共享的代码中观察到的这些一般异常。
- 从您的代码中删除静态变量。你有很多静力学,当你运行并行测试时,这会导致问题。
- 你有一个子classed
RuntimeException
但是class似乎没有任何与异常相关的东西。 - 您的
WebDriver
测试 classes 中的实例管理应该使用@BeforeClass
和@AfterClass
以确保在使用后正确清理浏览器. - 请尝试遵循 maven 文件夹结构约定,以便它的代码可读性更好(因为人们已经习惯了
src/main/java
/src/test/java
(对于源代码)和src/main/resources
/src/test/resources
(资源)
使用同步更新了代码以消除死锁