面向百度编程之-测试报告

官方网站在这里:http://extentreports.relevantcodes.com/
当年github上开源,如今pro版本居然收钱了
先说总结:

1. 生成的报告简洁美观,

2.生成的单html方便jenkins集成发邮件

3.自带集中展示历史报告的服务端

4.支持java,

5.可定制报告

6.数据入库

官网提供V2.x版本和V3.x版本,只支持java8。注意

客户端地址:https://github.com/anshooarora/extentreports-java/commits/master

服务端地址:https://github.com/anshooarora/extentx

安装过程,官方文档上比较消息。

官方说明在这里:http://extentreports.com/docs/versions/3/java/, 提供了3种和testng集成示例:

1.直接在@BeforeSuite@BeforeClass进行初始化

2.自己实现testng的ITestListener接口,监听的适合你已经有测试狂简了,不想动原来的case

3.自己实现testng的IReporter接口,更加直观

以上随便选择一种都可以,实现ITestListener接口。内容类似下面:

public class ExtentTestNGITestListener implements ITestListener {

    private static ExtentReports extent = ExtentManager.getInstance("test-output/extent.html");
    private static ThreadLocal test = new ThreadLocal();
    public static MacacaClient driver;

    @Override
    public synchronized void onStart(ITestContext context) {
    }

    @Override
    public synchronized void onFinish(ITestContext context) {
        extent.flush();
    }

    @Override
    public synchronized void onTestStart(ITestResult result) {
        test.set(extent.createTest(result.getMethod().getMethodName()));
    }

    @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());
        File directory = new File("test-output");
        try {
            String screenPath = directory.getCanonicalPath() + "/";
            File file = new File(screenPath);
            if (!file.exists()){
                file.mkdirs();
            }
            String fileName = result.getMethod().getMethodName() + ".png";
            driver.saveScreenshot(screenPath + fileName);
            ((ExtentTest)test.get()).addScreenCaptureFromPath(screenPath + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public synchronized void onTestSkipped(ITestResult result) {
        ((ExtentTest)test.get()).skip(result.getThrowable());
    }

    @Override
    public synchronized void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }
}

onTestFailure函数里面实现了出错自动截图,调用的是ExtentTest的addScreenCaptureFromPath方法。

ExtentManager用来做初始化:

public class ExtentManager {
    private static ExtentReports extent;

    public static ExtentReports getInstance(String filePath) {
        if (extent == null)
            createInstance(filePath);
        return extent;
    }

    public static void createInstance(String filePath) {
        extent = new ExtentReports();
        extent.setSystemInfo("os", "Linux");
        extent.attachReporter(createHtmlReporter(filePath), createExtentXReporter());
    }

    public static ExtentHtmlReporter createHtmlReporter(String filePath){
        ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(filePath);
        //报表位置
        htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
        //使报表上的图表可见
        htmlReporter.config().setChartVisibilityOnOpen(true);
        htmlReporter.config().setTheme(Theme.STANDARD);
        htmlReporter.config().setDocumentTitle(filePath);
        htmlReporter.config().setEncoding("utf-8");
        htmlReporter.config().setReportName("XXX项目测试报告");
        return htmlReporter;
    }

    public static ExtentXReporter createExtentXReporter() {
        ExtentXReporter extentx = new ExtentXReporter("127.0.0.1",27017);
        extentx.config().setProjectName("test1");
        extentx.config().setReportName("Build-1224");
        extentx.config().setServerUrl("http://localhost:1337");
        return extentx;
    }

ExtentXReporter构造函数里填的是mongodb的地址和端口。

在res/testng.xml里面注册这个监听器,测试类也写上:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <listeners>
        <listener class-name="com.util.extent.ExtentTestNGITestListener"></listener>
    </listeners>
    <test name="Test">
        <classes>
            <class name="macaca.client.ExtentTestNGReportBuilder"></class>
        </classes>
    </test>
</suite>

测试类调用,随便写2个case演示:macaca是阿里的自动化框架,也不错的,可以直接删除也行,内容罢了

public class ExtentTestNGReportBuilder {
    MacacaClient driver = new MacacaClient();

    @BeforeClass
    public synchronized void beforeClass() throws Exception {
        JSONObject porps = new JSONObject();
        porps.put("platformName", "android");
        porps.put("reuse", 1);
        porps.put("app", "https://npmcdn.com/android-app-bootstrap@latest/android_app_bootstrap/build/outputs/apk/android_app_bootstrap-debug.apk");
        JSONObject desiredCapabilities = new JSONObject();
        desiredCapabilities.put("desiredCapabilities", porps);
        driver.initDriver(desiredCapabilities);
        ExtentTestNGITestListener.driver = driver;
    }

    @AfterClass
    public synchronized void afterClass() throws Exception{
        driver.quit();
    }

    @Test
    public void test_1() throws Exception{
        assert 1==0;
    }

    @Test
    public void test_2() {
        assert 1 == 1;
    }

}

运行命令

mvn clean test

开始测试

生成的本地报告在test-output下面,内容类似下面:

最下面可以看到失败的截图:


只查看失败的case:
image

Dashboard页面:
image

看看服务端的报告(运行了多次):

汇总页面:

这里的PROJECT和BUILD是ExtentManager类里面

extentx.config().setProjectName("test1");
extentx.config().setReportName("Build-1224");

这里设定的,这里实际使用时可以用jenkins集成时直接由jenkins传进来

具体某一次的报告:

如果觉得这种报告太笨重了,可以看下这种
https://www.jianshu.com/p/ce09d3bd1c37
轻量级别的

ps:所有酷炫的测试报告,都不适合发邮件,因为内容太多了
适合发邮件的模板去掉各种渲染

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 想来,你毕业也有三个多月了,当初写下的这段文字,再翻出来,心里还是酸酸的,总会想起你,不知道你的日子过得好不好。 ...
    洛简紫阅读 532评论 0 2
  • 为了遇见你 我翻过山越过岭 见过大江穿过人海 就为了和你邂逅 你是否也在城市的另一端 和我一样走过街道 看过华灯 ...
    李嫑笑阅读 239评论 0 1