Ответ 1
Объявите параметр типа ITestResult в @AfterMethod, и TestNG будет его вводить:
@AfterMethod
public void afterMethod(ITestResult result) {
System.out.println("method name:" + result.getMethod().getMethodName());
}
По сути, у меня есть метод разрыва, который я хочу записать на консоль, какой тест был только что запущен. Как мне получить эту строку?
Я могу получить имя класса, но я хочу фактический метод, который был только что выполнен.
public class TestSomething {
@AfterMethod
public void tearDown() {
System.out.println("The test that just ran was: " + getTestThatJustRanMethodName());
}
@Test
public void testCase() {
assertTrue(1 == 1);
}
}
... должен вывести на экран: "Тест, который только что запустился, был: testCase"
Тем не менее, я не знаю магию, getTestThatJustRanMethodName
должно быть getTestThatJustRanMethodName
.
Объявите параметр типа ITestResult в @AfterMethod, и TestNG будет его вводить:
@AfterMethod
public void afterMethod(ITestResult result) {
System.out.println("method name:" + result.getMethod().getMethodName());
}
Если вы хотите получить имя метода до, тест выполняется, вы можете использовать следующее:
import java.lang.reflect.Method;
@BeforeMethod
public void nameBefore(Method method)
{
System.out.println("Test name: " + method.getName());
}
Просто объявите параметр java.lang.reflect.Method
.
@BeforeMethod
public void beforeTestMethod(Method testMethod){
System.out.println("Before Testmethod: " + testMethod.getName());
}
Но TestNG позволяет inject намного больше;)
- Любой метод @Before или @Test может объявить параметр типа
ITestContext
.- Любой метод @AfterMethod может объявить параметр типа
ITestResult
, который будет отражать результат только что запущенного тестового метода.- Любые методы @Before и @After могут объявлять параметр типа
XmlTest
, который содержит текущий тег.- Любой @BeforeMethod (и @AfterMethod) может объявить параметр типа
java.lang.reflect.Method
. Этот параметр получит метод проверки, который будет вызываться после завершения этого метода @BeforeMethod (или после метода, который выполняется для @AfterMethod).- Любой @BeforeMethod может объявить параметр типа
Object[]
. Этот параметр получит список параметров, которые будут переданы в предстоящий тестовый метод, который может быть либо введен TestNG, напримерjava.lang.reflect.Method
, либо из@DataProvider
.- Любой @DataProvider может объявить параметр типа
ITestContext
илиjava.lang.reflect.Method
. Последний параметр получит метод проверки, который должен быть вызван.
Другой (хотя и не такой простой, как Cedric answer) способ, которым TestNG поддерживает это, заключается в регистрации слушателя:
@Listeners({MethodListener.class})
public class ListenerTest {
@Test
public void someTest() {
}
}
Где слушатель может выглядеть так:
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());
}
}
Этот конкретный слушатель будет выводить имя метода (то есть someTest
) на консоль. Это будет выполнено после каждого выполненного теста.
Если вы генерируете testSuite программным способом, вы можете добавить прослушиватель следующим образом вместо добавления @Listeners({MethodListener.class})
каждого класса теста
List<String> listeners = new ArrayList<String>();
listeners.add(MethodListener.class.getName());
testSuite.setListeners(listeners);
В моем собственном проекте я получаю доступ к этим данным благодаря JUnit @Rule
.
String testName;
String className;
@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);
}
};