ExtentReports实现
来源:互联网 发布:李涛疯狂淘宝怎么样 编辑:程序博客网 时间:2024/06/09 15:38
客户端地址:https://github.com/anshooarora/extentreports-java/commits/master
服务端地址:https://github.com/anshooarora/extentx
官方DOC:http://extentreports.com/docs/versions/3/java/
实现方式(3种):
- 方式一:直接在@BeforeSuite和@BeforeClass进行初始化
- 方式二:自己实现testng的ITestListener接口
- 方式三:自己实现testng的IReporter接口
以方式三为例:
POM引用:
<dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>3.1.1</version></dependency><!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --><dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version></dependency>
3.0.7版本可能会存在样式问题,降了版本之后,样式就好了。同时还需应用freemarker
实现testng的IReporter接口
初始化 Report
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);ExtentReports extent = new ExtentReports();extent.attachReporter(htmlReporter);extent.setReportUsesManualConfiguration(true);
生成报告
extent.flush();
执行用例之后,直接浏览器打开/test-out/index.html
服务端配置
下载Extentx
下载地址:http://extentreports.com/community/,选择Extentx下载,并解压
安装
前提:mongo以及端口配置正确
MongoDB和NodeJS不在同一环境
1. 运行mongo
2. 进入extentx目录,并执行:
npm installsails lift
最后,打开http://localhost:1337/,就可以看到历史报告了
现在Extentx已经被废弃了,用klov代替,但klov只支持3.1.0以上版本的extent
下载klov
下载地址:http://extentreports.com/community/,选择Klov下载,并解压
安装
前提:mongo以及端口配置正确
只要启动jar包就行
java -jar klov-0.0.1.jar
或后台运行:
nohup java -jar klov-0.0.1.jar &
打开http://localhost:80/就行了。
在执行测试用例之前,还需要配置TestNG的监听器:
这样html文件就是由extentReports生成的。
HTML报告:
服务端报告:
监听器代码(网上找的):
public class ExtentTestNGIReporterListener implements IReporter { // 生成的路径以及文件名 private static final String OUTPUT_FOLDER = "test-output/"; private static final String FILE_NAME = "index.html"; private ExtentReports extent = ExtentManager.getInstance(OUTPUT_FOLDER + FILE_NAME); @Override public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) { 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 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>() { @Override public 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组合代替报告中的name /*for (Object param : parameters) { name += param.toString(); }*/// name = result.getTestName(); 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); if(!outputList.isEmpty()) for (String output : outputList) { // 将用例的log输出报告中 // test.debug(output); // test.info("output:"+output); if (result.getThrowable() != null) { test.log(status, result.getThrowable()); } else { Markup m = MarkupHelper.createLabel(output, status==Status.PASS?ExtentColor.BLUE:ExtentColor.RED);// test.log(status, "Test "+ status.toString().toLowerCase() + "ed "+output); test.log(status, m); } } else 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(); }}
public class ExtentManager { private static ExtentReports extent; public static ExtentReports getInstance(String filePath) { if (extent == null) createInstance(filePath); return extent; } public static void createInstance(String filePath) { extent = new ExtentReports();// extent.setSystemInfo("os", "Linux"); //关联extentx服务端 <!--extent.attachReporter(createHtmlReporter(filePath), createExtentXReporter());--> //关联klov服务端 extent.attachReporter(createHtmlReporter(filePath), createKlovReporter()); } public static ExtentHtmlReporter createHtmlReporter(String filePath){ ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(filePath); //报表位置 htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP); //使报表上的图表可见 htmlReporter.config().setDocumentTitle("ExtentReports"); htmlReporter.config().setChartVisibilityOnOpen(true); htmlReporter.config().setTheme(Theme.STANDARD); htmlReporter.config().setDocumentTitle(filePath); htmlReporter.config().setEncoding("utf-8"); htmlReporter.config().setReportName("plateClient自动化测试报告");// 如果cdn.rawgit.com访问不了,可以设置为:ResourceCDN.EXTENTREPORTS或者ResourceCDN.GITHUB htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);// htmlReporter.views().dashboard().setSection("Sample", SectionSize.S4, header, list); pro-only return htmlReporter; } public static ExtentXReporter createExtentXReporter() { ExtentXReporter extentx = new ExtentXReporter("127.0.0.1",27017); extentx.config().setProjectName("PlatClientTest"); extentx.config().setReportName("PlatClientTest Reports"); extentx.config().setServerUrl("http://localhost:1337"); return extentx; } public static KlovReporter createKlovReporter() { KlovReporter klov = new KlovReporter(); klov.initMongoDbConnection("localhost", 27017); klov.setKlovUrl("http://localhost:80"); klov.setProjectName("PlatClientTest"); klov.setReportName("buildName"); return klov; }}
- ExtentReports实现
- 实现
- 实现
- 红黑树实现 实现代码
- java实现排列组合实现
- 实现Runnable 实现线程
- 实现ViewPager多种实现
- 双向LSTM实现实现
- 实现缓存 java实现
- 三子棋的实现的实现的实现
- 四则运算实现
- 继承实现
- 重载实现
- 实现缩略图
- split实现
- 实现缩略图
- wmi实现
- 实现缩略图
- 关于python2与python3共存问题
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
- 旋转数组
- 读后感---5w
- HTML中 用CSS样式实现 文字两边添加水平线
- ExtentReports实现
- Zabbix监控平台部署+监控客户端
- Java 几道常见String面试题
- 复杂网络问答
- TP5使用phpmailer出现的错误
- Spring Boot对dubbo的整合
- ubuntu 16.04 上安装支持GPU的caffe
- unity3d之3D贪吃蛇
- 欢迎使用CSDN-markdown编辑器