TestNG自带的测试报告的显示效果简洁但不够直观,缺少了一些美感,本文介绍了ExtentReports插件来生成美观的测试报告,并解决Maven整合监听器ExtentTestNGIReporterListener中com.aventstack.extentreports依赖包的缺失,以及监听器生成报告中文乱码的问题。
TestNG自带的测试报告,index.html文件
首先新建Maven工程,编辑pom.xml
这里解决依赖包的问题,Maven会自动下载jar包到Maven仓库
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.course.code</groupId>
<artifactId>Chapter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>Chapter5</module>
<module>Chapter6</module>
</modules>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.1</version>
</dependency>
<dependency>
<groupId>com.vimalselvam</groupId>
<artifactId>testng-extentsreport</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.1.3</version>
</dependency>
</dependencies>
</project>
新建类TestMethodsDemo ,有2个成功的方法,1个运行异常失败的方法
package com.tester.extend.demo;
import org.testng.Assert;
import org.testng.Reporter;
import org.testng.annotations.Test;
public class TestMethodsDemo {
@Test
public void test1() {
Assert.assertEquals("aaa", "aaa");
}
@Test
public void test2() {
Assert.assertEquals(1, 1);
}
@Test
public void logDemo() {
Reporter.log("自己写的日志");
throw new RuntimeException("自己抛的异常");
}
}
新建监听器,复制以下代码
在这里解决中文显示乱码的问题
package com.tester.extend.demo;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.ResourceCDN;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme;
import org.testng.*;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class ExtentTestNGIReporterListener implements IReporter {
//测试报告导出到test-output文件夹下的Extent.html
private static final String OUTPUT_FOLDER = "test-output/";
private static final String FILE_NAME = "Extent.html";
private ExtentReports extent;
public void generateReport(List xmlSuites, List suites, String outputDirectory) {
init();
for (Object suite : suites) {
Map result = ((ISuite) suite).getResults();
for (Object r : result.values()) {
ITestContext context = ((ISuiteResult) r).getTestContext();
buildTestNodes(context.getFailedTests(), Status.FAIL);
buildTestNodes(context.getSkippedTests(), Status.SKIP);
buildTestNodes(context.getPassedTests(), Status.PASS);
}
}
for (String s : Reporter.getOutput()) {
extent.setTestRunnerOutput(s);
}
extent.flush();
}
private void init() {
ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
htmlReporter.config().setDocumentTitle("ExtentReports - Created by TestNG Listener");
htmlReporter.config().setReportName("ExtentReports - Created by TestNG Listener");
htmlReporter.config().setTestViewChartLocation(ChartLocation.BOTTOM);
htmlReporter.config().setTheme(Theme.STANDARD);
//解决测试报告中文乱码问题
htmlReporter.config().setEncoding("gbk");
//设置静态文件的DNS
//解决国内www.rawgit.com访问不了的情况,无法加载css文件导致网页加载一直转圈
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
extent = new ExtentReports();
extent.attachReporter(htmlReporter);
extent.setReportUsesManualConfiguration(true);
}
private void buildTestNodes(IResultMap tests, Status status) {
ExtentTest test;
if (tests.size() > 0) {
for (ITestResult result : tests.getAllResults()) {
test = extent.createTest(result.getMethod().getMethodName());
for (String group : result.getMethod().getGroups())
test.assignCategory(group);
if (result.getThrowable() != null) {
test.log(status, result.getThrowable());
}
else {
test.log(status, "Test " + status.toString().toLowerCase() + "ed");
}
test.getModel().setStartTime(getTime(result.getStartMillis()));
test.getModel().setEndTime(getTime(result.getEndMillis()));
}
}
}
private Date getTime(long millis) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar.getTime();
}
}
新建Maven Module,命名为Chapter6,新建xml配置文件settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="MySuite">
<test name="MyTestModule">
<classes>
<class name="com.tester.extend.demo.TestMethodsDemo">
<methods>
<include name="test1"/>
<include name="test2"/>
<include name="logDemo"/>
</methods>
</class>
</classes>
</test>
<listeners>
<listener class-name="com.tester.extend.demo.ExtentTestNGIReporterListener"/>
</listeners>
</suite>
最后运行settIngs.xml即可得到输出的测试报告,我用的是Eclipse,所以只能去文件夹找到导出的Exent.html,打开就是这样
ExtentReports生成的测试报告