Как добавить имя поставщика данных вместе с именем метода в Extent Report?
Я работаю над рамкой Extent Report в моем текущем проекте. В моем тестовом классе я использую класс провайдера данных для импорта тестовых данных. Конкретный тест содержит 10 проверочных тестов, повторяющих ключ поставщика данных. Когда дело доходит до отчета об объеме, я записываю имя метода в отчет, но я должен различать каждый тест поставщика данных с именем, соответствующим каждому тесту проверки. Вот мой сценарий:1. Конфигурация отчета по экстентам:
@BeforeSuite
public void setUp()
{
htmlReporter = new ExtentHtmlReporter(System.getProperty("user.dir") +"/test-output/extentReport.html");
extent = new ExtentReports();
extent.attachReporter(htmlReporter);
extent.setSystemInfo("OS", "Windows");
extent.setSystemInfo("Host Name", "1016086");
extent.setSystemInfo("Environment", "QA");
extent.setSystemInfo("User Name", "BABURAJ V D");
htmlReporter.config().setChartVisibilityOnOpen(true);
htmlReporter.config().setDocumentTitle("Extent report");
htmlReporter.config().setReportName("Final Report");
}
@BeforeClass
public synchronized void beforeClass() {
test = extent.createTest(getClass().getSimpleName());
parentTest.set(test);
}
@BeforeMethod
public synchronized void beforeMethod(Method method) {
child = parentTest.get().createNode(method.getName());
childTest.set(child);
}
@AfterMethod
public synchronized void afterMethod(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE)
childTest.get().fail(result.getThrowable());
else if (result.getStatus() == ITestResult.SKIP)
childTest.get().skip(result.getThrowable());
else
childTest.get().pass("Test passed");
}
@AfterSuite
public void tearDown(){
extent.flush();
}
@Test(priority = 2, dataProvider = GE_XR240_DEVICE_DataProvider.DEVICE_ADD_VALIDATIONS, dataProviderClass = GE_XR240_DEVICE_DataProvider.class)
public void OPTIMA_XR240_FAILED_MESSAGE_VALIDATION(Map<String, String> deviceTestData) throws InterruptedException { }
Это проверки, происходящие в этом конкретном тесте OPTIMA_XR240_FAILED_MESSAGE_VALIDATION или сообщение об ошибке, которое должно отображаться в пользовательском интерфейсе:
Add Device Failed - System name should be filled
Add Device Failed - System Id should be filled
Add Device Failed - Manufacturer should be assigned
Add Device Failed - System model should be assigned
Add Device Failed - Current IP Address / Host Name should be filled
Так что я сделал отчет, который должен содержать часть информации, относящейся к проверке, которую он выполняет, а не только имя метода.
3 ответа
Он создает узел с именем метода, так как вы определили метод с именем "OPTIMA_XR240_FAILED_MESSAGE_VALIDATION"
Если вы хотите получить имя для настройки, вы можете передать его следующим образом:
child = parentTest.get().createNode("Test node");
childTest.set(child);
Каждый раз, когда вы хотите дать некоторую числовую идентификацию, такую как "Тестовый узел 1", "Тестовый узел 2" и так далее. Вы можете получить его с помощью счетчика приращения или цикла, и он будет определен как:
child = parentTest.get().createNode("Test node" +i);
childTest.set(child);
Вы можете увеличить значение i до завершения метода.
Это предварительный отрывок из экстента-testng-plugin, который скоро будет выпущен как часть версии 4, но разместим его здесь, так как вы будете использовать провайдера данных в своих методах:
public class ExtentITestListener
implements ITestListener {
private static final ExtentReports EXTENT = Extent.getInstance();
private static ThreadLocal<ExtentTest> methodTest = new ThreadLocal<ExtentTest>();
private static ThreadLocal<ExtentTest> dataProviderTest = new ThreadLocal<>();
@Override
public synchronized void onStart(ITestContext context) { }
@Override
public synchronized void onFinish(ITestContext context) {
EXTENT.flush();
}
@Override
public synchronized void onTestStart(ITestResult result) {
String methodName = result.getMethod().getMethodName();
if (result.getParameters().length>0) {
if (methodTest.get() != null && methodTest.get().getModel().getName().equals(methodName)) { }
else {
createTest(result);
}
String paramName = Arrays.asList(result.getParameters()).toString();
ExtentTest paramTest = methodTest.get().createNode(paramName);
dataProviderTest.set(paramTest);
} else {
createTest(result);
}
}
private void createTest(ITestResult result) {
String methodName = result.getMethod().getMethodName();
ExtentTest test = EXTENT.createTest(methodName);
methodTest.set(test);
String[] groups = result.getMethod().getGroups();
if (groups.length > 0) {
Arrays.asList(groups)
.forEach(x -> methodTest.get().assignCategory(x));
}
}
@Override
public synchronized void onTestSuccess(ITestResult result) {
getTest(result).pass("Test passed");
}
private ExtentTest getTest(ITestResult result) {
ExtentTest t = result.getParameters() != null && result.getParameters().length>0
? dataProviderTest.get()
: methodTest.get();
return t;
}
@Override
public synchronized void onTestFailure(ITestResult result) {
getTest(result).fail(result.getThrowable());
}
@Override
public synchronized void onTestSkipped(ITestResult result) {
getTest(result).skip(result.getThrowable());
}
@Override
public synchronized void onTestFailedButWithinSuccessPercentage(ITestResult result) { }
}
public class Extent
implements Serializable {
private static final long serialVersionUID = 1L;
private static class ExtentReportsLoader {
private static final ExtentReports INSTANCE = new ExtentReports();
static {
}
}
public static synchronized ExtentReports getInstance() {
return ExtentReportsLoader.INSTANCE;
}
@SuppressWarnings("unused")
private ExtentReports readResolve() {
return ExtentReportsLoader.INSTANCE;
}
}
Поскольку это ITestListener, вы можете добавить его непосредственно в свой тестовый или базовый класс, например так:
@Listeners(ExtentITestListenerAdapter.class)
public class MyTests {
@Test
public void test() {
...
}
}
Я нашел решение для вышеуказанного вопроса, которое отлично работает для меня. Поместите приведенный ниже код внутри ваших методов в класс слушателя, он может получить параметр из вашего тестового метода.
StringBuilder testName = new StringBuilder(result.getMethod().getMethodName());
Object[] parameters = result.getParameters();
if (parameters.length > 0)
{
StringBuilder p = new StringBuilder();
for (int i = 0; i < parameters.length; i++)
{
//pass the parameter location which you want to add as a testname
if(i == 4)
{
p.append(Utils.toString(parameters[i]));
}
}
}
test = extent.createTest(testName.toString());