Python自定义HtmlTestRunner测试报告

简述

使用selenium webdriver + Python做自动化测试,执行完成后要生成测试报告,Python我们使用的HTMLtestrunner 进行生成,但是默认提供的生成报告内容,并不能满足我们的需求,怎么才能让测试报告数据更清晰,内容更丰富呢。对于一些人来说,可能已经重写了报告生成方式,放弃使用HTMLtestrunner。但是对于python小白可能还做不到,只能用现有东西进行展示,那么下面简单介绍通过修改HTMLtestrunner去实现想要的内容。

先通过两张图片对比一下我们将要实现的功能:

图表 1

图表 2

如图所示,图表1是原始样式输出,图表2是修改后样式输出。通过对比我们可以看到,图表2比图表1多了首位部的两列。我在第一行加caseid,用来记录用例的编号,最后一列,添加了每一个用例执行过程中关键步骤的截图快照。

这样做的好处:

  1. 有了用例编号我们可以通过用例ID进行对用例的定位,尤其是对失败用例的定位。
  2. 有了用例执行过程中关键位置截图快照,对于失败或者出错异常的用例,在无人值守情况下进行执行用例时,可以进行界面追踪。

实现

下面来介绍怎么实现的,首先先说一下我实现的思路。对于这个我们的测试报告而言,我只想调整一下他的展示样式,丰富两列内容。所以先去想怎么去把他的样式给修改了。然后再往修改后的样式表格里面添加数据。

也就是分两步做:

1改样式

2加数据

改样式

改样式,这里只需要会基础的HTML <table>中行、列标识就可以了。

我们要在界面中加两列,那么很简单,就是加两个<td></td>就可以了。

看源码部分:

从395行左右开始就是存储HTML代码展示的部分,找到table标签和第一行列头展示内容。

脚本片段1:

REPORT_TMPL = “”” …… “”” 代码段里面包含了<table>的结构内容

如:

<table id="result_table">
   <colgroup>
    <col align="left" />
    <col align="right" />
    <col align="right" />
    <col align="right" />
    <col align="right" />
    <col align="right" />
   </colgroup>
    <tr id="header_row"> 
     <td colspan="2">Test Group/Test case</td> 
     <td>Count</td> 
     <td>Pass</td> 
     <td>Fail</td> 
     <td>Error</td>
     <td>View</td>
     <td>Screenshot</td>
    </tr>%(test_list)s    <tr id="total_row"> 
     <td colspan="2">Total</td> 
     <td>%(count)s</td> 
     <td>%(Pass)s</td> 
     <td>%(fail)s</td> 
     <td>%(error)s</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td>
    </tr>
  </table>

table标签中的第一个<tr>就是第一行,<tr>中的每一个<td></td>代表一列。标签中间的文本是直接显示在界面的。

<tr id='header_row'>
    //这里添加colspan='2' 是合并2个列。
    //因为下面的行中的caseid需要占一列,
    //但是标题列头部分显示是一个整体,所以做了合并 
    <td colspan='2'>Test Group/Test case</td>           
    <td>Count</td>
    <td>Pass</td>
    <td>Fail</td>
    <td>Error</td>
    <td>View</td>
    <td>Screenshot</td>    //图片快照的列头标题
</tr>

脚本片段2:

REPORT_CLASS_TMPL = “”” … “””代码段 是 展示calss的行,可以叫做测试模块的类,它是单独放在一行中的,每个模块一行。因为要跟上面的第一行标题中的列数对应,所以修改如下:

<tr class='%(style)s'>
    //添加的caseid 的标题,这一行不在主列头,
    //而是放在测试模块用例统计所在的行里面。    <td>case_id</td>        
    <td>%(desc)s</td>
    <td>%(count)s</td>
    <td>%(Pass)s</td>
    <td>%(fail)s</td>
    <td>%(error)s</td>
    <td><a href="javascript:showClassDetail('%(cid)s',%(count)s)">Detail</a></td>
    <td>&nbsp;</td>  //保持列数统一,加入空白列
</tr> 

脚本片段3:

REPORT_TEST_WITH_OUTPUT_TMPL = “”” … “”” 是测试用例展示部分代码,这段内容是展开测试模块后进行显示的

REPORT_TEST_WITH_OUTPUT_TMPL = r"""<tr id='%(tid)s' class='%(Class)s'>
    // %(caseid)s 是python转译html代码中变量替换方式。// caseid 会在python脚本中定义。    <td  align='center'>%(caseid)s</td>        <td class='%(style)s'>
        <div class='testcase'>%(desc)s</div>
    </td>
    <td colspan='5' align='center'>
    <!--css div popup start-->
        <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_%(tid)s')" >
            %(status)s        </a>
        <div id='div_%(tid)s' class="popup_window">
            <div style='text-align: right; color:red;cursor:pointer'>
                <a onfocus='this.blur();' onclick="document.getElementById('div_%(tid)s').style.display = 'none' " >
                [x]</a>
            </div>
            <pre>%(script)s</pre>
        </div>
    <!--css div popup end-->
    </td>
    <td align='center'>
        <a href="%(image)s" title="%(image)s">  
        //这一列内容加入图片快照的链接访问路径 %(image)s 中替换链接地址    
            <img src="..\data\img.png" height=20 width=20 border=0 /></a>  
            //链接图标    
    </td></tr>

单从HTML界面样式展示来看,上面所有代码段中修改都是在每个<tr>加入两个<td></td>。

这样我们的样式就改完了。然后开始加入数据。

加数据

先想一下我们要加什么数据.从样式中看我们增加了两个列,那么有两列的数据是需要增加的,具体加什么呢?想一下?我们在改样式的时候加的两个列中使用到了变量,那么变量取值是需要实现的。那么首先定义变量。

定义报告输出两个变量的取值,放在 REPORT_TEST_OUTPUT_TMPL定义的下面:

脚本片段4:

REPORT_TEST_OUTPUT_TMPL = r"""%(id)s: %(output)s"""
<!--添加内容-->REPORT_TEST_OUTPUT_IMAGE = r"""%(screenshot)s"""REPORT_TEST_OUTPUT_CASEID = r"""%(case_id)s"""

然后找到 _generate_report_test 函数,在这个函数中定义我们要替换html变量,并实现变量的取值。

脚本片段5:

<!—在原有的script下面分别添加caseid和image变量并赋值,此处不用在意为什么怎么实现的,这么用就对了,script内容展示的其实就是我们case执行时 控制台输出的内容 所以如果你想获取自己在case中print出来的数据就这么做-->

script = self.REPORT_TEST_OUTPUT_TMPL % dict(
    id = tid,
    output = saxutils.escape(uo+ue),
        )

    image = self.REPORT_TEST_OUTPUT_IMAGE % dict(
        screenshot = saxutils.escape(uo+ue))

    caseid = self.REPORT_TEST_OUTPUT_CASEID % dict(
        case_id = saxutils.escape(uo+ue)
        )                   

    <!—html中替换的字符串变量进行详细取值-->

    row = tmpl % dict(
        tid = tid,
        Class = (n == 0 and 'hiddenRow' or 'none'),
        style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'none'),
        desc = desc,
        script = script,                            
     
    <!—因为获取内容都是字符串,所以只需要进行字符串截取就可以了-->
        image = image[image.find("image"):(int(image.find("png"))+3)],
        caseid = caseid[caseid.find("case"):(int(caseid.find("case"))+9)],
        status = self.STATUS[n],)

上面 image 、caseid 字符串截取位置跟我在控制台输出的内容有关系,所以不是通用的,需要自行修改。字符串截取的方式就不讲了,方式很多种找自己合适的熟悉的就行。

至此修改HTMLtestrunner生成报告模板就修改结束,我的这个方式或许不是你想要的,不是你想展示的,希望能在思路上帮你去解决你的问题。

另:有朋友问能不能内容显示成中文的,看明白了上面内容我想中文的显示就不是什么问题了。直接改HTML标签中显示的英文内容翻译为中文就可以了。

作者: Ray 博客地址:http://www.cnblogs.com/tsbc/ 声明:本文已获作者授权转载,著作权归作者所有。

原文发布于微信公众号 - 开源优测(DeepTest)

原文发表时间:2018-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

前端知识点总结——Vue

作用:将表达式执行的结果 输出当调用元素的 innerHTML 中;还可以将数据绑定到视图。

1312
来自专栏python学习之旅

python appium笔记(二):元素定位

#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境

2441
来自专栏技术小讲堂

ASP.NET AJAX(3)__UpdatePanel

今天也不知道写不写的完了,最近闲下来了,却感冒了,早上起来都不会说话了,不过幸亏咱不是靠嘴皮子过活了,哎~~~~窃喜吧 上一篇简单写到UpdatePanel的一...

3625
来自专栏彭湖湾的编程世界

【javascript】原生js更改css样式的两种方式

下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1;css表达式...

2428
来自专栏崔庆才的专栏

腾讯云上Selenium用法示例

在上一节我们学习了 PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运行的是 JavaScript 脚本,然而这就能写爬虫了吗?这又和Py...

8130
来自专栏Aloys的开发之路

Xshell利用登录脚本从服务器登录到另外一个服务器

欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinn...

2063
来自专栏源哥的专栏

如何在js文件中写加载Applet控件(js与jsp分离技术)

                        如何在js文件中写加载Applet控件(js与jsp分离技术)

1044
来自专栏北京马哥教育

Linux cat命令

豌豆贴心提醒,本文阅读时间3分钟,文末有秘密! ? 文 | 豌豆 图 | 来源网络 ? Linux cat命令 命令:cat cat 命令用...

4024
来自专栏码生

ReactNative 面试题

今天有一个 ReactNative 的面试。 时间紧迫,临时写了几个问题,初级面试问题。 都是关键字

8883
来自专栏JAVA高级架构开发

使用 CodeMirror 打造属于自己的在线代码编辑器

写这个的目的是因为之前项目里用到过 CodeMirror,觉得作为一款在线代码编辑器还是不错,也看到过有些网站用到过在线代码编辑,当然我不知道他们是用什么做的,...

4070

扫码关注云+社区

领取腾讯云代金券