extentreports报告插件与testng集成(二)
之前的一篇文章中,是把extentreports 的报告的初始方法写在driver的初始方法中,写报告的方法在testng的 onTest中,这次将这些方法全都拆出来,写在一个方法类中,这个类重现实现了 testng IReporter接口中的 generateReport 方法同时加入了失败自动截图方法。
1.首先说一下自动截图方法的实现
截图实现类:
package seleniumstudy.utils; import java.io.File;
import java.io.IOException; import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot; public class ScreenScr { public static void getScreen(TakesScreenshot driver,String filename){ String cyrPatn=System.getProperty("user.dir"); File scrfile=driver.getScreenshotAs(OutputType.FILE); try {
FileUtils.copyFile(scrfile, new File(cyrPatn+"\\img\\"+filename+".png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("GetScreenshot Fail");
}finally{
System.out.println("GetScreenshot Successful"+cyrPatn+"\\img\\"+filename+".png");
} } }
为了在testng 的监听中调用截图方法,所以封装了一个BaseTestcase类 。
BaseTestcase类:
import seleniumstudy.utils.ScreenScr;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.TouchAction;
public class BaseTestcase {
public AppiumDriver driver; public void setdriver(AppiumDriver driver){
this.driver=driver;
} public void takescreen(String filename){
ScreenScr.getScreen(driver, filename);
}
}
重写的testnglistener类:
package seleniumstudy.utils; import org.apache.log4j.Logger;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter; import seleniumstudy.testcase.BaseTestcase;
import seleniumstudy.testcase.InitDriverCase; import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import com.relevantcodes.extentreports.LogStatus; public class TestngListener extends TestListenerAdapter {
private Logger logger = Logger.getLogger(TestngListener.class);
// protected ExtentReports extent;
// protected ExtentTest test; @Override
public void onTestStart(ITestResult tr) {
super.onTestStart(tr);
logger.info("【" + tr.getName() + " Start】");
// extent=InitDriverCase.getextent();
// test= extent.startTest(tr.getName());
} @Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
logger.info("【" + tr.getName() + " Failure】");
takeScreenShot(tr);
// test.log(LogStatus.INFO,"TakesScreenshot ",test.addScreenCapture("../img/"+tr.getName()+".png"));
// test.log(LogStatus.FAIL, tr.getThrowable());
// extent.endTest(test); } public void takeScreenShot(ITestResult tr){
BaseTestcase baseTestcase=(BaseTestcase)tr.getInstance();
baseTestcase.takescreen(tr.getName()); } @Override
public void onTestSkipped(ITestResult tr) {
super.onTestSkipped(tr);
takeScreenShot(tr);
logger.info("【" + tr.getName() + " Skipped】");
// test.log(LogStatus.SKIP, "SKIP");
// extent.endTest(test);
} @Override
public void onTestSuccess(ITestResult tr) {
super.onTestSuccess(tr);
logger.info("【" + tr.getName() + " Success】");
// test.log(LogStatus.PASS, "Pass");
// extent.endTest(test);
} @Override
public void onFinish(ITestContext testContext) {
super.onFinish(testContext);
}
}
实现extentreports生成的监听类ExtentReporterNGListener:
package seleniumstudy.utils; import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map; import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.xml.XmlSuite; import com.relevantcodes.extentreports.DisplayOrder;
import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import com.relevantcodes.extentreports.LogStatus;
import com.relevantcodes.extentreports.ReporterType; public class ExtentReporterNGListener implements IReporter{ private ExtentReports extent; @Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory){
// true为覆盖已经生成的报告
extent = new ExtentReports(outputDirectory + File.separator + "Extent.html", true // true为覆盖已经生成的报告,false 在已有的报告上面生成,不会覆盖旧的结果
,DisplayOrder.NEWEST_FIRST // 最新运行的用例结果在第一个
);
extent.startReporter(ReporterType.DB, outputDirectory + File.separator + "Extent.html"); //生成本地的DB数据文件 for (ISuite suite : suites) {
Map<String, ISuiteResult> result = suite.getResults(); for (ISuiteResult r : result.values()) {
ITestContext context = r.getTestContext(); buildTestNodes(context.getPassedTests(), LogStatus.PASS);
buildTestNodes(context.getFailedTests(), LogStatus.FAIL);
buildTestNodes(context.getSkippedTests(), LogStatus.SKIP);
}
} extent.flush();
extent.close();
} private void buildTestNodes(IResultMap tests, LogStatus status) {
ExtentTest test; if (tests.size() > 0) {
for (ITestResult result : tests.getAllResults()) {
test = extent.startTest(result.getMethod().getMethodName()); test.setStartedTime(getTime(result.getStartMillis()));
test.setEndedTime(getTime(result.getEndMillis())); for (String group : result.getMethod().getGroups())
test.assignCategory(group); if (result.getThrowable() != null) {
test.log(status, test.addScreenCapture("../img/"+result.getMethod().getMethodName()+".png"));
test.log(status, result.getThrowable()); }
else {
test.log(status, "Test " + status.toString().toLowerCase() + "ed");
} extent.endTest(test);
}
}
} 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="Suite">
<listeners>
<listener class-name="seleniumstudy.utils.TestngListener"></listener>
<listener class-name="seleniumstudy.utils.ExtentReporterNGListener"></listener>
</listeners>
<test name="Test">
<classes>
<class name="seleniumstudy.testcase.ExtenseReport"></class>
</classes>
</test>
</suite>
最后生成的的报告会在 test-output 目录下 Extent.html 中。
extentreports报告插件与testng集成(二)的更多相关文章
- extentreports报告插件与testng集成(一)
前段时间在群里有人说了下用这个插件来生成测试报告,发现生成的报告非常不错.就下来学习了一下,并集成到了testng上,下面来分享一下: ExtentReports (by Anshoo Arora) ...
- extentreports报告插件与testng集成
前段时间在群里有人说了下用这个插件来生成测试报告,发现生成的报告非常不错.就下来学习了一下,并集成到了testng上,下面来分享一下: ExtentReports (by Anshoo Arora) ...
- extentreports报告插件之extentX之服务搭建(三)
之前两个章节已经写完再extentreports报告插件与testng 的集成,但是发现 每次测试完后,生成的报告都要在单独发送,每个项目都有一份报告,如果项目多的话,管理起来就会很冗余. 这个给大家 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- 持续集成之Jenkins+Gitlab实现持续集成 [二]
持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建 General 源码管理 我们安装的是Git插件,还可以安装svn插件 我们将 ...
- python nose测试框架全面介绍九---各种html报告插件对比
一直在使用Nose-html-reporting,并输出html报告,但今天在使用时发出有点问题:于时,将python目前可能的html报告插件下载后进行对比,如下 一.Nose-html-repor ...
- 笔记:Maven 项目报告插件
Maven 项目报告插件,都是对于前面生成的项目站点的内容丰富,因此都是基于项目站点的,生成的命令和生成项目站点一致(mvn site),项目报告插件的配置和一般插件不同,是在 project-> ...
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Maven 项目报告插件
Maven 项目报告插件,都是对于前面生成的项目站点的内容丰富,因此都是基于项目站点的,生成的命令和生成项目站点一致(mvn site),项目报告插件的配置和一般插件不同,是在 project-> ...
随机推荐
- sdk 简单说明文档草稿。
SDK初始化: HighApi为SDK核心类,请客户端持有其唯一单例对API进行调用. HighApi构造器函数 HighApi(Context appContext, final String ap ...
- Linux Command Line 笔记(1)
Yunduan CUI graphical user interfaces make easy tasks easy, while command line interfaces make diffi ...
- linux文件目录权限详解(20170101)
linux目录权限与文件权限是不同的,二者要相互配合,这是基础. 比如要读文件:目录至少要有x,文件至少要有r. 要写文件:目录至少要有x,文件至少要有rw. 要执行文件:目录至少要有x,文件至少要有 ...
- [NOIP2015] 斗地主(搜索)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- openssl 升级
openssl version -a rpm -q --changelog openssl | grep CVE bash -version #!/bin/bash if [[ $EUID -ne ...
- 股票数据调用示例代码php
<!--?php // +---------------------------------------------------------------------- // | JuhePHP ...
- TensorFlow官方文档中文版
github地址: https://github.com/jikexueyuanwiki/tensorflow-zh
- Java Web 编程
Java Web 编程 21天学通JAVA-WEB开发:http://files.cnblogs.com/files/maven-chao/Java_Web.zip
- 委托、回调 Lambda表达式书写方式
- [LeetCode] 14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. public class ...