使用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>为例,增加监听事件内容. ...
随机推荐
- 9.ORM数据访问
1.Spring对ORM的支持 ORM : 对象关系映射(Object Relational Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术基于ORM的数据持久层框架有: ...
- Windows下使用pip安装Python模块
打开cmd窗口: 找到pip安装路径: 拖动pip.exe到命令行窗口: 空格并输入“install 包名”,回车. ========================================= ...
- java——异常类、异常捕获、finally、异常抛出、自定义异常
编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...
- sass注释中有中文出现报错解决方法
在使用koala编译sass成css过程中出现这样的报错 后来查资料说是自己在sass中的注释中有中文引起的, 解决方案: 进入C:\Ruby25-x64\lib\ruby\gems\2.5.0\ge ...
- C# 通过 Hessian服务调用java
1.下载Hessiancsharp.dll 2.新建一个c#窗体程序,然后在添加一个类库 3.添加一个接口类,接口中的方法名和参数与java中的服务方法名和参数保持一致 public partial ...
- 电感的Q值
电感的Q值又称为品质因数,即在通过一定频率信号时,感抗与等效损耗之比.品质因数越高即系统损耗越小效率越高,一般为50`100,最高500左右,再大就会烧毁.一般Q值与很多因素有关:绕线粗细,长度与直径 ...
- Flume启动错误之:Bootstrap Servers must be specified
今天测试项目的时候需要启动Flume,然而在启动时遇到了Bootstrap Servers must be specified错误,错误日志如下: [kfk@bigdata-pro01 flume-- ...
- CBoard数据分析实战
介绍 CBoard由上海楚果信息技术有限公司主导开源, 它不仅仅是一款自助BI数据分析产品, 还是开放的BI产品开发平台: 用户只需简单妥妥拽拽就能自助完成数据多维分析与报表设计 开发者能够简单扩展连 ...
- 《JavaScript高级程序设计》第5章 Object类型---Array---学习心得
1.创建数组的方法: 使用Array构造函数: var colors=new Array() var colors=new Array(20)//l创建一个包含20项的数组 var colors=ne ...
- mysql操作命令梳理(3)-pager
在mysql日常操作中,妙用pager设置显示方式,可以大大提高工作效率.比如select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到,这时候使用pager可以设置调用os的more或者l ...