2 votes

Exécution séquentielle d'un test TestNG avec décalage temporel

J'ai quelques classes de tests unitaires DAO que je veux exécuter ensemble en utilisant TestNG, mais TestNG essaie de les exécuter en parallèle, ce qui entraîne l'échec de certains rollbacks. Bien que je veuille exécuter mes classes de tests unitaires de manière séquentielle, je veux aussi pouvoir spécifier une méthode d'exécution de minimum le temps que TestNG doit attendre avant d'exécuter le test suivant. Est-ce réalisable ?

P.S. Je comprends qu'on puisse demander à TestNG d'exécuter tous les tests d'une classe de test dans un SingleThread, je suis capable de spécifier la séquence des appels de méthode de toute façon en utilisant des groupes, donc ce n'est peut-être pas un problème.

0voto

romaintaz Points 32120

Qu'en est-il d'un dépendance forte entre les deux tests ? Si vous écrivez que :

@Test
public void test1() { ... }

@Test(dependsOnMethods = "test1", alwaysRun = true)
public void test2() { ... }

entonces test2 sera toujours exécuté après test1 .

N'oubliez pas alwaysRun = true sinon si test1 ne fonctionne pas, test2 sera ignorée !

0voto

niharika_neo Points 6906
  1. Si vous ne souhaitez pas exécuter vos classes en parallèle, vous devez spécifier que l'attribut parallel de votre suite est faux. Par défaut, il est faux. Je pense donc qu'elle devrait s'exécuter séquentiellement par défaut, à moins que vous n'ayez modifié la façon dont vous invoquez vos tests.

  2. Pour ajouter un peu de délai entre vos classes, vous pouvez probablement ajouter votre logique de délai dans une méthode annotée avec @AfterClass. AFAIK testng n'a pas de moyen de spécifier cela dans un xml testng ou une ligne de commande. Il existe un attribut timeout, mais il est plutôt destiné à temporiser les tests et n'est probablement pas ce que vous recherchez.

Pour ajouter un délai entre vos tests, c'est-à-dire les balises de test en xml, vous pouvez essayer d'implémenter la méthode ITestListener - onFinish, dans laquelle vous pouvez ajouter votre code de délai. Elle est exécutée après chaque <test> . Si un délai est nécessaire après chaque cas de test, implémentez le code de délai dans IInvokedMethodListener - AfterInvocation() qui est exécuté après l'exécution de chaque méthode de test. Vous devrez alors spécifier l'écouteur lorsque vous invoquez votre suite.

J'espère que cela vous aidera.

0voto

fly bird Points 818

Voici ce que j'ai utilisé pour certains tests.

Première , définissez des méthodes utilitaires comme suit :

// make thread sleep a while, so that reduce effect to subsequence operation if any shared resource,
private void delay(long milliseconds) throws InterruptedException {
    Thread.sleep(milliseconds);
}

private void delay() throws InterruptedException {
    delay(500);
}

Dans ce cas Pour ce faire, appelez la méthode à l'intérieur des méthodes de test, à la fin ou au début.

Par exemple

@Test
public void testCopyViaTransfer() throws IOException, InterruptedException {
    copyViaTransfer(new File(sourcePath), new File(targetPath));
    delay();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X