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