python3修改HTMLTestRunner,生成有截图的测试报告,并发送测试邮件(二)

3. 如何将第一步得到的地址和名称 输入 进第二步里的表格中呢。。。

用上述查找元素的方法,发现HTMLTestRunner.py中REPORT_TEST_WITH_OUTPUT_TMPL是用来输出测试结果的。我们只需要将截图url和名称写进去即可。

假定我们目前已经可以定位到每个用例的具体截图,并将截图url定义为变量html,名称定义成变量name,修改HTMLTestRunner.py的代码如下:

  REPORT_TEST_WITH_OUTPUT_TMPL = r"""
<tr id=‘%(tid)s‘ class=‘%(Class)s‘>
    <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>
    <td><a href="%(html)s" target="_blank">%(name)s</a></td>      <!--此处修改-->
    <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>

</tr>
""" # variables: (tid, Class, style, desc, status)

找到变量定义的函数:_generate_report_test,修改如下:

 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,
            html = html,        #此处修改
            name = name,     #此处修改
            status = self.STATUS[n],
        )
        rows.append(row)
        if not has_output:
            return

定义变量、以url格式输出变量已经搞定。接下来是给变量赋值~~

思路:依照大神们些的博客,看出函数_generate_report_test中的ue和uo代表unittest中打印日志和抛出异常日志。想到如果我把截图的url和name打印到日志中,就能够从ue和uo中很容易的提取到url和name。
开始对unittest进行改造~~

思路:我想对每条用例都输出截图,不论fail或者pass。如果用例执行正确,则只打印日志。如果用例执行错误,则打印日志并抛出异常日志。

unittest是python3自带的库,我们需要找到unittest文件夹,对case.py修改。路径:XXX(自己的python安装路径)\Python\Python36\Lib\unittest
case.py的TestCase类中增加两个方法

def screenshot():
def add(func):
具体如下:

class TestCase(object):
    def screenshot():    #(一)中讲过定义截图的方法
        imageName = str(time.time()) + ‘.png ‘
        imagepath = ‘//sdcard//‘ + imageName
        path = os.getcwd() + ‘\\screenshot‘
        if not os.path.exists(path):
            os.mkdir( path)
        os.system("adb shell //system//bin//screencap -p " + imagepath)
        os.system(‘adb pull ‘ + imagepath + path)
        print(‘lustrat‘ + path + ‘\\‘ + imageName + ‘luend‘)  #输出日志,前后加‘luStrat‘luEnd‘特殊字符方便截取

    def add(func):  #增加打印日志的方法
        def wrapper(self, first, second, msg=None):
            try:
                func(self, first, second, msg=None)
                TestCase.screenshot()

            except AssertionError:
                TestCase.screenshot()
                raise AssertionError(msg)  # 抛出AssertionError
        return wrapper

然后在用到的assert方法前加@add装饰器。注意定义的func的传参与assert方法一致。如我用到了

@add        #此处修改def assertEqual(self, first, second, msg=None):
        """Fail if the two objects are unequal as determined by the ‘==‘
           operator.
        """
        assertion_func = self._getAssertEqualityFunc(first, second)
        assertion_func(first, second, msg=msg)

至此HTMLTestRunner.py的uo和ue输出的日志就包含了print的截图地址信息

最后一步了,取出ue和uo的关于截图的url和name,并赋值给变量html和name就搞定了~~~ 

    def _generate_report_test(self, rows, cid, tid, n, t, o, e):
        # e.g. ‘pt1.1‘, ‘ft1.1‘, etc
        has_output = bool(o or e)
        tid = (n == 0 and ‘p‘ or ‘f‘) + ‘t%s.%s‘ % (cid+1,tid+1)
        name = t.id().split(‘.‘)[-1]
        doc = t.shortDescription() or ""
        desc = doc and (‘%s: %s‘ % (name, doc)) or name
        tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL
        # o and e should be byte string because they are collected from stdout and stderr?
        if isinstance(o,str):
            # TODO: some problem with ‘string_escape‘: it escape \n and mess up formating
            # uo = unicode(o.encode(‘string_escape‘))
            uo = e
        else:
            uo = o
        if isinstance(e,str):
            # TODO: some problem with ‘string_escape‘: it escape \n and mess up formating
            # ue = unicode(e.encode(‘string_escape‘))
            ue = o      #此处修改
        else:
            ue = o

        script = self.REPORT_TEST_OUTPUT_TMPL % dict(
            id = tid,
            output = saxutils.escape(str(uo)+str(ue)),
        )
        s= str(uo) +str(ue)      #此处修改开始
        if s.count(‘png‘)!=0:       #判断日志中是否有图片
            html =  s[s.find(‘lustrat‘)+7:s.find(‘luend‘)]
            name =  html[html.find(‘shot\\‘)+5:]
        else:
            html = ‘ ‘
            name = ‘ ‘              #此处修改结束
        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,
            html = html,
            name = name,
            status = self.STATUS[n],
        )
        rows.append(row)
        if not has_output:
            return

百度云盘下载地址:unittest文件夹case.py修改链接:https://pan.baidu.com/s/1eTMJu86 密码:n19o

HTMLTestRunner.py链接:https://pan.baidu.com/s/1dGSRbg9 密码:lw0e

原文地址:https://www.cnblogs.com/zhou-Queen/p/8432230.html

时间: 2024-10-09 06:56:58

python3修改HTMLTestRunner,生成有截图的测试报告,并发送测试邮件(二)的相关文章

Python3和HTMLTestRunner生成html测试报告

1.测试环境:Python3.5+unittest+HTMLTestRunner 2.下载HTMLTestRunner.py文件 下载地址 http://tungwaiyip.info/software/HTMLTestRunner.html 右键单击保存至本地,放在Python的安装目录Lib文件夹下(我本地放在本目录下:D:\setup\Python35\Lib) 3.由于下载的HTMLTestRunner.py文件是基于Python2的,若适用于Python3则进行如下修改: 第94行,将

Python3之HTMLTestRunner测试报告美化

前面我们讲到过在做自动化测试或单元测试的时候使用HTMLTestRunner来生成测试报告,并且由于Python2 和 Python3 对于HTMLTestRunner的支持稍微有点差异,所以我们将HTMLTestRunner进行了改造,从而适配Python3,详细改造步骤可以参考:HTMLTestRunner修改成Python3版本 但是改造后的HTMLTestRunner生成的测试报告不是特别的美观,所以我又对HTMLTestRunner进行了进一步的改造,主要是做一些美化. 美化之前的测试

Python用HTMLTestRunner生成html测试报告

小编的主机:mac 一.引入HTMLTestRunner包 1.下载HTMLTestRunner.py,已上传到网盘,点击下载 2.将HTMLTestRunner.py复制到python安装目录的Lib文件夹下. 可能有的人不知道python安装地址的Lib文件夹在哪里.小编用的是mac,放的地址为:/资源库/Frameworks/Python.framework/Versions/3.6/lib/python3.6 因为看见里面有很多.py结尾的文件,常用到的os.py都在里面,放这里准没错.

基于python2.7+HTMLTestrunner生成报告后样式美化图版以及源码获取

1.增加饼形图 2.修改代码逻辑 3.优化界面样式,采用本地样式 4.加入游戏截图报告加入游戏截图 文件夹结构如下,具体涉及的css是经过修改的,和网上直接拔下来的不一样,如果需要的话加我QQ我发给你QQ:827435858 首先奉上代码,把代码复制下来命名HTMLTestRunner.py放到python2的Lib下 然后 from HTMLTestRunner import HTMLTestRunner导入目标模块 #coding=utf-8 """ A TestRunn

python3中用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;如何解决

python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-4154743-1-1.html 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 修改后下载地址:

python3中用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;如何解决【转载】

原文转自:http://bbs.chinaunix.net/thread-4154743-1-1.html python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-4154743-1-1.html 下载地址:http:/

python3中用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;的解决方法:

全文转载至:http://www.cnblogs.com/testyao/p/5658200.html python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-4154743-1-1.html 下载地址:http://t

python3+unittest+HTMLTestRunner

参考博客1 参考博客2 python3版HTMLTestRunner.py见博客园'链接'(已经上传到博客园) import unittest class operatinon_unittest(unittest.TestCase): def setUp(self): print('每个用例之前执行setup') def tearDown(self): print('每个用例执行之后') def test_one(self): print('test_one函数') def test_two(s

Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力活:对于自动化测试与人工测试优缺势的问题,这里不想深入讨论,开一个博客收集一些观点然后开个讨论组讨论效果可能会更好. 标题上列的,是自己对web自动化这块统一的一个想象或是一套完整的自动化应所包含的的部分,目前完成了excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试