Получение @Test описания формы testNG тестов
У меня есть следующий формат в моих тестах testNG:
@Test(alwaysRun = true, dependsOnMethods = "testStep_1", description = "Enter the names, and verify that they are appearing correctly ")
public void testStep_2() throws Exception{
}
Есть ли способ реализовать что-то, что могло бы прочитать все описания тестов и тем самым сгенерировать тестовую документацию. Я пытался как-то включить ITestNGMethod getDescription()
к afterInvocation(IInvokedMethod method, ITestResult testResult)
поэтому после запуска каждого метода возвращается описание, но безуспешно. Кто-нибудь пробовал что-то подобное?
6 ответов
Самый простой способ - использовать ITestResult.
@Override
public void afterInvocation(IInvokedMethod arg, ITestResult arg1) {
System.out.println(arg.getTestMethod().getMethodName());
System.out.println(arg1.getMethod().getDescription());
}
Второй sysout вернет (String) описание вызванного тестового метода.
Мы пробовали что-то подобное. Ниже приведен метод, который печатает название теста testng и описание теста для каждого метода.
@BeforeMethod
public void beforeMethod(Method method) {
Test test = method.getAnnotation(Test.class);
System.out.println("Test name is " + test.testName());
System.out.println("Test description is " + test.description());
}
Самый простой способ сделать это:
public void onTestStart(ITestResult result) {
System.out.prinln(result.getMethod().getDescription());
}
Это должно дать вам параметр описания аннотации @Test
Реализация IMethodInterceptor позволяет получить доступ ко всем аннотациям ваших тестов и их параметрам.
import java.util.List;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
import org.testng.annotations.Test;
public class Interceptor implements IMethodInterceptor
{
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context)
{
int methCount = methods.size();
for (int i = 0; i < methCount; i++)
{
IMethodInstance instns = methods.get(i);
System.out.println(instns.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class)
.description());
}
return methods;
}
}
Добавьте реализованный класс в свой список слушателей. Так что TestNG об этом знают.
public class ReportSet_MethodListener implements IInvokedMethodListener {
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
if (iInvokedMethod.getTestMethod().isTest()){
System.out.println("TestCaseName:" + iInvokedMethod.getTestMethod().getDescription());
}
}
Есть более простой способ сделать это, не определяя перехватчик слушателя, как я показываю в этом проекте GitHub, который я сделал.
По сути, определите класс TestBase следующим образом:
public abstract class NGTestBase extends AbstractTestNGSpringContextTests
{
....
private String testDescription;
@BeforeMethod
public void setUp(Method ngMethod)
{
...
setTestDescription(ngMethod);
...
}
....
public String getTestDescription()
{
return this.testDescription;
}
private void setTestDescription(Method methodInstance)
{
this.testDescription = methodInstance.getAnnotation(Test.class).description();
}
}
Затем в своем тесте просто аннотируйте их так:
@Test(description = "Test printing out all the Spring beans.")
public void printAllBeansTest(Method ngMethod)
{
...
String[] beanNames = applicationContext.getBeanDefinitionNames();
...
for (String beanName : beanNames)
{
test.log(LogStatus.INFO, "BEAN[" + beanName + "] : " + applicationContext.getBean(beanName).getClass().toString());
}
...
}