pytest_runtest_makereport实现断言失败自动截图并集成到allure报告

之前的做法

之前的做法是通过在basepage中封装一个失败截图保存到allure报告中的方法,如下

pytest_runtest_makereport实现断言失败自动截图并集成到allure报告


然后使用时,通过try...except 手动判断是否发生了断言异常,发生了则调用该方法

pytest_runtest_makereport实现断言失败自动截图并集成到allure报告


现在做法:通过在conftest设置钩子函数,自动获取每个用例失败结果,自动截图到allure

参考链接

conftest文件中的内容

import os

import pytest
import allure
from selenium import webdriver

# 设置全局变量的原因是因为,pytest_runtest_makereport方法中要用到,而我们创建的driver是在方法里面,因此设置全局变量,两方都可解决
driver = None 

# 设置全局的原因是,想只开一次浏览器,完成所有用例的执行;如果不想设置全局,则if driver is None这行代码要去掉,否则存在问题
@pytest.fixture(scope='session')
def browser():
    global driver

    # 只打开一次浏览器,完成所有用例的操作
    if driver is None:
        driver = webdriver.Chrome()

    yield driver

    driver.quit()



@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    print('------------------------------------')
    # 获取钩子方法的调用结果
    outcome = yield
    rep = outcome.get_result()
    # 仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        # 添加allure报告截图
        # 如果当前webdriverr版本中有该方法,则使用
        if hasattr(driver, "get_screenshot_as_png"):
            with allure.step('添加失败截图...'):
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)




用例中的内容


import pytest
from selenium import webdriver

lis = ['百度4下','百度一下','百度N下']


@pytest.mark.parametrize('data', lis)
def test_screen(browser,data):
    driver = browser
    driver.get("http://www.baidu.com")
    text_value = driver.find_element("id", "su").get_attribute('value')
    assert text_value == data




效果如下
pytest_runtest_makereport实现断言失败自动截图并集成到allure报告

上一篇:java自己开发工作流


下一篇:C#拖动自己的定义标题栏(panel)以及实现窗体拖动关闭和最小化