使用extentreports美化testng报告2,增加监听
有兴趣研究了extentreports报告美化插件,但是因为发现插件有很多内容不能自定义,所以放弃了这个插件,我扩充了官方代码的demo,在testng中增加了监听,并打印了一些测试用例,现在我把两个demo都展示下
如果不想增加监听,可以查看我第一篇文章http://www.cnblogs.com/chongyou/articles/7518959.html,3.0的改变有些大,maven配置
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>3.0.7</version>
</dependency>
1.运行用例后的demo
显示内容截图
代码块,有两个主要的方法,1,监听testng中的reporter,2.实现testng中的ITestListener接口,如下图,在有一个类mytest2就是运行
ExtentTestNGIReporterListener.java
package report; 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.Reporter;
import com.aventstack.extentreports.Status;
import org.testng.xml.XmlSuite; import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme; public class ExtentTestNGIReporterListener implements IReporter { private static final String OUTPUT_FOLDER = "test-output/";
private static final String FILE_NAME = "Extent.html"; private ExtentReports extent; @Override
public void generateReport(List xmlSuites, List suites, String outputDirectory) {
init();
for (Object suite : suites) {
Map result = ((ISuite) suite).getResults();
for (Object r : result.values()) {
ITestContext context = ((ISuiteResult) r).getTestContext();
buildTestNodes(context.getFailedTests(), Status.FAIL);
buildTestNodes(context.getSkippedTests(), Status.SKIP);
buildTestNodes(context.getPassedTests(), Status.PASS); }
} for (String s : Reporter.getOutput()) {
extent.setTestRunnerOutput(s);
} extent.flush();
} private void init() {
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); extent = new ExtentReports();
extent.attachReporter(htmlReporter);
extent.setReportUsesManualConfiguration(true);
} private void buildTestNodes(IResultMap tests, Status status) {
ExtentTest test; if (tests.size() > 0) {
for (ITestResult result : tests.getAllResults()) {
test = extent.createTest(result.getMethod().getMethodName()); for (String group : result.getMethod().getGroups())
test.assignCategory(group); 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();
} }
ExtentTestNGITestListener.java
package report; import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult; import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme; public class ExtentTestNGITestListener implements ITestListener { private static ExtentReports extent = ExtentManager.createInstance("extent.html");
private static ThreadLocal parentTest = new ThreadLocal();
private static ThreadLocal test = new ThreadLocal(); @Override
public synchronized void onStart(ITestContext context) {
ExtentTest parent = extent.createTest(getClass().getName());
parentTest.set(parent);
} @Override
public synchronized void onFinish(ITestContext context) {
extent.flush();
} @Override
public synchronized void onTestStart(ITestResult result) {
ExtentTest child = ((ExtentTest) parentTest.get()).createNode(result.getMethod().getMethodName());
test.set(child);
} @Override
public synchronized void onTestSuccess(ITestResult result) {
((ExtentTest) test.get()).pass("Test passed"); } @Override
public synchronized void onTestFailure(ITestResult result) {
((ExtentTest) test.get()).fail(result.getThrowable());
} @Override
public synchronized void onTestSkipped(ITestResult result) {
((ExtentTest) test.get()).skip(result.getThrowable());
} @Override
public synchronized void onTestFailedButWithinSuccessPercentage(ITestResult result) { }
} class ExtentManager{ private static ExtentReports extent; public static ExtentReports getInstance() {
if (extent == null)
createInstance("test-output/extent.html"); return extent;
} public static ExtentReports createInstance(String fileName) {
ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(fileName);
htmlReporter.config().setTestViewChartLocation(ChartLocation.BOTTOM);
htmlReporter.config().setChartVisibilityOnOpen(true);
htmlReporter.config().setTheme(Theme.STANDARD);
htmlReporter.config().setDocumentTitle(fileName);
htmlReporter.config().setEncoding("utf-8");
htmlReporter.config().setReportName(fileName); extent = new ExtentReports();
extent.attachReporter(htmlReporter); // while creating test
extent
.createTest("zhangjun")
.assignAuthor("admin")
.pass("details"); return extent;
}
}
mytest2.java
package report; import org.testng.Assert;
import org.testng.annotations.Test; import until.logTest; public class mytest2{
@Test
public void choose_product(){
logTest.logInfo("成功的结果");
Assert.assertTrue(true);
}
@Test
public void choose_product2(){
logTest.logInfo("成功的结果");
Assert.assertTrue(true);
}
@Test
public void choose_product3(){
logTest.logInfo("失败的结果");
Assert.assertTrue(false);
}
}
xml文件配置
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="rosewholePC" >
<listeners>
<listener class-name="report.ExtentTestNGIReporterListener" /> </listeners>
<test name="version" preserve-order="true"> <classes>
<class name="report.mytest2">
<methods>
<include name="choose_product"/>
<include name="choose_product2"/>
<include name="choose_product3"/>
</methods>
</class>
</classes> </test>
</suite>
2.报告中增加测试用例
我开始增加从我的excel中去读取测试方法,并在报告中展示,如图,就是因为测试用例字体也太小了,觉得不合适,所以也就放弃了
修改了就修改了1个地方,在ExtentTestNGIReporterListener类的方法buildTestNodes中增加读取测试用例,获取excel的测试用例的描述,
注publicmethod的readstestcase的方法在文章selenium项目读取测试用例有写到
readTestCase的方法,主要是从我项目中读取testcase
public static Map<String, List> readTestCase( String xlsFileName,String className) { Map<String, List> map = new HashMap<String, List>(); List<String[]> list = new ArrayList<String[]>(); Workbook rwb = null;
Cell cell = null; InputStream stream;
try {
stream = new FileInputStream(System.getProperty("user.dir") + "\\testCase\\" + xlsFileName + ".xls");
rwb = Workbook.getWorkbook(stream);
} catch (FileNotFoundException e) {
logTest.logError("读取excel出现异常,请检测名称是否对应正确或其他异常!!!");
e.printStackTrace();
} catch (BiffException e) {
logTest.logError("读取excel出现异常,请检测名称是否对应正确或其他异常!!!");
e.printStackTrace();
} catch (IOException e) {
logTest.logError("读取excel出现异常,请检测名称是否对应正确或其他异常!!!");
e.printStackTrace();
} Sheet sheet = rwb.getSheet(className);
int rows = sheet.getRows();//获取的行
int coumn = sheet.getColumns();//获取的列 String[] strkey = new String[rows - 1];// 存取testCase的值 for (int i = 1; i < rows; i++) {
String[] strValue = new String[coumn - 1];// 存取每一行的数据
strkey[i - 1] = sheet.getCell(0, i).getContents();
for (int j = 1; j < coumn; j++) {
strValue[j - 1] = sheet.getCell(j, i).getContents();
}
list.add(strValue);
} // 把行的数据加入map中
for (int i = 0; i < strkey.length; i++) {
map.put(strkey[i], Arrays.asList(list.get(i)));
} return map;
}
用例模板为:
使用extentreports美化testng报告2,增加监听的更多相关文章
- Android增加监听的三种实现方式
在Android中,为一个按钮增加监听的方式有五种 1.匿名内部类 @Override protected void onCreate(Bundle savedInstanceState) { sup ...
- listener.ora增加监听端口
一个简单的listener.ora # listener.ora Network Configuration File: d:\app\zyd\product\11.2.0\dbhome_1\netw ...
- testng报告-extentsReports使用-klov
extentreport部分参考: https://blog.csdn.net/Care_sQueendom/article/details/78651950 https://testerhome.c ...
- android脚步---UI界面修改,增加按钮和监听
我的UU界面,其布局如下: 需要修改的部分: 意见反馈居中,还有增加backbutton 首先在mainactivity中找到我的UU的定义:dialogue public void showAbou ...
- app进入后台之后接收到通知,点进去进入新的页面,再次进入后台,再点击通知进入页面(,两次通过通知进入的页面,创建了两次,会多一个页面,)解决办法监听
在点击通知进入的页面的 //UIApplicationWillResignActiveNotification是app即将进入后台的方法 //增加监听使它在进入后台之前pop上一个页面 - (void ...
- oracle监听服务开启
输入命令netca即可开启oracle的监听服务 弹出对话框 选择监听服务配置,单击下一步 选择增加监听,单击下一步 监听的名字,默认即可,下一步 监听链接的协议,默认TCP协议即可,下一步 监听默认 ...
- Java-HttpSession监听
//HttpSession监听 public interface HttpSessionActivationListener extends EventListener { /** Notificat ...
- swoole多端口监听
今天测试swoole写webserver实现多端口监听.记录下爬过的坑:关于tcp协议监听触发不到receive!!!!! 首先上服务端代码 class Http { /** * 服务实例 * @va ...
- 表格模型的监听 TableModelListener
当表格内容发生改变,监听做了哪些操作,需要表格模型的监听 TableModelListener来实现. 以上一个随笔内容<高级组件——表格模型TableModel>为例,增加监听事件内容. ...
随机推荐
- Nginx静态服务,域名解析
安装这里就不写了在LNMP里有具体的安装 1.1 常用来提供静态Web服务的软件有如下三种: Apache:这是中小型Web服务的主流,Web服务器中的老大哥. Nginx:大型网 ...
- equals和== 区别
转载:https://zhidao.baidu.com/question/61622858.html ==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值. (比较地址值即是指是否 ...
- 研磨设计模式学习笔记4--单例模式Signleton
需求:加载配置文件,由于配置文件全局唯一,所以不用过多对象,建一个就可以了. 优点:单例模式本质就是为了控制实例数目. 一.饿汉式 public class Singleton { private S ...
- grunt 安装使用(一)
grunt 依赖nodejs,所有在使用前确保你安装了nodejs,然后开始执行grunt命令. .安装node nodejs安装教程 安装完成后在命令行,执行命令: node -v 出现版本信息, ...
- Linux IPC 共享内存
共享内存 共享内存(shared memory)是最简单的Linux进程间通信方式之一. 使用共享内存,不同进程可以对同一块内存进行读写. 由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不 ...
- Hibernate通过自编写Sql修改
@Override public void updateTemMsg(String ticket,String time) { String sql="UPDATE INTER_TEMPTO ...
- CSAPP阅读笔记-链接-第七章-P464-P500
链接概述 经预处理器->编译器->汇编器处理后,源文件可被转化为一组可重定位目标文件,链接器将它们组合起来形成可执行文件. 每个可重定位目标文件由不同的“代码节”和“数据节”组成,每一个节 ...
- vue中遇到的坑
如何解决在vue中替换图片.一个使用base64,而我们使用zepto之后,src找不到资源,因为已经打包了,难道强行写base64. 1. 引入文件时语法很重要! import "Foot ...
- jemeter接口测试基础
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...
- SpringMVC restful风格
1.Spring对REST的支持 Spring3(这里讨论Spring3.2+)对Spring MVC的一些增强功能为REST提供了良好的支持.Spring对开发REST资源提供以下支持: 操作方式: ...