IReporter 的用法,转载,https://www.cnblogs.com/zhangfei/p/4514697.html

IReporter接口是干嘛的?就是让用户自定义报告的,很多人想要自定义报告,于是乎找各种插件,比如什么testng-xslt啊,reportng啊,各种配置,最后出来的结果,还不能定制化,但为什么不能自已定制一份呢?testng的IReporter接口就接供了这样的功能,我们只需要实现这个接口,并加上监听,就能拿到所有的信息了,你可以把这些信息存数据库,或者自已生成一个html,亦或者写在EXCEL里啊等等,都可以,下面给出IReporter接口的实现方式:
packagecom.demo;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileWriter;

importjava.io.IOException;

importjava.text.SimpleDateFormat;

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.Comparator;

importjava.util.List;

importjava.util.Map;

importjava.util.Set;

importorg.testng.IReporter;

importorg.testng.IResultMap;

importorg.testng.ISuite;

importorg.testng.ISuiteResult;

importorg.testng.ITestContext;

importorg.testng.ITestResult;

importorg.testng.xml.XmlSuite;

publicclassNewReportimplementsIReporter{

@Override

publicvoidgenerateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {

List<ITestResult> list =newArrayList<ITestResult>();

for(ISuite suite : suites) {

Map<String, ISuiteResult> suiteResults = suite.getResults();

for(ISuiteResult suiteResult : suiteResults.values()) {

ITestContext testContext = suiteResult.getTestContext();

IResultMap passedTests = testContext.getPassedTests();

IResultMap failedTests = testContext.getFailedTests();

IResultMap skippedTests = testContext.getSkippedTests();

IResultMap failedConfig = testContext.getFailedConfigurations();

list.addAll(this.listTestResult(passedTests));

list.addAll(this.listTestResult(failedTests));

list.addAll(this.listTestResult(skippedTests));

list.addAll(this.listTestResult(failedConfig));

}

}

this.sort(list);

this.outputResult(list, outputDirectory+"/test.txt");

}

privateArrayList<ITestResult> listTestResult(IResultMap resultMap){

Set<ITestResult> results = resultMap.getAllResults();

returnnewArrayList<ITestResult>(results);

}

privatevoidsort(List<ITestResult> list){

Collections.sort(list,newComparator<ITestResult>() {

@Override

publicintcompare(ITestResult r1, ITestResult r2) {

if(r1.getStartMillis()>r2.getStartMillis()){

return1;

}else{

return-1;

}

}

});

}

privatevoidoutputResult(List<ITestResult> list, String path){

try{

BufferedWriter output =newBufferedWriter(newFileWriter(newFile(path)));

StringBuffer sb =newStringBuffer();

for(ITestResult result : list) {

if(sb.length()!=0){

sb.append("\r\n");

}

sb.append(result.getTestClass().getRealClass().getName())

.append(" ")

.append(result.getMethod().getMethodName())

.append(" ")

.append(this.formatDate(result.getStartMillis()))

.append(" ")

.append(result.getEndMillis()-result.getStartMillis())

.append("毫秒 ")

.append(this.getStatus(result.getStatus()));

}

output.write(sb.toString());

output.flush();

output.close();

}catch(IOException e) {

e.printStackTrace();

}

}

privateString getStatus(intstatus){

String statusString =null;

switch(status) {

case1:

statusString ="SUCCESS";

break;

case2:

statusString ="FAILURE";

break;

case3:

statusString ="SKIP";

break;

default:

break;

}

returnstatusString;

}

privateString formatDate(longdate){

SimpleDateFormat formatter =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");

returnformatter.format(date);

}

}

代码简单易懂,下面给一个测试类:

packagecom.demo;

importorg.testng.Assert;

importorg.testng.annotations.DataProvider;

importorg.testng.annotations.Listeners;

importorg.testng.annotations.Test;

@Listeners({com.demo.NewReport.class})

publicclassTest15 {

@DataProvider

publicObject[][] dataProvider(){

returnnewObject[][]{{1},{2}};

}

@Test(dataProvider="dataProvider")

publicvoidtestAssert1(inta){

Assert.assertEquals(1, a);

}

@Test

publicvoidtestAssert2(){

Assert.assertEquals("2","2");

}

不过这个有有一个改进的地方,如果目录不存在,生成的report 就不OK了

转载

}