Selenium webdriver TestNG并行测试处于死锁状态

Selenium webdriver TestNG并行测试处于死锁状态,selenium-webdriver,maven-2,testng,Selenium Webdriver,Maven 2,Testng,我已经使用selenium准备了一个框架,并使用TestNG并行执行,我正在通过代码生成TestNG.xml文件,其中将parallel关键字设置为“tests”。我的测试运行正常,但生成结果后,build/JVM从未终止,它进入了死锁。调试代码后,我发现下面标记为**的行导致了死锁问题 private Runnable getTask() { boolean timedOut = false; // Did the last poll() time out? for (;;)

我已经使用selenium准备了一个框架,并使用TestNG并行执行,我正在通过代码生成TestNG.xml文件,其中将parallel关键字设置为“tests”。我的测试运行正常,但生成结果后,build/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) >

正如我所怀疑的,暂停线程的问题是由于与ExtentReports的集成不好造成的。你需要解决这个问题。也许您可以参考文档来获取一些示例

除此之外,您可能还想修复我在您共享的代码中观察到的这些一般性变形金刚

  • 从代码中删除静态变量。您有很多静态数据,当您并行运行测试时,这将导致问题
  • 您有一个子类
    RuntimeException
    ,但该类似乎没有任何与异常相关的内容
  • 测试类中的
    WebDriver
    实例管理应使用
    @BeforeClass
    @AfterClass
    ,以确保浏览器在使用后得到正确清理
  • 请尝试遵循maven文件夹结构约定,以使其代码可读性更好(因为人们习惯于
    src/main/java
    /
    src/test/java
    (对于源代码)和
    src/main/resources
    /
    src/test/resources
    (对于参考资料)

  • 使用同步更新代码以消除死锁

    您能告诉我们您在哪里看到这个问题的测试代码吗?您基本上共享了
    java.util.concurrent.ThreadPoolExecutor#getTask
    代码,没有上下文,很难理解瓶颈在哪里。我不能确切地告诉您我在哪里看到这个问题不要总是最后一个线程进入死锁。请找到下面我的测试类files@Testpublic void Test_Test(){try{///code///driver.close();}catch(异常错误){System.out.println(err.getMessage());Fail(err.getMessage());}最后{Closereport();driver.quit();}线程[main](运行)线程[TestNG](运行)线程[TestNG](运行)守护进程线程[Exec Default Executor](运行)守护进程线程[Exec Stream Pumper](运行)守护进程线程[Exec Stream Pumper](运行)请编辑您的问题并在此处添加测试代码。
        @Test public void Test_test() {
     try { 
    ////code/// 
    driver.close(); 
    } catch (Exception err) { 
    System.out.println(err.getMessage()); 
    Fail(err.getMessage()); 
    }finally{ 
    Closereport(); 
    driver.quit(); 
    } 
    }