Can I generate HTML Report in Test Listener? --- Yes, I can

I renamed the PurgeHTMLReport class to GenerateTestSuiteReports. It supports generating PDF report as well as HTML report.

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths

import com.kms.katalon.core.annotation.AfterTestSuite
import com.kms.katalon.core.configuration.RunConfiguration
import com.kms.katalon.core.context.TestSuiteContext
import com.kms.katalon.core.logging.KeywordLogger
import com.kms.katalon.core.logging.model.TestSuiteLogRecord
import com.kms.katalon.core.reporting.ReportWriterUtil
import com.kms.katalon.core.reporting.ReportWriterUtil.SuiteReportGenerationOptionsBuilder
import com.kms.katalon.core.reporting.pdf.TestSuitePdfGenerator
import com.kms.katalon.core.reporting.pdf.exception.JasperReportException
import com.kms.katalon.core.setting.ReportBundleSettingStore
import com.kms.katalon.core.setting.ReportSettings
import com.kms.katalon.core.util.internal.ExceptionsUtil


class GenerateTestSuiteReports {
	
	@AfterTestSuite
	def afterTestSuite(TestSuiteContext testSuiteContext) {
		// generate test-suite-report.html file
		Path htmlReport = ReportGenerator.generateHTMLReport("custom/test-suite-report.html")
		println "HTML report: " + htmlReport.toString()
		
		// generate test-suite-report.pdf file
		Path pdfReport = ReportGenerator.generatePDFReport("custom/test-suite-report.pdf")
		println "PDF report: " + pdfReport.toString()	
	}
	
	
	
	/**
	 * 
	 */
	private class ReportGenerator {
		
		private static final KeywordLogger logger = KeywordLogger.getInstance(ReportGenerator.class);
		
		private static Path projectDir = Paths.get(RunConfiguration.getProjectDir()).toAbsolutePath()
		private static Path reportFolder = Paths.get(RunConfiguration.getReportFolder()).toAbsolutePath()
		private static ReportSettings settings = ReportBundleSettingStore.getStore(projectDir.toString()).getSettings()
		
		static void validateParams() {
			assert Files.exists(projectDir)
			assert settings != null
			assert Files.exists(reportFolder)
		}
		
		static void ensureParentDir(Path file) {
			Path parentDir = file.getParent()
			if (!Files.exists(parentDir)) {
				Files.createDirectories(parentDir)
			}
		}
		
		static Path generateHTMLReport(String htmlFileName) {
			validateParams()
			Path htmlReport = reportFolder.resolve(htmlFileName).toAbsolutePath()
			ensureParentDir(htmlReport)
			TestSuiteLogRecord testSuiteLogRecord = ReportWriterUtil.parseTestSuiteLog(reportFolder.toString())
			ReportWriterUtil.writeHTMLReport(
				SuiteReportGenerationOptionsBuilder.create()
					.suiteLogRecord(testSuiteLogRecord)
					.settings(settings)
					.reportDir(reportFolder.toFile())
					.outputFile(htmlReport.toFile())
					.build())
			return htmlReport
		}
		
		static Path generatePDFReport(String pdfFileName) {
			validateParams()
			Path pdfReport = reportFolder.resolve(pdfFileName).toAbsolutePath()
			ensureParentDir(pdfReport)
			TestSuiteLogRecord testSuiteLogRecord = ReportWriterUtil.parseTestSuiteLog(reportFolder.toString())
			TestSuitePdfGenerator pdfGenerator = new TestSuitePdfGenerator(testSuiteLogRecord);
			try {
				pdfGenerator.exportToPDF(pdfReport.toString());
			} catch (JasperReportException e) {
				logger.logWarning(ExceptionsUtil.getStackTraceForThrowable(e));
				throw new IOException(e);
			}
			return pdfReport
		}
	}
}
1 Like