Comme le titre l'indique, je cherche un moyen simple d'exécuter des tests JUnit 4.x plusieurs fois de suite automatiquement en utilisant Eclipse.
Un exemple serait d'exécuter le même test 10 fois de suite et de rendre compte du résultat.
Nous avons déjà une façon complexe de faire cela, mais je cherche une façon simple de le faire afin que je puisse être certain que le test irrégulier que j'ai essayé de corriger reste fixe.
Une solution idéale serait un plugin / paramètre / fonctionnalité Eclipse que je ne connais pas.
Réponses:
Le moyen le plus simple (avec le moins de nouveau code requis) pour ce faire est d'exécuter le test en tant que test paramétré (annoter avec
@RunWith(Parameterized.class)
et ajouter une méthode pour fournir 10 paramètres vides). De cette façon, le framework exécutera le test 10 fois.Ce test devrait être le seul test de la classe, ou mieux, toutes les méthodes de test devraient être exécutées 10 fois dans la classe.
Voici un exemple:
Avec ce qui précède, il est même possible de le faire avec un constructeur sans paramètre, mais je ne suis pas sûr si les auteurs du framework l'ont voulu, ou si cela se cassera à l'avenir.
Si vous implémentez votre propre coureur, vous pouvez demander au coureur d'exécuter le test 10 fois. Si vous utilisez un runner tiers, avec 4.7, vous pouvez utiliser la nouvelle
@Rule
annotation et implémenter l'MethodRule
interface 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
s'exécuter qu'une seule fois. Cela changera probablement dans la prochaine version de JUnit (le@Before
fonctionnera après le@Rule
), mais quoi qu'il en soit, vous agirez sur la même instance de l'objet (ce qui n'est pas vrai pour leParameterized
coureur). Cela suppose que le coureur avec lequel vous exécutez la classe reconnaît correctement les@Rule
annotations. Ce n'est le cas que s'il délègue aux coureurs JUnit.Si vous exécutez avec un coureur personnalisé qui ne reconnaît pas l'
@Rule
annotation, vous êtes vraiment obligé d'écrire votre propre coureur qui délègue de manière appropriée à ce coureur et l'exécute 10 fois.Notez qu'il existe d'autres moyens de résoudre ce problème (comme le runner Theories), mais ils nécessitent tous un runner. Malheureusement, JUnit ne prend actuellement pas en charge les couches de coureurs. C'est un coureur qui enchaîne d'autres coureurs.
la source
Avec IntelliJ, vous pouvez le faire à partir de la configuration de test. Une fois que vous ouvrez cette fenêtre, vous pouvez choisir d'exécuter le test autant de fois que vous le souhaitez.
lorsque vous exécutez le test, intellij exécutera tous les tests que vous avez sélectionnés pour le nombre de fois que vous avez spécifié.
Exemple exécutant 624 tests 10 fois:
la source
J'ai trouvé que l'annotation de répétition de Spring est utile pour ce genre de chose:
Dernier document (API Spring Framework 4.3.11.RELEASE):
la source
Inspiré des ressources suivantes:
Exemple
Créez et utilisez une
@Repeat
annotation comme suit:Repeat.java
RepeatRule.java
PowerMock
L'utilisation de cette solution avec
@RunWith(PowerMockRunner.class)
, nécessite une mise à jour vers Powermock 1.6.5 (qui inclut un correctif ).la source
Avec JUnit 5, j'ai pu résoudre ce problème en utilisant l' annotation @RepeatedTest :
Notez que l'
@Test
annotation ne doit pas être utilisée avec@RepeatedTest
.la source
Quelque chose ne va pas avec:
Contrairement au cas où vous testez chacune d'un tableau de valeurs, vous ne vous souciez pas particulièrement de l'échec de l'exécution.
Pas besoin de faire en configuration ou en annotation ce que vous pouvez faire dans le code.
la source
@Before
méthode annotée avant deitWorks()
résoudre mon problème.Cela fonctionne beaucoup plus facilement pour moi.
la source
public class RepeatRunner extends BlockJUnit4ClassRunner { public RepeatRunner(Class klass) throws InitializationError { super(klass); } @Override public void run(final RunNotifier notifier) { for (int i = 0; i < 10; i++) { super.run(notifier); } } }
Bien qu'au moins dans le plugin Eclipse JUnit, vous obtenez des résultats comme: "10/1 tests passés"Il y a une annotation intermittente dans la bibliothèque tempus-fugit qui fonctionne avec JUnit 4.7
@Rule
pour répéter un test plusieurs fois ou avec@RunWith
.Par exemple,
Une fois le test exécuté (avec IntermittentTestRunner dans le
@RunWith
),testCounter
serait égal à 99.la source
Je construis un module qui permet de faire ce genre de tests. Mais il ne se concentre pas uniquement sur la répétition. Mais pour garantir que certains morceaux de code sont sécurisés pour les threads.
https://github.com/anderson-marques/concurrent-testing
Dépendance Maven:
Exemple d'utilisation:
C'est un projet open source. N'hésitez pas à vous améliorer.
la source
Vous pouvez exécuter votre test JUnit à partir d'une méthode principale et le répéter autant de fois que vous en avez besoin:
la source
C'est essentiellement la réponse que Yishai a fournie ci-dessus, réécrite en Kotlin:
la source