之前的一篇文章中,是把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集成(二)的更多相关文章

  1. extentreports报告插件与testng集成(一)

    前段时间在群里有人说了下用这个插件来生成测试报告,发现生成的报告非常不错.就下来学习了一下,并集成到了testng上,下面来分享一下: ExtentReports (by Anshoo Arora) ...

  2. extentreports报告插件与testng集成

    前段时间在群里有人说了下用这个插件来生成测试报告,发现生成的报告非常不错.就下来学习了一下,并集成到了testng上,下面来分享一下: ExtentReports (by Anshoo Arora) ...

  3. extentreports报告插件之extentX之服务搭建(三)

    之前两个章节已经写完再extentreports报告插件与testng 的集成,但是发现 每次测试完后,生成的报告都要在单独发送,每个项目都有一份报告,如果项目多的话,管理起来就会很冗余. 这个给大家 ...

  4. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  5. 持续集成之Jenkins+Gitlab实现持续集成 [二]

    持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将 ...

  6. python nose测试框架全面介绍九---各种html报告插件对比

    一直在使用Nose-html-reporting,并输出html报告,但今天在使用时发出有点问题:于时,将python目前可能的html报告插件下载后进行对比,如下 一.Nose-html-repor ...

  7. 笔记:Maven 项目报告插件

    Maven 项目报告插件,都是对于前面生成的项目站点的内容丰富,因此都是基于项目站点的,生成的命令和生成项目站点一致(mvn site),项目报告插件的配置和一般插件不同,是在 project-> ...

  8. Gradle 1.12用户指南翻译——第四十一章. 项目报告插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  9. Maven 项目报告插件

    Maven 项目报告插件,都是对于前面生成的项目站点的内容丰富,因此都是基于项目站点的,生成的命令和生成项目站点一致(mvn site),项目报告插件的配置和一般插件不同,是在 project-> ...

随机推荐

  1. sdk 简单说明文档草稿。

    SDK初始化: HighApi为SDK核心类,请客户端持有其唯一单例对API进行调用. HighApi构造器函数 HighApi(Context appContext, final String ap ...

  2. Linux Command Line 笔记(1)

    Yunduan CUI graphical user interfaces make easy tasks easy, while command line interfaces make diffi ...

  3. linux文件目录权限详解(20170101)

    linux目录权限与文件权限是不同的,二者要相互配合,这是基础. 比如要读文件:目录至少要有x,文件至少要有r. 要写文件:目录至少要有x,文件至少要有rw. 要执行文件:目录至少要有x,文件至少要有 ...

  4. [NOIP2015] 斗地主(搜索)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  5. openssl 升级

    openssl version -a rpm -q --changelog  openssl | grep CVE bash -version #!/bin/bash if [[ $EUID -ne ...

  6. 股票数据调用示例代码php

    <!--?php // +---------------------------------------------------------------------- // | JuhePHP ...

  7. TensorFlow官方文档中文版

    github地址: https://github.com/jikexueyuanwiki/tensorflow-zh

  8. Java Web 编程

    Java Web 编程 21天学通JAVA-WEB开发:http://files.cnblogs.com/files/maven-chao/Java_Web.zip

  9. 委托、回调 Lambda表达式书写方式

  10. [LeetCode] 14. Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. public class ...