En gros, j'ai une méthode de démontage que je veux enregistrer dans la console sur laquelle le test vient d'être exécuté. Comment pourrais-je m'y prendre pour obtenir cette chaîne?
Je peux obtenir le nom de la classe, mais je veux la méthode qui vient d’être exécutée.
public class TestSomething {
@AfterMethod
public void tearDown() {
System.out.println("The test that just ran was: " + getTestThatJustRanMethodName());
}
@Test
public void testCase() {
assertTrue(1 == 1);
}
}
... devrait afficher à l'écran: "Le test qui vient d'être exécuté était: testCase"
Cependant, je ne connais pas la magie que devrait être getTestThatJustRanMethodName
.
Déclarez un paramètre de type ITestResult dans votre @AfterMethod et TestNG l'injectera:
@AfterMethod
public void afterMethod(ITestResult result) {
System.out.println("method name:" + result.getMethod().getMethodName());
}
Si vous voulez obtenir le nom de la méthode avant le test est exécuté, vous pouvez utiliser les éléments suivants:
import Java.lang.reflect.Method;
@BeforeMethod
public void nameBefore(Method method)
{
System.out.println("Test name: " + method.getName());
}
Il suffit de déclarer un paramètre Java.lang.reflect.Method
.
@BeforeMethod
public void beforeTestMethod(Method testMethod){
System.out.println("Before Testmethod: " + testMethod.getName());
}
Mais TestNG vous permet deinjecterbeaucoup plus;)
- Toute méthode @Before ou @Test peut déclarer un paramètre de type
ITestContext
.- Toute méthode @AfterMethod peut déclarer un paramètre de type
ITestResult
, qui reflètera le résultat de la méthode de test qui vient d'être exécutée.- Toutes les méthodes @Before et @After peuvent déclarer un paramètre de type
XmlTest
, qui contient la balise actuelle.- Tous @BeforeMethod (et @AfterMethod ) peuvent déclarer un paramètre de type
Java.lang.reflect.Method
. Ce paramètre recevra la méthode de test qui sera appelée une fois cette @BeforeMethod terminée (ou après la méthode exécutée pour @AfterMethod).- N'importe quel @BeforeMethod peut déclarer un paramètre de type
Object[]
. Ce paramètre recevra la liste des paramètres sur le point d'être introduits dans la prochaine méthode de test, qui pourraient être injectés par TestNG, tels queJava.lang.reflect.Method
ou provenir d'un@DataProvider
.- N'importe quel @DataProvider peut déclarer un paramètre de type
ITestContext
ouJava.lang.reflect.Method
. Ce dernier paramètre recevra la méthode de test sur le point d'être appelée.
Une autre manière (bien que pas aussi simple que réponse de Cedric _) prise en charge par TestNG consiste à enregistrer un écouteur :
@Listeners({MethodListener.class})
public class ListenerTest {
@Test
public void someTest() {
}
}
Où l'auditeur pourrait ressembler à ceci:
public class MethodListener implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
System.out.println(method.getTestMethod().getMethodName());
}
}
Cet écouteur particulier imprime le nom de la méthode (c'est-à-dire someTest
) sur la console. Il serait exécuté après every test exécuté.
Si vous générez le testSuite par programme, vous pouvez ajouter l'écouteur comme suit au lieu d'ajouter @Listeners({MethodListener.class})
sur chaque classe de test.
List<String> listeners = new ArrayList<String>();
listeners.add(MethodListener.class.getName());
testSuite.setListeners(listeners);
Dans mon propre projet, j'accède à ces données à l'aide d'un JUnit @Rule
.
@Rule
public TestWatcher watcher = new TestWatcher() {
public void starting(Description description) {
testName = description.getMethodName();
className = description.getClassName();
logger.info("Starting test " + testName + " in class " + className);
}
};