Comme le titre l’indique, je cherche un moyen simple d’exécuter automatiquement les tests JUnit 4.x plusieurs fois de suite à l’aide d’Eclipse.
Un exemple serait d’exécuter le même test 10 fois de suite et de rapporter le résultat.
Nous avons déjà une façon complexe de le faire, mais je cherche un moyen simple de le faire pour être sûr que le test flaky que j’ai essayé de corriger rest corrigé.
Une solution idéale serait un plugin / paramètre / fonctionnalité Eclipse que je ne connais pas.
Pour ce faire, le plus simple (avec le moins de nouveau code requirejs) consiste à exécuter le test en tant que test paramétré (annoter avec @RunWith(Parameterized.class)
et append une méthode pour fournir 10 parameters vides). De cette façon, le framework exécutera le test 10 fois.
Ce test doit être le seul test de la classe, ou mieux, toutes les méthodes de test doivent être exécutées 10 fois dans la classe.
Voici un exemple:
@RunWith(Parameterized.class) public class RunTenTimes { @Parameterized.Parameters public static Object[][] data() { return new Object[10][0]; } public RunTenTimes() { } @Test public void runsTenTimes() { System.out.println("run"); } }
Avec ce qui précède, il est possible de le faire même avec un constructeur sans paramètre, mais je ne suis pas sûr que les auteurs du framework aient voulu cela, ou si cela va se briser à l’avenir.
Si vous implémentez votre propre coureur, le coureur peut exécuter le test 10 fois. Si vous utilisez un runner tiers, alors avec 4.7, vous pouvez utiliser la nouvelle annotation @Rule
et implémenter l’interface MethodRule
afin qu’elle prenne l’instruction et l’exécute 10 fois dans une boucle for. L’inconvénient actuel de cette approche est que @Before
et @After
sont exécutés qu’une seule fois. Cela changera probablement dans la prochaine version de JUnit (le @Before
sera exécuté après le @Rule
), mais peu importe que vous @Rule
sur la même instance de l’object (ce qui n’est pas le cas du runner Parameterized
). Cela suppose que tout coureur avec lequel vous exécutez la classe reconnaît correctement les annotations @Rule
. Ce n’est le cas que s’il délègue aux coureurs JUnit.
Si vous utilisez un runner personnalisé qui ne reconnaît pas l’annotation @Rule
, vous êtes vraiment @Rule
d’écrire votre propre runner qui se délègue de manière appropriée à ce Runner et l’exécute 10 fois.
Notez qu’il existe d’autres moyens de résoudre ce problème (comme le coureur Theories), mais tous nécessitent un coureur. Malheureusement, JUnit ne supporte pas actuellement les couches de coureurs. C’est un coureur qui enchaîne les autres coureurs.
J’ai trouvé que l’annotation répétée de Spring est utile pour ce genre de chose:
@Repeat(value = 10)
Dernières (doc. API Spring Framework 4.3.11.RELEASE):