美文网首页软件测试
pytest--html报告优化(增加错误截图,获取统计数据)

pytest--html报告优化(增加错误截图,获取统计数据)

作者: 小啊小狼 | 来源:发表于2021-03-19 14:29 被阅读0次

    一、html报告增加错误截图

    应用场景

    在我们做UI自动化时,往往在用例执行失败时通过设定的log来进行错误分析,来优化代码或者确定问题,测试报告也默认只有log的展示。如果我们在用例执行失败时能进行当前页面的截图,并且将截图直接呈现在测试报告中的话,是不是可以帮助我们更直观的定位到问题呢?

    实现方式

    同样是在conftest.py中进行配置

    '''用例失败截图'''
    @pytest.mark.hookwrapper
    def pytest_runtest_makereport(item):
        """
        当测试失败的时候,自动截图,展示到html报告中
        :param item:
        """
        pytest_html = item.config.pluginmanager.getplugin('html')
        outcome = yield
        report = outcome.get_result()
        extra = getattr(report, 'extra', [])
    
        if report.when == 'call' or report.when == "setup":
            xfail = hasattr(report, 'wasxfail')
            if (report.skipped and xfail) or (report.failed and not xfail):
                file_name = report.nodeid.replace("::", "_")+".png"
                screen_img = screenshot_base64()
                if file_name:
                    html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ' \
                           'onclick="window.open(this.src)" align="right"/></div>' % screen_img
                    extra.append(pytest_html.extras.html(html))
            report.extra = extra
            report.description = str(item.function.__doc__)
    
    
    def screenshot_base64():
        '''
        截图保存为base64,展示到html中
        :return:
        '''
        driver = getattr(GetData,'driver')   #从GetData类中取出driver属性的值作为实际的driver
        return driver.get_screenshot_as_base64()
    

    注意:
    1、以上screenshot_base64()方法中所用到的driver为当前执行UI自动化时启动的driver,获取的方式可以是在启动driver时将之设置为全局变量直接调用,或者像我那样用setattr将driver存储起来,在用到的地方再用getattr将之取出,可以实现跨模块的调用,具体请学习getattr和setattr 的基本用法。下面是赋值的代码

    class GetData():
        homework_page_stateText=None
        summary = None
        driver = None
    
    @pytest.fixture(scope="module")
    def startMiniProgram():
        "启动小程序,返回driver,运行结束后关闭小程序,模块级别的前后置操作"
        driver = baseDriver()
        sleep(5)
        # 切换到工作台首页
        CommBus(driver).switchTo_miniProgram()
        setattr(GetData,'driver',driver)  #将driver赋值给自定义的GetData类的driver属性
        yield (driver)
        sleep(2)
        CommBus(driver).close_miniProgram()
    

    效果展示:


    image.png

    二、获取用例执行的统计数据

    应用场景

    image.png

    以上为测试报告中的统计数据,有时我们可能想直接把统计数据提取出来,单独发送邮件时展示,或者作为直观的执行结果进行传递,而不需要别人要打开测试报告才能看到。那这个时候我们应该怎么做呢?

    实现方式

    同样是在conftest.py中进行配置

    def pytest_terminal_summary(terminalreporter, exitstatus, config):
        '''收集测试结果'''
        total = terminalreporter._numcollected
        passed = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])
        failed = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])
        error = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])
        skipped = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])
        pass_rate = format(len(terminalreporter.stats.get('passed', []))/terminalreporter._numcollected*100, '.2f')
    
        duration = time.time() - terminalreporter._sessionstarttime
        total_times = str(format(duration,'.2f')) + '秒'   #时间取2位小数,单位为秒
    
        count = f'本次用例执行结果概览:\n\n用例合计数:-----{total}\n执行通过数:-----{passed}\n执行失败数:-----{failed}\n执行报错数:-----{error}\n跳过用例数:-----{skipped}\n执行成功率:-----{pass_rate}%\n运行总耗时:-----{total_times}\n\n详细测试报告请查阅附件'
        setattr(GetData,'summary' ,count)   #将组装好的summary文本内容赋值给GetData类的 summary属性,已供其他地方调用
    
    

    在需要用到统计数据的地方直接调用

    getattr(GetData, 'summary')
    

    就可以把统计数据获取到。

    效果展示(邮件正文发送):

    image.png

    相关文章

      网友评论

        本文标题:pytest--html报告优化(增加错误截图,获取统计数据)

        本文链接:https://www.haomeiwen.com/subject/fujvcltx.html