使用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>为例,增加监听事件内容. ...
随机推荐
- How to Setup MySQL (Master-Slave) Replication in CentOS
The following tutorial aims to provide you a simple step-by-step guide for setting up MySQL (Master- ...
- day 012 生成器 与 列表推导式
生成器的本质就是迭代器,写法和迭代器不一样,用法一样. 获取方法: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 例如: 更改return 为 yield 即 ...
- tail -f 实时跟踪一个日志文件的输出内容
tail -f 实时跟踪一个日志文件的输出内容 http://hittyt.iteye.com/blog/1927026 https://blog.csdn.net/mengxianhua/arti ...
- Android NDK开发 Jni中打日志LOG(二)
HelloJni.c文件中,加入头文件和函数声明.最终文件如下: #include <jni.h> #include <string.h> #include<androi ...
- C++的友元函数
友元函数不是成员函数,是类外函数所以声明放在类的私有段或公有段且没有区别.但是它可以访问类中的私有成员.友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私 ...
- 树形dp学习
学习博客:https://www.cnblogs.com/qq936584671/p/10274268.html 树的性质:n个点,n-1条边,任意两个点之间只存在一条路径,可以人为设置根节点,对于任 ...
- Kure讲HTML_div标签和table标签
为什么要把这两个标签放在一起讲? 个人认为div标签可以算是一个万能标签,它可以通过CSS(层叠样式表)来模仿表格的形式来生成一个表格.那么很多人可能会疑惑那在开发的时候,到底是用div+css的形式 ...
- ZK使用
1. 关注问题 1. zookeeper集群如何保证请求的均匀分布? 由client建立连接时会随机取server保证均匀分布, 2.已布置完成的ZK集群如何扩容? 修改配置后逐台重启即可 2. ZK ...
- CentOS7安装Nginx实现API网关
参考 http://nginx.org/ http://nginx.org/en/linux_packages.html#stable https://www.npmjs.com/package/js ...
- C# 使用消息队列,包括远程访问
转:https://www.cnblogs.com/80X86/p/5557801.html 功能需求,用到了队列,用的时候出了很多问题,现在总结一下,希望能对有需要的人提供帮助. 我的需求很简单,就 ...