Dans JUnit 3, je pouvais obtenir le nom du test en cours d'exécution comme ceci:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
qui afficherait "Le test actuel est testSomething".
Existe-t-il un moyen prêt à l'emploi ou simple de le faire dans JUnit 4?
Contexte: Évidemment, je ne veux pas simplement imprimer le nom du test. Je souhaite charger des données spécifiques au test stockées dans une ressource portant le même nom que le test. Vous savez, convention sur la configuration et tout ça.
java
unit-testing
junit
Dave Ray
la source
la source
Réponses:
JUnit 4.7 a ajouté cette fonctionnalité qui semble utiliser TestName-Rule . On dirait que cela vous donnera le nom de la méthode:
la source
@Rule
auparavant@Before
- je suis nouveau sur JUnit etTestName
je dépendais de moi@Before
sans aucune difficulté.JUnit 4.9.x et supérieur
Depuis JUnit 4.9, la
TestWatchman
classe est déconseillée au profit de laTestWatcher
classe, qui a l'invocation:Remarque: La classe contenant doit être déclarée
public
.JUnit 4.7.x - 4.8.x
L'approche suivante imprime les noms de méthode pour tous les tests d'une classe:
la source
public
champ?JUnit 5 et supérieur
Dans JUnit 5, vous pouvez injecter
TestInfo
ce qui simplifie le test des métadonnées fournissant des méthodes de test. Par exemple:Voir plus: JUnit 5 User guide , TestInfo javadoc .
la source
Essayez plutôt ceci:
La sortie ressemble à ceci:
REMARQUE: cela ne fonctionne pas si votre test est une sous-classe de TestCase ! Le test s'exécute mais le code @Rule ne s'exécute jamais.
la source
Pensez à utiliser SLF4J (Simple Logging Facade for Java) qui offre des améliorations intéressantes à l'aide de messages paramétrés. La combinaison de SLF4J avec des implémentations de règles JUnit 4 peut fournir des techniques de journalisation de classe de test plus efficaces.
la source
Une façon compliquée consiste à créer votre propre Runner en sous-classant org.junit.runners.BlockJUnit4ClassRunner.
Vous pouvez alors faire quelque chose comme ceci:
Ensuite, pour chaque classe de test, vous devrez ajouter une annotation @RunWith (NameAwareRunner.class). Alternativement, vous pouvez mettre cette annotation dans une superclasse de test si vous ne voulez pas vous en souvenir à chaque fois. Bien entendu, cela limite votre sélection de coureurs, mais cela peut être acceptable.
En outre, cela peut prendre un peu de kung-fu pour obtenir le nom du test actuel du Runner et dans votre framework, mais cela vous donne au moins le nom.
la source
JUnit 4 n'a pas de mécanisme prêt à l'emploi pour un cas de test pour obtenir son propre nom (y compris lors de l'installation et du démontage).
la source
la source
Sur la base du commentaire précédent et considérant que j'ai créé une extension de TestWather que vous pouvez utiliser dans vos méthodes de test JUnit avec ceci:
La classe d'aide au test est la suivante:
Prendre plaisir!
la source
ImportUtilsTest
, je reçois une erreur, il semble que ce soit une classe de logger, ai-je plus d'informations? Mercila source
Je vous suggère de dissocier le nom de la méthode de test de votre ensemble de données de test. Je modéliserais une classe DataLoaderFactory qui charge / met en cache les ensembles de données de test de vos ressources, puis dans votre scénario de test, appelez une méthode d'interface qui renvoie un ensemble de données de test pour le scénario de test. Le fait d'associer les données de test au nom de la méthode de test suppose que les données de test ne peuvent être utilisées qu'une seule fois, alors que dans la plupart des cas, je suggère que les mêmes données de test soient utilisées dans plusieurs tests pour vérifier divers aspects de votre logique métier.
la source
Vous pouvez y parvenir en utilisant
Slf4j
etTestWatcher
la source
Dans JUnit 5
TestInfo
agit comme un remplacement de remplacement pour la règle TestName de JUnit 4.De la documentation:
Pour récupérer le nom de la méthode du test exécuté en cours, vous avez deux options:
String TestInfo.getDisplayName()
etMethod TestInfo.getTestMethod()
.Pour récupérer uniquement le nom de la méthode de test actuelle
TestInfo.getDisplayName()
peut ne pas être suffisant car le nom d'affichage par défaut de la méthode de test estmethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Duplication des noms de méthode dans
@DisplayName("..")
n'est pas nécessairement une bonne idée.Comme alternative, vous pouvez utiliser
TestInfo.getTestMethod()
qui retourne unOptional<Method>
objet.Si la méthode de récupération est utilisée dans une méthode de test, vous n'avez même pas besoin de tester la
Optional
valeur encapsulée.la source
JUnit 5 via ExtensionContext
Avantage:
Vous obtenez les fonctionnalités supplémentaires de
ExtensionContext
en remplaçantafterEach(ExtensionContext context)
.la source