在上文走进Java接口测试之测试框架TestNG
中我们详细介绍了 TestNG 的各种用法, 在本文中,我将详细介绍如何将 ExtentReports 测试报告与TestNG集成。
主要特点:
TestNG 原生报告有点丑,信息整理有点乱。ExtentReports 是用于替换TestNG 原生报告。当然也可以使用 ReportNg,个人偏好 ExtentReports 样式。
官网已经给了很多demo了,大家可以参考练习,这里根据个人经验进行了配置。
官网:http://extentreports.com/
客户端:https://github.com/anshooarora/extentreports-java/commits/master
服务端:https://github.com/anshooarora/extentx
引入pom.xml
<dependency>
<groupId>com.aventstackgroupId>
<artifactId>extentreportsartifactId>
<version>3.1.5version>
<scope>providedscope>
dependency>
<dependency>
<groupId>com.vimalselvamgroupId>
<artifactId>testng-extentsreportartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>com.relevantcodesgroupId>
<artifactId>extentreportsartifactId>
<version>2.41.2version>
dependency>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>6.14.3version>
<scope>compilescope>
dependency>
主要基于以下两项原因:
下载 ExtentReportes 源码,找到 ExtentTestNgFormatter 类,Listener 目录下创建 MyExtentTestNgFormatter.java
类直接继承 ExtentTestNgFormatter 类。
public class MyExtentTestNgFormatter extends ExtentTestNgFormatter {
构造方法加入
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
具体代码如下:
ublic MyExtentTestNgFormatter() {
setInstance(this);
testRunnerOutput = new ArrayList<>();
String reportPathStr = System.getProperty("reportPath");
File reportPath;
try {
reportPath = new File(reportPathStr);
} catch (NullPointerException e) {
reportPath = new File(TestNG.DEFAULT_OUTPUTDIR);
}
if (!reportPath.exists()) {
if (!reportPath.mkdirs()) {
throw new RuntimeException("Failed to create output run directory");
}
}
File reportFile = new File(reportPath, "report.html");
File emailReportFile = new File(reportPath, "emailable-report.html");
htmlReporter = new ExtentHtmlReporter(reportFile);
EmailReporter emailReporter = new EmailReporter(emailReportFile);
reporter = new ExtentReports();
// 如果cdn.rawgit.com访问不了,可以设置为:ResourceCDN.EXTENTREPORTS或者ResourceCDN.GITHUB
htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
reporter.attachReporter(htmlReporter, emailReporter);
}
重写onstart 方法功能。新建一个类名为MyReporter,一个静态ExtentTest的引用。
Listener 包下 MyReporter.java
public class MyReporter {
public static ExtentTest report;
}
MyExtentTestNgFormatter.java
public void onStart(ITestContext iTestContext) {
ISuite iSuite = iTestContext.getSuite();
ExtentTest suite = (ExtentTest) iSuite.getAttribute(SUITE_ATTR);
ExtentTest testContext = suite.createNode(iTestContext.getName());
// 将MyReporter.report静态引用赋值为testContext。
// testContext是@Test每个测试用例时需要的。report.log可以跟随具体的测试用例。另请查阅源码。
MyReporter.report = testContext;
iTestContext.setAttribute("testContext", testContext);
}
测试报告默认是在工程根目录下创建 test-output/
文件夹下,名为report.html
、emailable-report.html
。可根据各自需求在构造方法中修改。
public MyExtentTestNgFormatter() {
setInstance(this);
testRunnerOutput = new ArrayList<>();
// reportPath报告路径
String reportPathStr = System.getProperty("reportPath");
File reportPath;
try {
reportPath = new File(reportPathStr);
} catch (NullPointerException e) {
reportPath = new File(TestNG.DEFAULT_OUTPUTDIR);
}
if (!reportPath.exists()) {
if (!reportPath.mkdirs()) {
throw new RuntimeException("Failed to create output run directory");
}
}
// 报告名report.html
File reportFile = new File(reportPath, "report.html");
// 邮件报告名emailable-report.html
File emailReportFile = new File(reportPath, "emailable-report.html");
htmlReporter = new ExtentHtmlReporter(reportFile);
EmailReporter emailReporter = new EmailReporter(emailReportFile);
reporter = new ExtentReports();
reporter.attachReporter(htmlReporter, emailReporter);
}
report.log 支持多种玩法
// 根据状态不同添加报告。型如警告
MyReporter.report.log(Status.WARNING, "接口耗时(ms):" + String.valueOf(time));
直接从TestClass 中运行时会报 MyReporter.report
的空指针错误,需做判空处理。
在测试集合 testng.xml 文件中导入 Listener 监听类。
<listeners>
<listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
listeners>
extent reporters
支持报告的配置。目前支持的配置内容有title、主题等。
先在src/resources/
目录下添加 config/report/extent-config.xml
。
<extentreports>
<configuration>
<timeStampFormat>yyyy-MM-dd HH:mm:sstimeStampFormat>
<theme>darktheme>
<encoding>UTF-8encoding>
<protocol>httpsprotocol>
<documentTitle>QA-接口自动化测试报告documentTitle>
<reportName>QA-接口自动化测试报告reportName>
<reportHeadline>接口自动化测试报告reportHeadline>
<dateFormat>yyyy-MM-dddateFormat>
<timeFormat>HH:mm:sstimeFormat>
<scripts>
scripts>
<styles>
styles>
configuration>
extentreports>
config下新建 MySystemInfo类继承 SystemInfo 接口
public class MySystemInfo implements SystemInfo {
@Override
public Map<String, String> getSystemInfo() {
Map<String, String> systemInfo = new HashMap<>();
systemInfo.put("测试人员", "zuozewei");
return systemInfo;
}
}
可用于添加系统信息,例如:db的配置信息,人员信息,环境信息等。根据项目实际情况添加。
至此,extentreports 美化报告完成。
public class TestMethodsDemo {
@Test
public void test1(){
Assert.assertEquals(1,2);
}
@Test
public void test2(){
Assert.assertEquals(1,1);
}
@Test
public void test3(){
Assert.assertEquals("aaa","aaa");
}
@Test
public void logDemo(){
Reporter.log("这是故意写入的日志");
throw new RuntimeException("故意运行时异常");
}
}
<suite name="测试demo" verbose="1" preserve-order="true">
<parameter name="report.config" value="src/main/resources/report/extent-config.xml"/>
<parameter name="system.info" value="com.zuozewei.extentreportdemo.config.MySystemInfo"/>
<test name="测试demo" preserve-order="true">
<classes>
<class name="com.zuozewei.extentreportdemo.testCase.TestMethodsDemo"/>
classes>
test>
<listeners>
<listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
listeners>
suite>
源码地址:https://github.com/zuozewei/Java-API-Test-Examples