2016-04-04 2 views
0

Nous utilisons TestNG pour nos tests d'intégration. Nous avons récemment converti à partir de jUnit, et nous avions l'habitude d'utiliser un org.junit.rules.TestRule pour réessayer automatiquement chaque test jusqu'à 3 fois avant de le compter comme échoué. Ceci a éliminé beaucoup de faux positifs chaque fois qu'un cas de test échouait seulement occasionnellement.Réessayer automatiquement tous les tests 3 fois avant de les échouer

Lors de notre conversion à TestNG, cette règle de nouvelle tentative a été ignorée, et nous avons maintenant un tas de cas de test "défaillants" qui sont vraiment faux positifs.

J'ai trouvé quelques articles sur la façon de automatiquement Réexécutez cas de test TestNG:

https://jepombar.wordpress.com/2015/02/16/testng-adding-a-retryanalyzer-to-all-you-tests/

http://mylearnings.net/11.html

L'essentiel de c'est vous pouvez spécifier un retryAnalizer pour chaque @Test individuelle -annotated cas de test. J'ai mis en place mon propre analyseur et l'ai appliqué à un cas de test, et cela fonctionne. Mais appliquer manuellement un nouvel analyseur à chaque cas de test n'est pas une bonne solution, quand nous voulons chaque cas de test dans la suite pour le faire. L'article sur jepombar.wordpress.com montre un moyen de l'appliquer à tous les tests dans une classe, mais pour une raison quelconque, il ne semble pas fonctionner comme écrit.

J'ai fait ce qui suit IAnnotationTransformer:

public class RetryListener implements IAnnotationTransformer { 

    @Override 
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
     IRetryAnalyzer retry = annotation.getRetryAnalyzer(); 
     if (retry == null) { 
      annotation.setRetryAnalyzer(RetryRule.class); // my TestNG RetryAnalizer implementation 
     } 
    } 

} 

Et je l'applique à une classe comme ceci:

@Listeners(RetryListener.class) 
public class FooTest extends SeleniumMockedTest { 
    ... 
} 

Cela ne fonctionne pas; le code RetryListener.transform() ne s'exécute jamais, donc RetryRule n'est jamais ajouté à aucun des cas de test pour la classe.

Comment puis-je faire fonctionner cela?

Ou, mieux encore, ma vraie question: Comment puis-je obtenir tous les cas de test dans notre suite de tests d'intégration pour essayer automatiquement 3 fois avant que les échecs de comptage échouent réellement?

Répondre

0

Je ne peux pas le faire fonctionner en utilisant @Listeners non plus, mais je peux le faire fonctionner en utilisant la ligne de commande. .: par exemple

java org.testng.TestNG -listener MyTransformer testng.xml 

Il ne fonctionne pas à l'aide @Listeners peut être un bug. Vous pouvez signaler le problème here.

+1

Oh, ne dis pas ça! Les outils de programmation n'ont jamais de bugs, blasphémateur! ;) –

+0

Tous les écouteurs ne travaillent pas avec @Listeners car TestNG ne lit qu'une seule fois les classes. Comme IAnnotationTransformer est censé être déclenché lorsque les classes sont lues, nous avons un problème de poulet/oeuf. – juherr