ExtentReports介绍

  • ExtentReports用于生成自动化测试报告,相对于Testng自带的测试报告和ReportNG比较清晰、简洁,话不多说直接进入正题吧

引入依赖包

     <dependency><groupId>com.relevantcodes</groupId><artifactId>extentreports</artifactId><version>2.41.2</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.0.6</version></dependency>

编写测试方法

package com.lizheng.ExtentReport;import org.testng.Assert;
import org.testng.Reporter;
import org.testng.annotations.Test;//测试报告public class Reports {@Testpublic void report1(){Assert.assertTrue(1>2,"1大于2是错误的");}@Testpublic void report2(){String a="123";String b="3456";Assert.assertSame(a,b,"这2个对象不相同");}@Testpublic void report3(){int a=123;int b=123;Assert.assertEquals(a,b,"这2个对象不相同");}//设置一个报告日志@Testpublic void log(){Reporter.log("报告日志");}
}

编写一个监听类

  • 监听类是模板,直接复制即可。
  • 目前知识储备不够暂时有点地方不能理解,后期补上对监听类的代码解读。
package com.lizheng.ExtentReport;import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.ResourceCDN;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.model.TestAttribute;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme;
import org.testng.*;
import org.testng.xml.XmlSuite;import java.io.File;
import java.util.*;public class ExtentTestNGIReporterListener implements IReporter {//生成的路径以及文件名private static final String OUTPUT_FOLDER = "test-output/";private static final String FILE_NAME = "index.html";private ExtentReports extent;@Overridepublic void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {init();boolean createSuiteNode = false;if (suites.size() > 1) {createSuiteNode = true;}for (ISuite suite : suites) {Map<String, ISuiteResult> result = suite.getResults();//如果suite里面没有任何用例,直接跳过,不在报告里生成if (result.size() == 0) {continue;}//统计suite下的成功、失败、跳过的总用例数int suiteFailSize = 0;int suitePassSize = 0;int suiteSkipSize = 0;ExtentTest suiteTest = null;//存在多个suite的情况下,在报告中将同一个一个suite的测试结果归为一类,创建一级节点。if (createSuiteNode) {suiteTest = extent.createTest(suite.getName()).assignCategory(suite.getName());}boolean createSuiteResultNode = false;if (result.size() > 1) {createSuiteResultNode = true;}for (ISuiteResult r : result.values()) {ExtentTest resultNode;ITestContext context = r.getTestContext();if (createSuiteResultNode) {//没有创建suite的情况下,将在SuiteResult的创建为一级节点,否则创建为suite的一个子节点。if (null == suiteTest) {resultNode = extent.createTest(r.getTestContext().getName());} else {resultNode = suiteTest.createNode(r.getTestContext().getName());}} else {resultNode = suiteTest;}if (resultNode != null) {resultNode.getModel().setName(suite.getName() + " : " + r.getTestContext().getName());if (resultNode.getModel().hasCategory()) {resultNode.assignCategory(r.getTestContext().getName());} else {resultNode.assignCategory(suite.getName(), r.getTestContext().getName());}resultNode.getModel().setStartTime(r.getTestContext().getStartDate());resultNode.getModel().setEndTime(r.getTestContext().getEndDate());//统计SuiteResult下的数据int passSize = r.getTestContext().getPassedTests().size();int failSize = r.getTestContext().getFailedTests().size();int skipSize = r.getTestContext().getSkippedTests().size();suitePassSize += passSize;suiteFailSize += failSize;suiteSkipSize += skipSize;if (failSize > 0) {resultNode.getModel().setStatus(Status.FAIL);}resultNode.getModel().setDescription(String.format("Pass: %s ; Fail: %s ; Skip: %s ;", passSize, failSize, skipSize));}buildTestNodes(resultNode, context.getFailedTests(), Status.FAIL);buildTestNodes(resultNode, context.getSkippedTests(), Status.SKIP);buildTestNodes(resultNode, context.getPassedTests(), Status.PASS);}if (suiteTest != null) {suiteTest.getModel().setDescription(String.format("Pass: %s ; Fail: %s ; Skip: %s ;", suitePassSize, suiteFailSize, suiteSkipSize));if (suiteFailSize > 0) {suiteTest.getModel().setStatus(Status.FAIL);}}}
//        for (String s : Reporter.getOutput()) {//            extent.setTestRunnerOutput(s);
//        }extent.flush();}private void init() {//文件夹不存在的话进行创建File reportDir = new File(OUTPUT_FOLDER);if (!reportDir.exists() && !reportDir.isDirectory()) {reportDir.mkdir();}ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);// 设置静态文件的DNS//怎么样解决cdn.rawgit.com访问不了的情况  (CSS无法访问)htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);//以上这句话 就是解决CSS无法加载htmlReporter.config().setDocumentTitle("api自动化测试报告");htmlReporter.config().setReportName("api自动化测试报告");htmlReporter.config().setChartVisibilityOnOpen(true);htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);htmlReporter.config().setTheme(Theme.STANDARD);htmlReporter.config().setCSS(".node.level-1  ul{ display:none;} .node.level-1.active ul{display:block;}");extent = new ExtentReports();extent.attachReporter(htmlReporter);extent.setReportUsesManualConfiguration(true);}private void buildTestNodes(ExtentTest extenttest, IResultMap tests, Status status) {//存在父节点时,获取父节点的标签String[] categories = new String[0];if (extenttest != null) {List<TestAttribute> categoryList = extenttest.getModel().getCategoryContext().getAll();categories = new String[categoryList.size()];for (int index = 0; index < categoryList.size(); index++) {categories[index] = categoryList.get(index).getName();}}ExtentTest test;if (tests.size() > 0) {//调整用例排序,按时间排序Set<ITestResult> treeSet = new TreeSet<ITestResult>(new Comparator<ITestResult>() {@Overridepublic int compare(ITestResult o1, ITestResult o2) {return o1.getStartMillis() < o2.getStartMillis() ? -1 : 1;}});treeSet.addAll(tests.getAllResults());for (ITestResult result : treeSet) {Object[] parameters = result.getParameters();String name = "";//如果有参数,则使用参数的toString组合代替报告中的namefor (Object param : parameters) {name += param.toString();}if (name.length() > 0) {if (name.length() > 50) {name = name.substring(0, 49) + "...";}} else {name = result.getMethod().getMethodName();}if (extenttest == null) {test = extent.createTest(name);} else {//作为子节点进行创建时,设置同父节点的标签一致,便于报告检索。test = extenttest.createNode(name).assignCategory(categories);}//test.getModel().setDescription(description.toString());//test = extent.createTest(result.getMethod().getMethodName());for (String group : result.getMethod().getGroups())test.assignCategory(group);List<String> outputList = Reporter.getOutput(result);for (String output : outputList) {//将用例的log输出报告中test.debug(output);}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();}
}

配置testng.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="testng" verbose="2"><test name="study"><classes><!--测试类--><class name="com.lizheng.ExtentReport.Reports"/></classes></test><!--设置监听类--><listeners><!--这里是监听类的目录不要直接复制--><listener class-name="com.lizheng.ExtentReport.ExtentTestNGIReporterListener"/></listeners>
</suite>

运行xml文件生成测试报告

  • 运行testng.xml文件后会在项目下自动生成test-out目录(这个是监听类自己定义)文件index.html(这个是监听类自己定义)就是测试报告


    备注:目前理解只停留怎么用,具体实现方式还很多地方不能理解,写的不好的地方,希望各位大佬提出建议。

ExtentReports生成自动化测试报告相关推荐

  1. Selenium+python怎么搭建自动化测试框架、执行自动化测试用例、生成自动化测试报告、发送测试报告邮件

    目录 一.项目结构介绍 1.mztestpro测试项目 2.bbs目录 3.test_case 二.编写公共模块 三.编写Page Object 四.编写测试用例 五.执行测试用例 小结: 本人在网上 ...

  2. 通过Jenkins执行脚本,生成自动化测试报告

    1.allure配置 a.下载 allure 的安装包.allure 跨语言的 b.下载链接:https://github.com/allure-framework/allure2/releases ...

  3. Python生成自动化测试报告的两种方法

    方法一:HTMLTestRunner HTMLTestRunner可以下载,参考HTMLTestRunner下载及生成报告 - 简书 s=unittest.TestLoader().discover( ...

  4. Jenkins+Newman+Postman生成接口自动化测试报告

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作. 文章目录 1. Jenkins的安装与配置 1.1 安装jenkins 1.2 jenkins中文设置 ...

  5. 自动化测试报告浅谈之ExtentReports

    我们在进行自动化测试时,往往需要有相应的测试报告,比如junit,testng,reportng等等,有会有自带的测试报告,那为什么我要在这边提ExtentReports?首先,我们来看看其它几种测试 ...

  6. jmeter——jmeter+ant生成优化的HTML接口自动化测试报告

    jmeter+ant生成优化的HTML测试报告 一.最终实现效果展示 二.实现方式 1.环境搭建 2.实现原理 3.报告生成方式 三.实现步骤 1.jar包转移:实现ant调用jmeter脚本 2.j ...

  7. 自动化测试报告表格html的生成(基于MATLAB)

    文章目录 前言 自动化生成报告总体步骤 报告模板 附件 前言 在自动化测试时,经常会统计一些测试得到的统计结果或者仿真结果等.若每次仿真完成后手动将每个结果值依次添加到excel或者报表中,这些机械重 ...

  8. python怎么自动生成测试报告_python生成接口自动化测试报告模版

    1:准备html模版 接口自动化 自动化测试报告:&test_data 被测版本:&version 成功:&pass 失败:&fail 错误:&error 最后 ...

  9. python做接口自动化如何输出测试报告-python生成接口自动化测试报告模版

    自动化测试报告:&test_data 被测版本:&version 成功:&pass 失败:&fail 错误:&error 最后时间:&lasttime ...

最新文章

  1. 并发 IO多路复用 select 非asyncio
  2. Modeling System Behavior with Use Case(2)
  3. android将发送短信写入发件箱
  4. 【可持久化线段树?!】rope史上最全详解
  5. Qt Creator建立多个平台
  6. C#字符串常见操作总结详解
  7. [JavaWeb-HTML]HTML特殊字符表
  8. config.class.php,Config.class.php
  9. oracle 取时间比较,Oracle最大日期获取方法
  10. 大中台模式下如何构建复杂业务核心状态机组件
  11. android路上的点点滴滴
  12. 平年用c语言的计算方式,C语言平年闰年问题
  13. 6 月编程语言排行榜:Python 飙升,有望挑战 Java 和 C?
  14. php中session总结,PHP中SESSION使用中的一点经验总结
  15. Spring Boot 2.0.3 使用外置 Tomcat 服务器
  16. 开源同步文件软件对比
  17. 使用keytool转换签名证书格式,keyStore、jks签名证书相互转换
  18. TestCenter测试管理工具环境配置(C)
  19. html中用form单选框右侧提示汗字,HTML表单(Forms)解析
  20. windows查看MAC地址

热门文章

  1. LCD液晶屏的基本结构图及显示工作原理是什么呢
  2. nlp中的实体关系抽取方法总结
  3. 【文章】我在华为打工的日子
  4. linux挂载img镜像文件,如何挂载.img格式的镜像
  5. 时光荏苒,白驹过隙。2018年总结!
  6. 运营干货:虾皮店铺装修怎么做?
  7. ✨【Code皮皮虾】一次通过99.90%,思路详解【找到需要补充粉笔的学生编号】
  8. 数商云医药医疗行业B2B平台:如何赋能企业数字化转型,破局传统医药通路难题
  9. 最详细的Java程序打包成“可安装使用”的桌面应用
  10. PDF处理软件:无法加注释加高亮(解密PDF等)