Cette fonctionnalité a intégré JUnit 4.11 .
Pour utiliser changer le nom des tests paramétrés, vous dites:
@Parameters(name="namestring")
namestring
est une chaîne qui peut avoir les espaces réservés spéciaux suivants:
{index}
- l'index de cet ensemble d'arguments. La valeur par défaut namestring
est {index}
.
{0}
- la première valeur de paramètre de cette invocation du test.
{1}
- la deuxième valeur du paramètre
- etc
Le nom final du test sera le nom de la méthode de test, suivi des namestring
parenthèses, comme indiqué ci-dessous.
Par exemple (adapté du test unitaire pour l' Parameterized
annotation):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
donnera des noms comme testFib[1: fib(1)=1]
et testFib[4: fib(4)=3]
. (La testFib
partie du nom est le nom de la méthode du @Test
).
{0}
et{1}
sont des tableaux? JUnit devrait idéalement appelerArrays.toString({0})
, non{0}.toString()
. Par exemple, madata()
méthode revientArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.En regardant JUnit 4.5, son exécuteur ne prend clairement pas en charge cela, car cette logique est enterrée dans une classe privée à l'intérieur de la classe Parameterized. Vous ne pouviez pas utiliser le runner paramétré JUnit et créer le vôtre à la place qui comprendrait le concept de noms (ce qui conduit à la question de savoir comment définir un nom ...).
Du point de vue de JUnit, ce serait bien si au lieu de (ou en plus de) simplement passer un incrément, ils passeraient les arguments délimités par des virgules. TestNG fait cela. Si la fonctionnalité est importante pour vous, vous pouvez commenter la liste de diffusion yahoo référencée sur www.junit.org.
la source
J'ai récemment rencontré le même problème lors de l'utilisation de JUnit 4.3.1. J'ai implémenté une nouvelle classe qui étend Parameterized appelée LabelledParameterized. Il a été testé avec JUnit 4.3.1, 4.4 et 4.5. Il reconstruit l'instance Description à l'aide de la représentation String du premier argument de chaque tableau de paramètres à partir de la méthode @Parameters. Vous pouvez voir le code pour cela à:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
et un exemple de son utilisation à:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
La description du test se formate bien dans Eclipse, ce que je voulais car cela rend les tests échoués beaucoup plus faciles à trouver! Je vais probablement affiner et documenter les cours au cours des prochains jours / semaines. Jeter le '?' une partie des URL si vous voulez le dernier cri. :-)
Pour l'utiliser, il vous suffit de copier cette classe (GPL v3) et de changer @RunWith (Parameterized.class) en @RunWith (LabelledParameterized.class) en supposant que le premier élément de votre liste de paramètres est une étiquette sensible.
Je ne sais pas si des versions ultérieures de JUnit résolvent ce problème, mais même si c'est le cas, je ne peux pas mettre à jour JUnit car tous mes co-développeurs devraient également mettre à jour et nous avons des priorités plus élevées que le ré-outillage. D'où le travail dans la classe pour être compilable par plusieurs versions de JUnit.
Remarque: il y a une réflexion jiggery-pokery afin qu'elle s'exécute sur les différentes versions de JUnit comme indiqué ci-dessus. La version spécifique à JUnit 4.3.1 peut être trouvée ici et, pour JUnit 4.4 et 4.5, ici .
la source
execute[0], execute[1] ... execute[n]
dans les rapports de test générés.Avec
Parameterized
comme modèle, j'ai écrit mon propre runner / suite de test personnalisé - cela n'a pris qu'une demi-heure environ. Il est légèrement différent de celui de darrenpLabelledParameterized
en ce qu'il vous permet de spécifier un nom explicitement plutôt que de vous fier aux premiers paramètrestoString()
.Il n'utilise pas non plus de tableaux car je déteste les tableaux. :)
Et un exemple:
la source
à partir de junit4.8.2, vous pouvez créer votre propre classe MyParameterized en copiant simplement la classe Parameterized. modifiez les méthodes getName () et testName () dans TestClassRunnerForParameters.
la source
Vous pouvez également essayer JUnitParams: http://code.google.com/p/junitparams/
la source
Vous pouvez créer une méthode comme
Bien que je ne l'utilise pas tout le temps, il serait utile de savoir exactement quel est le numéro de test 143.
la source
J'utilise largement l'importation statique pour Assert et ses amis, il est donc facile pour moi de redéfinir l'assertion:
Par exemple, vous pouvez ajouter un champ "nom" à votre classe de test, initialisé dans le constructeur, et l'afficher en cas d'échec du test. Passez-le simplement comme premier élément de votre tableau de paramètres pour chaque test. Cela permet également d'étiqueter les données:
la source
Rien de tout cela ne fonctionnait pour moi, j'ai donc obtenu la source de Parameterized et je l'ai modifiée pour créer un nouveau testeur. Je n'ai pas eu à changer grand chose mais ça marche !!!
la source
Une solution de contournement serait d'attraper et d'imbriquer tous les Throwables dans un nouveau Throwable avec un message personnalisé qui contient toutes les informations sur les paramètres. Le message apparaîtrait dans la trace de la pile. Cela fonctionne chaque fois qu'un test échoue pour toutes les assertions, erreurs et exceptions car ce sont toutes des sous-classes de Throwable.
Mon code ressemble à ceci:
La trace de pile du test ayant échoué est:
la source
Découvrez JUnitParams comme dsaff l'a mentionné, fonctionne en utilisant ant pour construire des descriptions de méthodes de test paramétrées dans le rapport html.
C'était après avoir essayé LabelledParameterized et découvert que bien qu'il fonctionne avec eclipse, il ne fonctionne pas avec ant en ce qui concerne le rapport html.
À votre santé,
la source
Puisque le paramètre accédé (par exemple avec
"{0}"
toujours renvoie latoString()
représentation, une solution de contournement serait de faire une implémentation anonyme et de remplacertoString()
dans chaque cas. Par exemple:la source