2017-09-07 4 views
0

tous. J'ai une suite testng de fichier xml existante. Je veux l'utiliser dans la tâche gradle et nombre de threads définir par programmeComment utiliser le fichier xml testng suite et définir le nombre de threads par programme?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="UiTests"> 
    <test name="UiTests" preserve-order="true"> 
     <packages> 
      <package name="tests.web"> 
       <exclude name="tests.web.performance"/> 
      </package> 
     </packages> 
    </test> 
</suite> 

Dans la tâche gradle J'utilise la méthode useTestNG et jeu de paramètres THREADCOUNT

useTestNG{ 
    suites("src/testы/suites/UiTests.xml") 
    threadCount 2 
    setParallel("methods") 
} 

Mais cela ne fonctionne - le nombre de threads obtenir de fichier xml, donc comment je peux définir le nombre de threads par programme?

Répondre

1

La valeur du nombre de threads spécifiée dans le fichier xml de la suite TestNG a le dernier mot. C'est pourquoi, même si vous essayez de le définir via TestNGOptions dans votre tâche de test Gradle, il ne prend pas effet.

Pour passer, vous devez effectuer les opérations suivantes:

  • Assurez-vous que vous utilisez v6.11 TestNG ou plus.
  • Construire une implémentation de org.testng.IAlterSuiteListener dans laquelle vous modifiez le nombre de threads soit au niveau XmlSuite (niveau <suite>) ou au niveau XmlTest (<test> niveau)
  • Ajouter une référence à l'auditeur créé ci-dessus dans votre fichier xml suite TestNG. Vous pouvez également injecter l'écouteur via l'annotation @Listeners (ou) via votre suite xml (ou) via Serviceloaders. Pour plus de détails, lisez mon article de blog here
  • Transmettez toutes les propriétés du système que gradle reçoit à votre tâche de test.

Voici à quoi tout cela ressemble en action.

classe de test ressemble à ce

package test; 

import org.testng.annotations.Test; 

public class ParallelRunner { 

    @Test(priority = 1) 
    public void a() { 
     System.err.println("**" + Thread.currentThread().getId()); 
    } 

    @Test(priority = 2) 
    public void b() { 
     System.err.println("**" + Thread.currentThread().getId()); 
    } 

    @Test(priority = 3) 
    public void c() { 
     System.err.println("**" + Thread.currentThread().getId()); 
    } 

    @Test(priority = 4) 
    public void d() { 
     System.err.println("**" + Thread.currentThread().getId()); 
    } 
} 

auditeur de test ressemble à ce

public class SuiteAlterer implements IAlterSuiteListener { 

    @Override 
    public void alter(List<XmlSuite> suites) { 
     int count = Integer.parseInt(System.getProperty("threadcount", "3")); 
     XmlSuite suite = suites.get(0); 
     suite.setDataProviderThreadCount(count); 
    } 
} 

xml Suite ressemble à ceci

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="many_methods_suite" verbose="2"> 
    <listeners> 
     <listener class-name="com.rationaleemotions.SuiteAlterer"/> 
    </listeners> 
    <test name="many_methods_test" parallel="methods"> 
     <classes> 
      <class name="test.ParallelRunner"/> 
     </classes> 
    </test> 
</suite> 

La tâche test gradle ressemble à ceci

test { 
    useTestNG() { 
     suites 'src/test/resources/krmahadevan.xml' 
     systemProperties(System.getProperties()) 
    } 
    testLogging.showStandardStreams = true 
} 

est ici la sortie

~/temp/example 
23:15 $ gradle -Dthreads=2 clean test 

> Task :test 

Gradle Test Executor 13 STANDARD_ERROR 
    Altered the suite thread count to 2 

Gradle Test Executor 13 STANDARD_OUT 
    ... 
    ... TestNG 6.12 by Cédric Beust ([email protected]) 
    ... 


many_methods_suite > many_methods_test > test.ParallelRunner.a STANDARD_ERROR 
    **14 

many_methods_suite > many_methods_test > test.ParallelRunner.b STANDARD_ERROR 
    **15 

many_methods_suite > many_methods_test > test.ParallelRunner.c STANDARD_ERROR 
    **15 

many_methods_suite > many_methods_test > test.ParallelRunner.d STANDARD_ERROR 
    **15 


BUILD SUCCESSFUL in 1s 
4 actionable tasks: 4 executed 

Vous pouvez maintenant contrôler le nombre de threads en passant dans une appropriée via l'argument JVM -Dthreads

+0

Merci pour l'explication, vous pouvez également générer dynamiquement sute xml avec des générateurs xml, par exemple comme ceci [générateur xml sur javaworld] (https: // www. javaworld.com/article/2074057/core-java/jaxb-xjc-java-generation-with-dtd.html) – ZakZand