1. Обзор
В этой статье мы обсудим создание пользовательских журналов и отчетов с помощью TestNG.
TestNG предоставляет собственную функцию создания отчетов — создание отчетов в форматах HTML/XML. Если тесты выполняются с использованием подключаемого модуля maven-surefire,
отчет будет иметь форму по умолчанию, определенную подключаемым модулем. Помимо встроенных отчетов, он предоставляет механизм для простой настройки регистрируемой информации и генерируемых отчетов.
Если вы хотите начать с основ TestNG, ознакомьтесь с этой статьей .
2. Пользовательское ведение журнала
Прежде чем мы реализуем пользовательское ведение журнала, давайте посмотрим на журналы по умолчанию, выполнив команду mvn test
:
Tests run: 11, Failures: 1, Errors: 0, Skipped: 0,
Time elapsed: 1.21 sec <<< FAILURE!
- in TestSuite
whenCalledFromSuite_thanOK(foreach.com.RegistrationTest)
Time elapsed: 0.01 sec <<< FAILURE!
java.lang.AssertionError: Test Failed due to some reason
at foreach.com.RegistrationTest.whenCalledFromSuite_thanOK(
RegistrationTest.java:15)
Results :
Failed tests:
RegistrationTest.whenCalledFromSuite_thanOK:15
Test Failed due to some reason
Tests run: 11, Failures: 1, Errors: 0, Skipped: 0
[ERROR] There are test failures.
Эти журналы не дают нам никакой информации о порядке выполнения или о том, когда конкретный тест был запущен/завершен и т. д.
Если мы хотим знать результат каждого запуска вместе с некоторыми пользовательскими данными, мы можем реализовать свои собственные журналы и отчеты. TestNG предоставляет способ реализации пользовательских отчетов и журналов.
Проще говоря, мы можем либо реализовать интерфейс org.testng.ITestListener
для ведения журнала, либо интерфейс org.testng.IReporter
для создания отчетов. Эти реализованные классы получают уведомления о таких событиях, как начало, конец, сбой и т. д. тестов и наборов.
Давайте продолжим и реализуем простую пользовательскую регистрацию:
public class CustomisedListener implements ITestListener {
// ...
@Override
public void onFinish(ITestContext testContext) {
LOGGER.info("PASSED TEST CASES");
testContext.getPassedTests().getAllResults()
.forEach(result -> {LOGGER.info(result.getName());});
LOGGER.info("FAILED TEST CASES");
testContext.getFailedTests().getAllResults()
.forEach(result -> {LOGGER.info(result.getName());});
LOGGER.info(
"Test completed on: " + testContext.getEndDate().toString());
}
//...
}
Обратите внимание, как мы переопределили метод onFinish()
, который будет вызываться после завершения выполнения всех тестов и выполнения всех настроек. Точно так же мы можем переопределить другие методы, такие как onTestStart(), onTestFailure()
и т. д. (подробнее об этих других методах см. здесь ).
Теперь давайте включим этот слушатель в конфигурацию XML:
<suite name="My test suite">
<listeners>
<listener class-name="com.foreach.reports.CustomisedListener" />
</listeners>
<test name="numbersXML">
<parameter name="value" value="1" />
<parameter name="isEven" value="false" />
<classes>
<class name="foreach.com.ParametrizedTests" />
</classes>
</test>
</suite>
После выполнения слушатель будет вызываться для каждого события и будет регистрировать информацию, как мы реализовали. Это может быть полезно для отладки выполнения нашего теста.
Выходные журналы:
...
INFO CUSTOM_LOGS - Started testing on: Sat Apr 22 14:39:43 IST 2017
INFO CUSTOM_LOGS - Testing:
givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect
INFO CUSTOM_LOGS - Tested:
givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect Time taken:6 ms
INFO CUSTOM_LOGS - Testing:
givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect
INFO CUSTOM_LOGS - Failed :
givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect
INFO CUSTOM_LOGS - PASSED TEST CASES
INFO CUSTOM_LOGS - givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect
INFO CUSTOM_LOGS - FAILED TEST CASES
INFO CUSTOM_LOGS -
givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect
INFO CUSTOM_LOGS - Test completed on: Sat Apr 22 14:39:43 IST 2017
...
Пользовательские журналы дают нам недостающую информацию в журналах по умолчанию.
3. Пользовательские отчеты
Когда мы запускаем тесты с помощью плагина, он генерирует отчеты в форматах HTML/XML в каталоге target/surefire-reports
:
Если мы хотим запустить определенный набор тестов, используя XML-файл TestNG, нам нужно указать его в теге конфигурации
surefire-plugin :
<configuration>
<suiteXmlFiles>
<suiteXmlFile>
src\test\resources\parametrized_testng.xml
</suiteXmlFile>
</suiteXmlFiles>
</configuration>
После пользовательского логирования теперь давайте попробуем создать несколько пользовательских отчетов, в которых мы реализуем интерфейс org.testng.IReporter
и переопределяем метод generateReport()
:
public void generateReport(
List<XmlSuite> xmlSuites,
List<ISuite> suites, String outputDirectory) {
String reportTemplate = initReportTemplate();
String body = suites
.stream()
.flatMap(suiteToResults())
.collect(Collectors.joining());
String report
= reportTemplate.replaceFirst("</tbody>", String.format("%s</tbody>", body));
saveReportTemplate(outputDirectory, report);
}
Переопределенный метод принимает три аргумента:
xmlSuite —
содержит список всех наборов, упомянутых в файле XML.suites —
объект-список, содержащий всю информацию о выполнении тестаoutputDirectory —
путь к каталогу, в котором создаются отчеты .
Мы использовали метод initReportTemplate()
для загрузки HTML-шаблона, функцию suiteToResults()
, которая вызывает функцию resultsToRow()
для обработки внутренних компонентов генерации отчета:
private Function<ISuite, Stream<? extends String>> suiteToResults() {
return suite -> suite.getResults().entrySet()
.stream()
.flatMap(resultsToRows(suite));
}
private Function<Map.Entry<String, ISuiteResult>,
Stream<? extends String>> resultsToRows(ISuite suite) {
return e -> {
ITestContext testContext = e.getValue().getTestContext();
Set<ITestResult> failedTests
= testContext.getFailedTests().getAllResults();
Set<ITestResult> passedTests
= testContext.getPassedTests().getAllResults();
Set<ITestResult> skippedTests
= testContext.getSkippedTests().getAllResults();
String suiteName = suite.getName();
return Stream
.of(failedTests, passedTests, skippedTests)
.flatMap(results ->
generateReportRows(e.getKey(), suiteName, results).stream());
};
}
и saveReportTemplate()
для сохранения полного результата.
Включите генератор отчетов в файл конфигурации XML:
<suite name="suite">
<listeners>
<listener class-name="com.foreach.reports.CustomisedReports" />
</listeners>
<test name="test suite">
<classes>
<class name="foreach.com.RegistrationTest" />
<class name="foreach.com.SignInTest" />
</classes>
</test>
</suite>
Вот результаты наших отчетов:
По сравнению с надежным HTML-отчетом по умолчанию, этот отчет дает четкую и четкую картину результата в одной таблице. Что более удобно и легко читается.
4. Вывод
В этом кратком руководстве мы узнали, как создавать отчеты о тестировании с помощью плагина Surefire Maven. Мы также рассмотрели возможность настройки журналов и создания настраиваемых отчетов с помощью TestNG. Для получения более подробной информации о TestNG, например о том, как писать тестовые примеры, наборы и т. д., обратитесь к нашему вводному
Более подробно о TestNG, например о том, как писать тест-кейсы, сюиты, обязательно начните с нашей вводной статьи .
Как всегда, реализацию фрагментов можно найти на GitHub .