Réglez le temps de retard pour chaque <test> dans TestNG
Tout d'abord comme info : je mets chacun @Test
dans une classe différente (donc bien sûr chaque classe n'a qu'une @Test
annotation).
En fait, mon objectif est de vouloir réexécuter la même classe avec des paramètres différents, mais je veux exécuter une autre classe au préalable.
J'ai essayé de trouver de nombreuses références que TestNG n'autorise pas la répétition d'une classe ou d'une @Test
annotation de méthode en une <test>
. La répétition fournie est une invocationCount
fonction, je vois environ invocationCount
, mais je ne peux pas atteindre mon objectif invocationCount
car cette fonction répète un @Test
en même temps et ensuite je peux en exécuter une autre @Test
.
public class SimpleTest1 {
@Test
@Parameters({"acc"})
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleTest2 {
@Test
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
J'imagine fonctionner comme la configuration ci-dessous:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
Mais la configuration ci-dessus ne s'est pas déroulée comme prévu car la seconde SimpleTest1
n'a pas été exécutée.
Ensuite, j'ai essayé de l'exécuter séparément, <test>
comme ci-dessous et le succès, mais je suis confronté à un nouveau problème concernant le temps de retard <test>
.
Exécutez plusieurs <test>
séries (non parallèles) comme suit:
<suite name="Suite">
<test name="My Test1" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
</classes>
</test>
<test name="My Test2" >
<classes>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
</classes>
</test>
<test name="My Test3" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
Dépendance TestNG Maven:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
Infaillible:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
IDE: Eclipse (Version: 2018-09 (4.9.0))
Système d' exploitation: macOS Mojave (version 10.14.6)
Sortie :
[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57
===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================
Mais une fois le premier <test>
terminé, il y a un délai d'environ 10 secondes avant les prochaines <test>
exécutions, ainsi que le test suivant.
Remarque : je pensais que c'était un problème avec l'IDE (j'utilise Eclipse), mais ce n'était pas le cas. J'ai essayé de l'exécuter de 2 manières, via l'IDE et la ligne de commande, et me donne le même résultat sur ce problème de retard.
Via la ligne de commande en utilisant cette commande:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
Existe-t-il une configuration pour réduire le temps de retard ci-dessus?
Réponses
Premièrement, une suite n'est pas un plan de test (pourrait être une bonne demande de fonctionnalité btw) mais juste un moyen de sélectionner des tests. Cela signifie que vous ne pouvez pas définir une dépendance entre les tests. C'est pourquoi avoir la même classe de test ne fonctionne pas (cela devrait échouer ou créer des instances différentes).
Si je comprends bien vos besoins, le meilleur moyen est de séparer votre propre logique et son intégration avec le framework de test:
- concevez vos classes d'assistance / de luminaire comme vous le souhaitez:
_
public class SimpleClass1 {
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleClass2 {
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
- définir les classes pour l'intégration avec le framework de test
_
public class SimpleTest {
@Test
@Parameters({"acc"})
public void step1(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
@Test(dependsOnMethods = {"step1"})
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void step2(String senderAcc, String beneficiaryAcc, String amount) {
(new SimpleClass2()).transfer(acc);
}
@Test(dependsOnMethods = {"step2"})
@Parameters({"acc"})
public void step3(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
}
Et la suite avec les paramètres attendus:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest">
<methods>
<include name="step1">
<parameter name="acc" value="11111"></parameter>
</methods>
<methods>
<include name="step2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</methods>
<methods>
<include name="step3">
<parameter name="acc" value="22222"></parameter>
</methods>
</class>
</classes>
</test>
</suite>
(avertissement: je n'ai pas vérifié le XML par rapport au dtd, je peux me tromper mais vous avez l'idée)
La dénomination ou la manière de créer des appareils dépend de vos propres conventions.
Vous pouvez définir la priorité ou la dépendance à une autre méthode en utilisant les annotations comme décrit ici:
https://testng.org/doc/documentation-main.html#annotations
recherchez @ Test.priority ou @ Test.dependsOnMethods
Cela vous permettra d'exécuter les tests les uns après les autres en série.
Je ne sais pas pourquoi vous devez exécuter la même classe de test dans des tests séparés, mais lors du démarrage du test, il peut charger tous les contextes pertinents, ce qui peut prendre du temps et peut-être après la fin du test, il faudra peut-être fermer certaines ressources, les deux peuvent prendre du temps / peu secondes
Vous pouvez utiliser verbose pour utiliser plus de détails sur la cause du retard (et ajouter plus de journaux pour afficher le minutage)
<suite name="Suite" verbose="10">
Le niveau de verbosité est compris entre 0 et 10, 10 étant le plus détaillé. Une fois que vous l'avez défini sur 10, vous verrez que la sortie de la console contiendra des informations concernant les tests, les méthodes et les écouteurs, etc.
Pour accélérer le processus, vous pouvez également utiliser la fonction parallèle de TestNG
L'attribut threadPoolSize vous permet de spécifier le nombre de threads à allouer pour cette exécution.