一.背景
1.公司为规范团队的开发,涉及到组下员工的代码开发规范,日志打印规范,预警机制等。其中一项是规范团队的开发的单元测试。为了方便核检查小组开发需求的单元测试而整合的单元测试报告,测试框架用的测试框架为TESTNG,模板用的是BeautifulReport。先看一下展示的效果
二.搭建
1.使用的pom
这里我根据个人需求,把mongodb的包排除了,是因为extentreports包里面的一些异常信息截图功能会使用到mongodb,项目因为没有用到mongodb,这里不排除单侧会抛异常,但不影响使用。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.0.7</version>
<exclusions>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
2.监听器
我在项目下src/test/java/com/abcnull/listener添加了一个测试报告监听器类 TestReportListener,它继承自 testng 依赖包中的 IReporter。TestReportListener 中其实没用到太多 extentreports 依赖中的 API,只有 Gson 类来自 extentreports 依赖中,基本还是靠着第三步中写好的 BeautifulReport 型式的 html 模板,代码如下
监听器代码如下,代码可根据个人需求自行继续编写优化
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.testng.*;
import org.testng.xml.XmlSuite;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author abcnull
* @version 1.0.0
* @date 2020/1/26
*/
public class TestReportListener implements IReporter {
// 日期格式化
private static Date date = new Date();
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd,HH点mm分ss秒");
private static String reportdate = simpleDateFormat.format(date);
private static String getReportName = "测试报告-" + reportdate;
// 定义html模板所在路径
private String templatePath = this.getClass().getResource("/").getPath() + "report/template.html";
// 定义报告生成的路径
private String reportDirPath = System.getProperty("user.dir") + File.separator + "target" + File.separator + "test-output" + File.separator + "report";
private String reportPath = reportDirPath + File.separator + getReportName + ".html";
private String name = "DemoTest";
private int testsPass;
private int testsFail;
private int testsSkip;
private String beginTime;
private long totalTime;
private String project = "单元测试报告";
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
List<ITestResult> list = new ArrayList<ITestResult>();
for (ISuite suite : suites) {
Map<String, ISuiteResult> suiteResults = suite.getResults();
for (ISuiteResult suiteResult : suiteResults.values()) {
ITestContext testContext = suiteResult.getTestContext();
IResultMap passedTests =