BAEL-768 - Simplifying report generation code
This commit is contained in:
		
							parent
							
								
									9f031bb287
								
							
						
					
					
						commit
						4e8a466b45
					
				| @ -1,71 +1,83 @@ | ||||
| package com.baeldung.reports; | ||||
| 
 | ||||
| import org.testng.IReporter; | ||||
| import org.testng.IResultMap; | ||||
| import org.testng.ISuite; | ||||
| import org.testng.ISuiteResult; | ||||
| import org.testng.ITestContext; | ||||
| import org.testng.ITestResult; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.testng.*; | ||||
| import org.testng.xml.XmlSuite; | ||||
| 
 | ||||
| import java.io.BufferedWriter; | ||||
| import java.io.File; | ||||
| import java.io.FileWriter; | ||||
| import java.io.IOException; | ||||
| import java.io.PrintWriter; | ||||
| import java.io.*; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| public class CustomisedReports implements IReporter { | ||||
|     private PrintWriter reportWriter; | ||||
|     private static final Logger LOGGER = LoggerFactory.getLogger(CustomisedReports.class); | ||||
| 
 | ||||
|     public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) { | ||||
|         new File(outputDirectory).mkdirs(); | ||||
|         try { | ||||
|             reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         String reportTemplate = initReportTemplate(); | ||||
|         String resultRow = "<tr class=\"%s\"><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>"; | ||||
|         initReportTemplate(); | ||||
|         for (ISuite suite : suites) { | ||||
|         StringBuilder rows = new StringBuilder(); | ||||
|         suites.forEach(suite -> { | ||||
|             Map<String, ISuiteResult> suiteResults = suite.getResults(); | ||||
|             suiteResults.forEach((testName, suiteResult) -> { | ||||
| 
 | ||||
|                 ITestContext testContext = suiteResult.getTestContext(); | ||||
| 
 | ||||
|                 IResultMap failedResult = testContext.getFailedTests(); | ||||
|                 Set<ITestResult> testsFailed = failedResult.getAllResults(); | ||||
|                 for (ITestResult testResult : testsFailed) { | ||||
|                     reportWriter.println(String.format(resultRow, "danger", suite.getName(), testName, testResult.getName(), "FAILED", "NA")); | ||||
|                 } | ||||
|                 Stream<ITestResult> failedTests = testContext.getFailedTests().getAllResults().stream(); | ||||
|                 Stream<ITestResult> passedTests = testContext.getPassedTests().getAllResults().stream(); | ||||
|                 Stream<ITestResult> skippedTests = testContext.getSkippedTests().getAllResults().stream(); | ||||
| 
 | ||||
|                 IResultMap passResult = testContext.getPassedTests(); | ||||
|                 Set<ITestResult> testsPassed = passResult.getAllResults(); | ||||
|                 for (ITestResult testResult : testsPassed) { | ||||
|                     reportWriter.println(String.format(resultRow, "success", suite.getName(), testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis()))); | ||||
|                 } | ||||
|                 String suiteName = suite.getName(); | ||||
| 
 | ||||
|                 IResultMap skippedResult = testContext.getSkippedTests(); | ||||
|                 Set<ITestResult> testsSkipped = skippedResult.getAllResults(); | ||||
|                 for (ITestResult testResult : testsSkipped) { | ||||
|                     reportWriter.println(String.format(resultRow, "warning", suite.getName(), testName, testResult.getName(), "SKIPPED", "NA")); | ||||
|                 } | ||||
|                 Stream<ITestResult> allTestResults = Stream.concat(Stream.concat(failedTests, passedTests), skippedTests); | ||||
|                 generateReportRows(resultRow, rows, testName, suiteName, allTestResults); | ||||
|             }); | ||||
|         }); | ||||
|         reportTemplate = reportTemplate.replaceFirst("</tbody>", rows.toString() + "</tbody>"); | ||||
|         saveReportTemplate(outputDirectory, reportTemplate); | ||||
|     } | ||||
| 
 | ||||
|     private void generateReportRows(String resultRow, StringBuilder rows, String testName, String suiteName, Stream<ITestResult> allTestResults) { | ||||
|         allTestResults | ||||
|             .forEach(testResult -> { | ||||
|                 String testReportRow = ""; | ||||
|                 if (testResult.getStatus() == ITestResult.FAILURE) { | ||||
|                     testReportRow = String.format(resultRow, "danger", suiteName, testName, testResult.getName(), "FAILED", "NA"); | ||||
|                 } | ||||
|                 if (testResult.getStatus() == ITestResult.SUCCESS) { | ||||
|                     testReportRow = String.format(resultRow, "success", suiteName, testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis())); | ||||
| 
 | ||||
|                 } | ||||
|                 if (testResult.getStatus() == ITestResult.SKIP) { | ||||
|                     testReportRow = String.format(resultRow, "warning", suiteName, testName, testResult.getName(), "SKIPPED", "NA"); | ||||
|                 } | ||||
|                 rows.append(testReportRow); | ||||
|             }); | ||||
|     } | ||||
| 
 | ||||
|     private String initReportTemplate() { | ||||
|         String template = null; | ||||
|         byte[] reportTemplate = null; | ||||
|         try { | ||||
|             reportTemplate = Files.readAllBytes(Paths.get("src/test/resources/reportTemplate.html")); | ||||
|             template = new String(reportTemplate, "UTF-8"); | ||||
|         } catch (IOException e) { | ||||
|             LOGGER.error("Problem initializing template", e); | ||||
|         } | ||||
|         finishReportTemplate(); | ||||
|         reportWriter.flush(); | ||||
|         reportWriter.close(); | ||||
|         return template; | ||||
|     } | ||||
| 
 | ||||
|     private void initReportTemplate() { | ||||
|         reportWriter.println( | ||||
|           "<html>" + "<head>" + "<title>My Custom Report</title>" + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" + "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">" | ||||
|             + "<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js\"></script>" + "<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script></head>" + "<body><div class=\"container\">"); | ||||
|         reportWriter.println("<table class=\"table\"><thead><tr>" + "<th>Suite</th>" + "<th>Test</th>" + "<th>Method</th>" + "<th>Status</th>" + "<th>Execution Time(ms)</th>" + "</tr></thead> <tbody>"); | ||||
|     } | ||||
| 
 | ||||
|     private void finishReportTemplate() { | ||||
|         reportWriter.println(" </tbody></div></body></html>"); | ||||
|     private void saveReportTemplate(String outputDirectory, String reportTemplate) { | ||||
|         new File(outputDirectory).mkdirs(); | ||||
|         try { | ||||
|             PrintWriter reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); | ||||
|             reportWriter.println(reportTemplate); | ||||
|             reportWriter.flush(); | ||||
|             reportWriter.close(); | ||||
|         } catch (IOException e) { | ||||
|             LOGGER.error("Problem saving template", e); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										33
									
								
								testng/src/test/resources/reportTemplate.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								testng/src/test/resources/reportTemplate.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| <html> | ||||
| <head><title>My Custom Report</title> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> | ||||
|     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script> | ||||
|     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> | ||||
| </head> | ||||
| <body> | ||||
| <div class="container"> | ||||
|     <table class="table"> | ||||
|         <thead> | ||||
|         <tr> | ||||
|             <th>Suite</th> | ||||
|             <th>Test</th> | ||||
|             <th>Method</th> | ||||
|             <th>Status</th> | ||||
|             <th>Execution Time(ms)</th> | ||||
|         </tr> | ||||
|         </thead> | ||||
|         <tbody> | ||||
|         <tr class="success"> | ||||
|             <td>My test suite</td> | ||||
|             <td>numbersXML</td> | ||||
|             <td>givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect</td> | ||||
|             <td>PASSED</td> | ||||
|             <td>0</td> | ||||
|         </tr> | ||||
| 
 | ||||
|         </tbody> | ||||
|     </table> | ||||
| </div> | ||||
| </body> | ||||
| </html> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user