pytest_runtest_makereport解析

@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:
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        if hasattr(driver, "get_screenshot_as_png"):
            with allure.step('添加失败截图'):
                screenshot = driver.get_screenshot_as_png()
                # 将失败截图添加到allure报告中
                allure.attach(screenshot, "失败截图", allure.attachment_type.PNG)
                # 保存截图到本地文件夹
                timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
                filename = f"{rep.nodeid}_{timestamp}.png"
                with open(filename, "wb") as file:
                    file.write(screenshot)

分析:

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):

@pytest.hookimpl 指示这是一个 Pytest 钩子函数,@pytest.hookimpl(tryfirst=True, hookwrapper=True) 分别指示这个钩子函数是在其他同名钩子函数之前执行的(tryfirst=True),并且这个钩子函数可以在被装饰函数执行之前和之后运行其他代码(hookwrapper=True)。

outcome = yield
rep = outcome.get_result()

yield 用于暂停函数的执行,并返回 outcome 对象。outcome 对象是在钩子函数执行期间生成的,它包含了被装饰函数(即测试用例)的执行结果。一旦 yield 返回了 outcome 对象,钩子函数就会继续执行,并使用 outcome.get_result() 获取测试用例的执行结果 rep。

mode = "a" if os.path.exists("failures") else "w"

确定写入文件的模式,如果 failures 文件已经存在,则以追加模式打开文件,否则以写入模式打开文件。

if "tmpdir" in item.fixturenames:
    extra = " (%s)" % item.funcargs["tmpdir"]
else:
    extra = ""

tmpdir 是 pytest 提供的一个内置 fixture,用于在测试用例中创建一个临时目录,并在测试完成后自动删除。这个 fixture 在测试用例中以参数的形式使用,使用 tmpdir 可以方便地进行一些需要使用临时文件或目录的测试场景,同时避免在测试完成后遗留垃圾文件。
如果当前测试用例中使用了 tmpdir fixture,那么就把 extra 变量设置为一个字符串,格式为 " (临时目录路径)",其中临时目录路径是通过 item.funcargs[“tmpdir”] 获取的。item 表示当前测试用例的 pytest.Item 对象,funcargs 是一个字典,包含了测试用例中所有被调用的 fixture 的参数,如果当前测试用例中使用了 tmpdir fixture,那么 item.funcargs[“tmpdir”] 就会返回一个路径字符串,表示临时目录的路径。这个字符串会被插入到 extra 变量中,用于在写入到 “failures” 文件时增加一些额外的信息。如果当前测试用例没有使用 tmpdir fixture,则 extra 变量被设置为空字符串。

if hasattr(driver, "get_screenshot_as_png"):
      with allure.step('添加失败截图'):
          screenshot = driver.get_screenshot_as_png()

hasattr(object, name) 是 Python 内置函数之一,用于检查一个对象是否包含指定的属性或方法。它的参数有两个,object 表示要检查的对象,name 表示要检查的属性或方法名。
如果测试用例使用了一个名为 “driver” 的 fixture,那么它将使用 driver.get_screenshot_as_png() 方法来获取一个屏幕截图,并使用 Allure 来添加该截图到测试报告中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值