2017-09-18 2 views
1

Ich habe ein Framework mit Selen mit paralleler Ausführung mit dem TestNG vorbereitet, ich erstelle die Datei testng.xml durch Code, in dem das parallele Schlüsselwort auf "Tests" gesetzt wird. Meine Tests laufen gut, aber nachdem das Ergebnis generiert wurde, wird die JVM niemals beendet und geht in den Deadlock. Nach dem Debuggen des Codes habe ich festgestellt, dass die mit ** gekennzeichnete Zeile das Deadlock-Problem verursacht.TestNG Paralleltests gehen in Deadlock

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

helfen Bitte bei ..

< 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) > 

Testfall Skript

@Test public void Test_test() { 
try { 
////code/// 
driver.close(); 
} catch (Exception err) { 
System.out.println(err.getMessage()); 
Fail(err.getMessage()); 
}finally{ 
Closereport(); 
driver.quit(); 
} 
} 
+0

Can Bitte zeigen Sie uns den Test-Code, wo Sie dieses Problem sehen? Sie haben grundsätzlich 'java.util.concurrent.ThreadPoolExecutor # getTask' Code und ohne Kontext, es ist schwer zu entschlüsseln, wo der Engpass ist. –

+0

Nicht genau, wo ich sagen kann Du machst das aber immer geht der letzte Thread in den Deadlock. Bitte finde die folgenden meiner Testklassendateien –

+0

@Test public void Test_test() { \t try { \t \t \t //// Code /// \t \t \t \t \t \t driver.close(); \t \t \t \t \t \t} catch (Exception err) { \t \t \t System.out.printin (err.getMessage()); \t \t \t Fehler (err.getMessage()); \t \t} schließlich { \t \t \t Closereport(); \t \t \t Treiber.Verlassen(); \t \t} } –

Antwort

1

Wie ich vermutete, ist das Problem mit ins Stocken geraten Fäden aufgrund Ihrer schlechten Integration mit ExtentReports. Du müsstest das reparieren. Vielleicht können Sie sich auf die Dokumentation here beziehen, um einige Beispiele zu erhalten.

Abgesehen davon können Sie diese allgemeinen Anamolien beheben, die ich in dem Code, den Sie freigegeben haben, beobachtet habe.

  1. Entfernen Sie statische Variablen aus Ihrem Code. Sie haben eine Menge Statik und dies wird zu Problemen führen, wenn Sie Tests parallel durchführen.
  2. Sie haben eine Unterklasse RuntimeException, aber die Klasse scheint nichts mit Ausnahmen zu tun haben.
  3. Ihre WebDriver Instanzverwaltung in den Testklassen sollte @BeforeClass und @AfterClass verwenden, um sicherzustellen, dass die Browser nach der Verwendung ordnungsgemäß bereinigt werden.
  4. Bitte versuchen Konventionen folgende Maven Ordnerstruktur, so dass es die Lesbarkeit des Codes ist, ist besser (Da die Menschen auf die allgemeine Ordnerstruktur von src/main/java/src/test/java (für Quellcode verwendet werden) und src/main/resources/src/test/resources (für Ressourcen)