java分享第十九天(TestNg的IReporter接口的使用)

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

package com.demo;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
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;
public class NewReport implements IReporter{
    @Override
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
        List<ITestResult> list = new ArrayList<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");
    }
    private ArrayList<ITestResult> listTestResult(IResultMap resultMap){
        Set<ITestResult> results = resultMap.getAllResults();
        return new ArrayList<ITestResult>(results);
    }
 private void sort(List<ITestResult> list){
        Collections.sort(list, new Comparator<ITestResult>() {
            @Override
            public int compare(ITestResult r1, ITestResult r2) {
                if(r1.getStartMillis()>r2.getStartMillis()){
                    return 1;
                }else{
                    return -1;
                }
            }
        });
    }
    private void outputResult(List<ITestResult> list, String path){
        try {
            BufferedWriter output = new BufferedWriter(new FileWriter(new File(path)));
            StringBuffer sb = new StringBuffer();
            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();
        }
    }
    private String getStatus(int status){
        String statusString = null;
        switch (status) {
        case 1:
            statusString = "SUCCESS";
            break;
        case 2:
            statusString = "FAILURE";
            break;
        case 3:
            statusString = "SKIP";
            break;
        default:
            break;
        }
        return statusString;
    }
    private String formatDate(long date){
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       return formatter.format(date);
    }
} 

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

package com.demo;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners({com.demo.NewReport.class})
public class Test15 {
    @DataProvider
    public Object[][] dataProvider(){
        return new Object[][]{{1},{2}};
    }
    @Test(dataProvider="dataProvider")
    public void testAssert1(int a){
        Assert.assertEquals(1, a);
    }
    @Test
    public void testAssert2(){
        Assert.assertEquals("2", "2");
    }
}

运行后,大家打开test-output文件夹,看是不是多了个test.txt的文件夹。

时间: 2024-10-22 20:24:30

java分享第十九天(TestNg的IReporter接口的使用)的相关文章

“全栈2019”Java第八十五章:实现接口中的嵌套接口

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十五章:实现接口中的嵌套接口 下一章 "全栈2019"Java第八十六章:嵌套接口可以多继承吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组

Java基础--第十九天

异常分类: Exception       RuntimeException 非运行时期异常     运行时期异常 自定义异常 IO流: Java中的io流是用来处理不同设备间的输入输出问题的 io流操作的类都在io包中: io流分类: 流向分: 输入流   读取数据 输出流     写入数据 按操作数据不同: 字节流 字符流 File类: 构造方法 常见方法: 创建: createNewFile():当文件不存在时,创建文件 当没有给出指定路径时,以当前项目路径为文件创建路径. 相对路径和绝对

大数据Java基础第十九天作业

第一题:简单的URL获取资源下载 import java.net.URL; import java.net.URLConnection; import java.io.InputStream; import java.io.FileOutputStream; class DownloadDemo{     public static void main(String[] args){         String src_url = "http://one.jiangmin.com/jiangm

java基础第十九天_QQ、多线程下载

1.QQ 2.屏广软件,大数据包处理,frame缓冲区最多保持两帧画面,1s内没有集齐所有frameunit,则丢弃. 3.从互联网多线程下载 地址 : http://apache.opencas.org/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz RandomAccessFile Thread (>= 3) HttpURLConnection.setRequestProperty("Range", "bytes=209

Java基础第二十九天总结——Java8新特性

目录: 一.Lambda表达式 二.函数式(Functional)接口 三.方法引用于构造器引用 四.强大的Stream API 五.Optional类 /*--------------------------分割线---------------------------*/ 一.Lambda表达式 速度更快 代码更少(增加了新的语法:Lambda 表达式) 强大的 Stream API 便于并行 最大化减少空指针异常:Optional Nashorn引擎,允许在JVM上运行JS应用 Lamdba

疯狂Java讲义(十四)---- 抽象类和接口

抽象类 抽象方法和抽象类必须使用abstract修饰符定义,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法.抽象类不能被实例化. 接口 接口只是一种规范,定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里的实现细节,它只规定这些类必须提供某些方法.接口体现的是规范和实现分离的设计哲学. 接口语法: 修饰符可以是public或省略,如果省略修饰符,默认采用包权限访问控制符.所以一般都是public.因为接口是多个类共同的公共行为规范,因此接口里的所有成员都

JAVA基础(十二)抽象类与接口

抽象类 总结:                 类支持单继承.接口支持多继承                 类与类单继承,                 类实现接口,接口继承接口,先继承后实现 自己理解  抽象类:描述笼统的,模糊,不具体的具有共性的类  抽象类格式 Public abstract class 类名{ 成员变量 //方法 public abstract 返回值类型 方法名 (参数); Public abstract void get ();//抽象函数.需要abstract修

第二十九天 月出惊山鸟 —Spring的AOP_AspectJ @annotation

6月14日,阴转雨."四面垂杨十里荷,向云何处最花多, 画楼南畔夕阳和.天气乍凉人寂寞, 光阴须得酒消磨,且来花里听笙歌." 面向切面的框架AspectJ邂逅Spring,不仅造就一种简洁,更带来更多的选择空间. 上篇的切面与代理配置方式,麻烦且繁琐.好在Spring 与 AspectJ 进行了集成,从接口和配置的泥潭爬出,善莫大焉. 下面把上一篇Spring的AOP 的例子改写一下,达到同样的效果. 1-3步骤不变. 4.定义一个 Aspect 切面类BallHandler.java

javaSE第十九天

第十九天????227 1:异常(理解)????227 (1) 定义????227 a)异常的引入????227 (2)异常的体系????228 (3)异常的处理:????229 A:JVM的默认处理????229 B:自己处理????229 (4)异常知识点代码详解????229 a) 异常处理的方式????229 b) 多个异常的处理????230 c) JDK7异常处理的新方式????233 d) 编译时期异常和运行时期异常的区别????234 e) 异常中的方法详解????235 f)