Relatórios personalizados com TestNG
1. Visão geral
Neste artigo, discutiremos a geração de logs e relatórios personalizados usando o TestNG.
O TestNG fornece seu próprio recurso de geração de relatórios, gerando relatórios nos formatos HTML / XML. Se os testes forem executados usandomaven-surefire-plugin,, o relatório terá o formato padrão definido pelo plugin. Além dos relatórios internos, ele fornece um mecanismo para facilitar a personalização de informações registradas e relatórios gerados.
Se você gostaria de começar com os fundamentos do TestNG, verifiquethis article.
2. Registro Personalizado
Antes de implementar o log personalizado, vamos dar uma olhada nos logs padrão executando o comandomvn test:
Tests run: 11, Failures: 1, Errors: 0, Skipped: 0,
Time elapsed: 1.21 sec <<< FAILURE!
- in TestSuite
whenCalledFromSuite_thanOK(example.com.RegistrationTest)
Time elapsed: 0.01 sec <<< FAILURE!
java.lang.AssertionError: Test Failed due to some reason
at example.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.
Esses logs não nos fornecem nenhuma informação sobre a ordem de execução ou sobre quando um teste específico foi iniciado / concluído etc.
Se quisermos saber o resultado de cada execução, juntamente com alguns dados personalizados, podemos implementar nossos próprios logs e relatórios. O TestNG fornece uma maneira de implementar relatórios e logs personalizados.
Simply put, we can either implement the org.testng.ITestListener interface for logging or the org.testng.IReporter interface for reporting. Essas classes implementadas são notificadas sobre eventos como início, término, falha etc. de testes e suítes.
Vamos prosseguir e implementar alguns registros personalizados simples:
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());
}
//...
}
Observe como substituímos o métodoonFinish(), que será invocado quando todas as execuções de teste forem concluídas e todas as configurações forem feitas. Da mesma forma, podemos substituir outros métodos - comoonTestStart(), onTestFailure() etc (e encontrar detalhes sobre esses outros métodoshere).
Agora vamos incluir este ouvinte na configuração XML:
Uma vez executado, o ouvinte será chamado em todos os eventos e registrará as informações conforme implementamos. Isso pode ser útil para depurar nossa execução de teste.
Os logs de saída:
...
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
...
Os logs personalizados nos fornecem informações ausentes nos logs padrão.
3. Relatórios personalizados
Quando executamos testes usando o plugin, ele gera relatórios em formatos HTML / XML no diretóriotarget/surefire-reports:
Se quisermos executar um conjunto de testes específico usando um arquivo XML TestNG, precisamos listá-lo na tag surefire-pluginconfiguration:
src\test\resources\parametrized_testng.xml
Após o registro personalizado, agora vamos tentar criar alguns relatórios personalizados onde implementamos a interfaceorg.testng.IReporter e substituímos o métodogenerateReport():
public void generateReport(
List xmlSuites,
List suites, String outputDirectory) {
String reportTemplate = initReportTemplate();
String body = suites
.stream()
.flatMap(suiteToResults())
.collect(Collectors.joining());
String report
= reportTemplate.replaceFirst("", String.format("%s", body));
saveReportTemplate(outputDirectory, report);
}
O método substituído leva três argumentos:
-
xmlSuite – contém uma lista de todos os pacotes mencionados no arquivo XML
-
suites – um objeto de lista, contendo todas as informações sobre a execução do teste
-
outputDirectory – o caminho do diretório onde os relatórios são gerados
Usamos o métodoinitReportTemplate() para carregar um modelo HTML, a funçãosuiteToResults() que invoca a funçãoresultsToRow() para lidar com os aspectos internos da geração do relatório:
private Function> suiteToResults() {
return suite -> suite.getResults().entrySet()
.stream()
.flatMap(resultsToRows(suite));
}
private Function,
Stream extends String>> resultsToRows(ISuite suite) {
return e -> {
ITestContext testContext = e.getValue().getTestContext();
Set failedTests
= testContext.getFailedTests().getAllResults();
Set passedTests
= testContext.getPassedTests().getAllResults();
Set skippedTests
= testContext.getSkippedTests().getAllResults();
String suiteName = suite.getName();
return Stream
.of(failedTests, passedTests, skippedTests)
.flatMap(results ->
generateReportRows(e.getKey(), suiteName, results).stream());
};
}
esaveReportTemplate() para salvar o resultado completo.
Inclua o repórter no arquivo de configuração XML:
Aqui está o resultado de nossos relatórios:
Em comparação com o relatório HTML padrão, este relatório fornece uma imagem clara e precisa do resultado, em uma única tabela. O que é mais conveniente e fácil de ler.
4. Conclusão
Neste tutorial rápido, aprendemos sobre como gerar relatórios de teste com o plug-in Surefire Maven. Também analisamos a personalização dos logs e a geração de relatórios personalizados com o TestNG. Para mais detalhes sobre o TestNG, como escrever casos de teste, suítes etc. consulte a nossa introdução
Para obter mais detalhes sobre TestNG, como escrever casos de teste, suítes, definitivamente comece com nosso introdutórioarticle.
Como sempre, a implementação dos snippets pode ser encontradaover on GitHub.