«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(baeldung.com.RegistrationTest)  
Time elapsed: 0.01 sec  <<< FAILURE!
java.lang.AssertionError: Test Failed due to some reason
    at baeldung.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.baeldung.reports.CustomisedListener" />
    </listeners>
    <test name="numbersXML">
        <parameter name="value" value="1" />
        <parameter name="isEven" value="false" />
        <classes>
            <class name="baeldung.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:

Если мы хотим запустить определенный набор тестов, используя TestNG XML файла, нам нужно указать его в теге конфигурации 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.baeldung.reports.CustomisedReports" />
    </listeners>
    <test name="test suite">
        <classes>
	    <class name="baeldung.com.RegistrationTest" />
            <class name="baeldung.com.SignInTest" />
        </classes>
    </test>
</suite>

Вот результаты наших отчетов:

По сравнению со стандартным HTML-отчетом, этот отчет дает четкую и четкую картину результата. , в одной таблице. Что более удобно и легко читается.

4. Заключение

В этом кратком руководстве мы узнали, как создавать отчеты о тестировании с помощью плагина Surefire Maven. Мы также рассмотрели возможность настройки журналов и создания настраиваемых отчетов с помощью TestNG. Для получения более подробной информации о TestNG, например, о том, как писать тестовые наборы, наборы и т. д., обратитесь к нашей вводной

. Для получения более подробной информации о TestNG, например, о том, как писать тестовые наборы, наборы, обязательно начните с нашей вводной статьи.

Как всегда, реализацию фрагментов можно найти на GitHub.