2017-09-18 3 views
1

J'ai préparé un framework en utilisant sélénium ayant une exécution parallèle en utilisant le TestNG, je génère le fichier testng.xml par le code où en mettant le mot-clé parallèle à "tests". Mes tests fonctionnent bien, mais une fois que le résultat est généré, la build/JVM ne se termine jamais. Elle passe dans l'interblocage. Après le débogage du code, j'ai trouvé que la ligne ci-dessous marquée ** provoque le problème de blocage.Tests Parallels TestNG en cours 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; 
     } 
    } 
} 

S'il vous plaît aider en cas ..

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

script cas de test

@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 S'il vous plaît nous montrer le code de test où vous voyez ce problème? Vous avez fondamentalement partagé le code 'java.util.concurrent.ThreadPoolExecutor # getTask' et sans contexte, il est difficile à déchiffrer où le goulot d'étranglement est –

+0

Pas exactement où je peux dire vous obtenez ceci mais toujours le dernier thread va dans l'impasse.Veuillez trouver ci-dessous de mes fichiers de classe de test –

+0

@Test Public void Test_test() {try { \t \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.println (err.getMessage()); \t \t \t Échec (err.getMessage()); \t \t} enfin { \t \t \t Closereport(); Pilote \t \tquitter(); \t \t} } –

Répondre

1

Comme je doutais, le problème avec des fils est dû à l'impasse de votre mauvaise intégration avec ExtentReports. Vous auriez besoin de réparer cela. Peut-être vous pouvez vous référer à la documentation here pour obtenir quelques échantillons. En dehors de cela, vous voudrez peut-être corriger ces anamolies générales que j'ai observées dans le code que vous avez partagé.

  1. Supprimez les variables statiques de votre code. Vous avez beaucoup de statique et cela va causer des problèmes lorsque vous exécutez des tests en parallèle.
  2. Vous avez un sous-classe RuntimeException mais la classe ne semble pas avoir quelque chose en rapport avec les exceptions.
  3. Votre gestion d'instance WebDriver dans les classes de test doit utiliser @BeforeClass et @AfterClass afin de s'assurer que les navigateurs sont correctement nettoyés après utilisation.
  4. S'il vous plaît essayer de suivre les conventions de la structure des dossiers Maven pour que ce soit la lisibilité du code est meilleur (Puisque les gens sont habitués à la structure générale du dossier de src/main/java/src/test/java (pour le code source) et src/main/resources/src/test/resources (pour les ressources)