自动化测试中的失败截图和存log

这篇具有很好参考价值的文章主要介绍了自动化测试中的失败截图和存log。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果我们在执行自动化测试的时候,希望能在失败的时候保存现场,方便事后分析。 对于UI自动化,我们希望截图在测试报告中。 对于api自动化,我们希望截取出错的log在测试报告中。 我开始自己蛮干,写了两个出错截图的方法。

def save_screenshot():
    '''
    页面截屏保存截图
    :return:
    '''
    file_name = IMG_PATH + "\\{}.png".format(time.strftime("%Y%m%d%H%M%S", time.localtime()))
    d.screenshot(file_name)
    with open(file_name, mode='rb') as f:
        file = f.read()
    allure.attach(file, allure.attachment_type.PNG)

出错截图,我写了一个装饰器

 
def fail_screenshot(func):
    '''
    失败页面截屏保存截图
    :return:
    '''
 
    def wrapper(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except:
            file_name = FAIL_IMG_PATH + "\\{}_{}.png".format(func.__name__,
                                                             time.strftime("%Y%m%d%H%M%S", time.localtime()))
            d.screenshot(file_name)
 
            # with open(file_name, mode='rb') as f:
            #     file = f.read()
            # allure.attach(file, allure.attachment_type.PNG)
 
    return wrapper

似乎能达到我的期望,就是太烦了,每次需要调用或者将装饰器写在函数上。 然后我发现allue里面有一个钩子函数。

from _pytest import runner
 
# 对应源码
def pytest_runtest_makereport(item, call):
    """ return a :py:class:`_pytest.runner.TestReport` object
    for the given :py:class:`pytest.Item` and
    :py:class:`_pytest.runner.CallInfo`.
    """

这里item是测试用例,call是测试步骤,具体执行过程如下:

先执行when='setup' 返回setup 的执行结果

然后执行when='call' 返回call 的执行结果

最后执行when='teardown'返回teardown 的执行结果

例如:

# conftest.py 
import pytest
 
 
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    print('------------------------------------')
 
    # 获取钩子方法的调用结果
    out = yield
    print('用例执行结果', out)
 
    # 3. 从钩子方法的调用结果中获取测试报告
    report = out.get_result()
 
    print('测试报告:%s' % report)
    print('步骤:%s' % report.when)
    print('nodeid:%s' % report.nodeid)
    print('description:%s' % str(item.function.__doc__))
    print(('运行结果: %s' % report.outcome))

运行用例的过程会经历三个阶段:setup-call-teardown,每个阶段都会返回的 Result 对象和 TestReport 对象,以及对象属性。

如果setup执行失败了,setup的执行结果的failed,后面的call用例和teardown都不会执行了。

如果setup正常执行,但是测试用例call失败了。那么此时运行的结果就是failed。

如果setup正常执行,测试用例call正常执行,teardown失败了,这种情况,最终统计的结果:1 passed, 1 error in 0.16 seconds

只获取call的时候,我们在写用例的时候,如果保证setup和teardown不报错情况,只关注测试用例本身的运行结果,前面的 pytest_runtest_makereport 钩子方法执行了三次。

可以加个判断:if report.when == "call"

import pytest
from _pytest import runner
'''
# 对应源码
def pytest_runtest_makereport(item, call):
    """ return a :py:class:`_pytest.runner.TestReport` object
    for the given :py:class:`pytest.Item` and
    :py:class:`_pytest.runner.CallInfo`.
    """
'''
 
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    print('------------------------------------')
 
    # 获取钩子方法的调用结果
    out = yield
    # print('用例执行结果', out)
 
    # 3. 从钩子方法的调用结果中获取测试报告
    report = out.get_result()
    if report.when == "call":
        print('测试报告:%s' % report)
        print('步骤:%s' % report.when)
        print('nodeid:%s' % report.nodeid)
        print('description:%s' % str(item.function.__doc__))
        print(('运行结果: %s' % report.outcome))
 
@pytest.fixture(scope="session", autouse=True)
def fix_a():
    print("setup 前置操作")
    yield
    print("teardown 后置操作")

allure报告集成错误截图 需要使用conftest.py文件,conftest.py需要存在在测试目录中,文件名不能变更,可以根据模块创建层级嵌套。

具体参照pytest的官方文档

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    '''
    hook pytest失败
    :param item:
    :param call:
    :return:
    '''
    # execute all other hooks to obtain the report object
    outcome = yield
    rep = outcome.get_result()
    # we only look at actual failing test calls, not setup/teardown
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            # let's also access a fixture for the fun of it
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        # pic_info = adb_screen_shot()
        with allure.step('添加失败截图...'):
            allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)

好了,我们可以用在我们自己的项目里面来了。 我们可以在conftest.py里面定义:

import pytest
from selenium import webdriver
import os
import allure
 
 
 
_driver = None
 
 
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    '''
    获取每个用例状态的钩子函数
    :param item:
    :param call:
    :return:
    '''
    # 获取钩子方法的调用结果
    outcome = yield
    rep = outcome.get_result()
    # 仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            # let's also access a fixture for the fun of it
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        # 添加allure报告截图
        if hasattr(_driver, "get_screenshot_as_png"):
            with allure.step('添加失败截图...'):
                allure.attach(_driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)
 
 
@pytest.fixture(scope='session')
def browser():
    global _driver
    if _driver is None:
        _driver =webdriver.Chrome()
    yield _driver
    print("1111111111")
    _driver.quit()

然后写一个测试用例,如在某度上搜一个关键词。

 
@allure.feature('self study')
class TestLesson():
    @allure.story('user course page')
    @allure.description('be course')
    def test_be_ge_course(self,browser):
        url = 'http://www.baidu.com'
        browser.get(url)
        time.sleep(2)
        browser.find_element_by_id('kw').send_keys("python")
 
        with allure.step('查找元素...'):
            browser.find_element_by_id('su').click()
            time.sleep(2)
 
        assert browser.title == 'python'

这是一个失败的用例,所以执行错误会截图。

自动化测试中的失败截图和存log,软件测试,python,开发语言,功能测试,软件测试,自动化测试,程序人生,职场和发展

这样你的报告就看起来高大上了。 截图还可以直接用allure.attach allure.attach(挺有用的) 作用:allure报告还支持显示许多不同类型的附件,可以补充测试结果;自己想输出啥就输出啥,挺好的

语法:allure.attach(body, name, attachment_type, extension) 
 
参数列表
body:要显示的内容(附件)
name:附件名字
attachment_type:附件类型,是 allure.attachment_type 里面的其中一种
extension:附件的扩展名(比较少用)

allure.attach.file(source, name, attachment_type, extension) source:文件路径,相当于传一个文件

其他参数和上面的一致:

TEXT = ("text/plain", "txt")
   CSV = ("text/csv", "csv")
   TSV = ("text/tab-separated-values", "tsv")
   URI_LIST = ("text/uri-list", "uri")
 
   HTML = ("text/html", "html")
   XML = ("application/xml", "xml")
   JSON = ("application/json", "json")
   YAML = ("application/yaml", "yaml")
   PCAP = ("application/vnd.tcpdump.pcap", "pcap")
 
   PNG = ("image/png", "png")
   JPG = ("image/jpg", "jpg")
   SVG = ("image/svg-xml", "svg")
   GIF = ("image/gif", "gif")
   BMP = ("image/bmp", "bmp")
   TIFF = ("image/tiff", "tiff")
 
   MP4 = ("video/mp4", "mp4")
   OGG = ("video/ogg", "ogg")
   WEBM = ("video/webm", "webm")
 
   PDF = ("application/pdf", "pdf")

根据需要,在报告里将更多的信息展现出来。 这周末啥也没干,主要就搞明白了这个。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

自动化测试中的失败截图和存log,软件测试,python,开发语言,功能测试,软件测试,自动化测试,程序人生,职场和发展

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

自动化测试中的失败截图和存log,软件测试,python,开发语言,功能测试,软件测试,自动化测试,程序人生,职场和发展文章来源地址https://www.toymoban.com/news/detail-831603.html

到了这里,关于自动化测试中的失败截图和存log的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 火爆全网,Pytest自动化测试框架-测试用例执行与失败重跑(实战详细)

    用例执行状态 用例执行完成后,每条用例都有自己的状态,常见的状态有 passed:测试通过 failed:断言失败 error:用例本身写的质量不行,本身代码报错(譬如:fixture不存在,fixture里面有报错) xfail:预期失败,加了 @pytest.mark.xfail() error例子1:参数不存在 为啥是error pwd参数

    2024年02月11日
    浏览(44)
  • Web自动化测试中的接口测试

    1.1 Web 程序中的接口 1.1.1 典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端。web客户端的应用有html,JavaScript,ajax,flash等;服务器端的应用非常丰富,比如 java 的servlet,jsp,ssh框架,.net的aspx,

    2024年01月22日
    浏览(34)
  • 案例:巡检自动化=selenium+截图+接口

    网页应用方面 分为三步:第一步实现网页自动化打开,登录到需巡检的界面,第二步通过截图,保存巡检时状态图,第三步通过接口推送至手机app如企业微信,钉钉等。 网页自动化 准备 第一:selenium环境部署和定位学习:https://blog.csdn.net/qq_54219272/article/details/123310772 第二:

    2024年02月08日
    浏览(46)
  • 如何克服自动化测试中的壁垒和问题?

    随着自动化测试技术的快速发展和普及,自动化测试已经成为各个行业广泛应用的重要测试手段。然而,自动化测试中仍然存在壁垒和问题,这些问题可能对测试效果产生影响,甚至会影响整个项目的进程。在本文中,我们将探讨如何克服自动化测试中的壁垒和问题。 1.技术

    2024年02月11日
    浏览(44)
  • 如何处理PHP开发中的单元测试和自动化测试?

    如何处理PHP开发中的单元测试和自动化测试,需要具体代码示例 随着软件开发行业的日益发展,单元测试和自动化测试成为了开发者们重视的环节。PHP作为一种广泛应用于Web开发的脚本语言,单元测试和自动化测试同样也在PHP开发中扮演着重要的角色。本文将介绍如何处理

    2024年02月04日
    浏览(42)
  • 实现自动化测试中的AI与机器学习支持

    自动化测试是软件开发过程中不可或缺的一部分,它可以有效地提高软件质量,降低开发成本。然而,随着软件系统的复杂性不断增加,传统的自动化测试方法已经无法满足需求。因此,研究人员和企业开始关注AI和机器学习技术,以提高自动化测试的效率和准确性。 在本文

    2024年02月20日
    浏览(42)
  • 实战干货,pytest自动化测试-Git中的测试用例运行(详细)

    我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例。 pytest-picked 插件可以实现只运行未提交到git仓库的代码。 pytest-picked 使用命令行安装 可使用参数 使用示例:

    2024年02月09日
    浏览(57)
  • 细节有惊喜!详解Web自动化框架UI自动截图与画面回放实现!

    目录  前言: Web自动化测试框架基本结构及原理 UI自动截图实现方法 基于Selenium截图实现UI自动截图的过程如下: 基于Selenium截图的代码实现如下: 基于爬虫截图实现UI自动截图的流程如下: 基于爬虫截图的代码实现如下:

    2024年02月09日
    浏览(61)
  • Selenium4.0 + Python手撸自动化框架系列之 Web截图 与 封装

    在做Web自动化时,网页截图是常用的操作。像一般的自动化框架与工具都会有截图机制,比如: 1、元素等待失败触发截图 2、元素操作失败触发截图 3、检查点失败触发截图 4、主动要求的触发截图 四种场景,均可触发网页截图操作,将截图保存到对应某个路径下面。 那么

    2024年02月08日
    浏览(69)
  • 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新页面、录制、页面对象模式操作

    写在前面 关于 Playwright 系列的文章,真的很久没有写了,今天一个不小心官方 API 部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习。 API部分 多线程 直白点说就是多线程下 Playwright 的使用,示例代码如下: 重定向到指定页面 跳转到指定页面,示例代码

    2024年01月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包