Appliquer '@Règle " après chaque '@Test' et avant chaque '@dans JUnit
J'ai une suite de test où je suis déconnecter du système dans @After
et la fermeture du navigateur dans @AfterClass
. Je suis en train d'utiliser @Rule
de prendre échec au test de capture d'écran à l'aide de Sélénium pour chaque méthode de test. J'ai vérifié manuellement que @Rule
ne s'exécute avant chaque @Before
mais je veux le mettre en place après @Test
et avant @After
. Je n'arrivais pas à trouver la solution la plus simple. Toute aide sera appréciée.
public class MorgatgeCalculatorTest {
@Before
public void before(){
System.out.println("I am before");
}
@BeforeClass
public static void beforeclass(){
System.out.println("I am beforeclass");
}
@Test
public void test(){
System.out.println("I am Test");
}
@Test
public void test2(){
System.out.println("I am Test2");
}
@After
public void after(){
System.out.println("I am after");
}
@AfterClass
public static void afterclass(){
System.out.println("I am afterclass");
}
@Rule
ExpensiveExternalResource ExpensiveExternalResource = new ExpensiveExternalResource();
static class ExpensiveExternalResource implements MethodRule {
public ExpensiveExternalResource(){
System.out.println("I am rule");
}
@Override
public Statement apply(Statement arg0, FrameworkMethod arg1, Object arg2) {
//TODO Auto-generated method stub
return null;
}
}
La sortie que je reçois est
I am beforeclass
I am rule
I am before
I am Test
I am after
I am rule
I am before
I am Test2
I am after
I am afterclass
- Je l'ai mentionné je ne veux prendre la capture d'écran que lorsqu'un test échoue. Pas pour tous les tester 😀
- Drôle. J'étais seulement intéressé dans l'ordre, donc, en fait, votre question a été ma réponse 🙂
- Je suis heureux!
- en fait l'ordre indiqué n'est pas correct, car il ne s'affiche que lorsque la règle est instancié, pas lorsqu'il est appliqué. Le bon test n'aurait pas un constuctor dans la Règle, mais l'appel
arg0.evaluate()
journalisation avant et après l'appel. Ce serait montrer que la règle est de courir autour de@Before
/@After
comme est aussi mentionné dans la JavaDoc de JUnit.
Vous devez vous connecter pour publier un commentaire.
En raison de la façon dont les règles sont définies, vous ne pouvez pas avoir une règle qui vient après le @avant ou avant @après. Vous pouvez penser à des règles, comme des coquillages que vous avez mis sur la méthode de test. La première coquille d'aller sur @avant/@après. Par la suite, le @les règles sont appliquées.
Un moyen rapide de faire ce que vous voulez faire est d'éviter @Après tout. Une règle peut être créé de sorte qu'il va prendre une capture d'écran si une méthode échoue, puis d'exécuter la vôtre après le code. Il n'est pas aussi jolie que @Après, mais il fonctionne. (aussi, j'ai mis en œuvre TestRule parce que MethodRule a été amortis).
Tout le travail de cette règle est faite dans un communiqué. Un org.junit.les coureurs.de modèle.La déclaration est une classe qui représente un ensemble de code. Voici donc le appliquer méthode reçoit le faisceau de code que vous mettez une coquille en périphérie. Appliquer retourne votre instruction qui s'exécute le faisceau de code que vous avez donné et l'entoure avec une instruction try/catch pour attraper la méthode des échecs.
Le résultat de cette méthode est:
Espérons que cette aide!
@After
méthode de sortie de sorte qu'il sera visible, que baseStatement.evaluate() provoque effectivement@Before
, puis la méthode d'essai, puis@After
à exécuter.Que sur l'utilisation de l' ExternalResource règle ?
On dirait que vous, il peut vous donner assez de souplesse à ce que vous avez besoin.
Et si ce n'est pas exactement ce dont vous avez besoin, prendre un coup d'oeil à la le code source des ressources externes.
Il est tout à fait understandble comment mettre en œuvre une règle par exemple qui fonctionnera uniquement après le test de l'invocation.