之前的一篇文章中,是把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. .offset().top是什么意思?

    offset获取匹配元素在当前视口的相对偏移: 返回的对象包含两个整形属性:top,left.此方法只对 可见元素有效. $("#div").offset() 获得位移对象:(此时 ...

  2. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  3. Android之ScrollView嵌套ListView和GridView冲突

    由于ListView,GridView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView, 在ScrollView中嵌套使用ListView或者GridView,L ...

  4. ubuntu更新命令点点滴滴

    ubuntu更新命令点点滴滴      一些非root的更新命令:              sudo: sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一 ...

  5. [转]linux,windows 可执行文件(ELF、PE)

    ELF (Executable Linkable Format)UNIX类操作系统中普遍采用的目标文件格式 . 首先要知道它有什么作用:工具接口标准委员会TIS已经将ELF作为运行在Intel32位架 ...

  6. C语言新文法

    程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...

  7. 【HDU1257】最少拦截系统(贪心)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. form表单修改label样式

    <?php $form = ActiveForm::begin([ 'options'=>['enctype'=>'multipart/form-data','class' => ...

  9. selenium环境搭建

    开发环境: 1.jdk 2.eclipse 3.selenium,selenium只需要selenium-java-2.45.jar这个就可以 具体搭建步骤可参考:http://www.cnblogs ...

  10. Beta版本冲刺——day2

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 站立式会议 培侨走的第5天,想他~( ...