Las capturas de pantalla fallidas de implementación de pytest framework _pytest_runtest_makereport se agregan automáticamente a allure

El efecto se muestra en la figura:
Inserte la descripción de la imagen aquí
análisis de código:

# conftest.py层的代码

# coding=utf-8
import pytest, os, allure
from selenium import webdriver
import xlrd


# 用例失败后自动截图
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    获取用例执行结果的钩子函数
    :param item:
    :param call:
    :return:
    """
    outcome = yield
    report = outcome.get_result()
    if report.when == "call" and report.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            if "tmpir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
                f.write(report.nodeid + extra + "\n")
            with allure.step('添加失败截图...'):
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)


@pytest.fixture(scope='session', autouse=True)
def browser():

    global driver
    driver = webdriver.Chrome()
    return driver

# test_1.py 测试用例层代码

import pytest, os
from selenium import webdriver
import allure


def test_login(browser):
    with allure.step("step1:打开登录首页"):
        browser.get("https://qzone.qq.com/")
    with allure.step("step2:输入账号:admin"):
        browser.find_element_by_name("u").send_keys("admin")
    with allure.step("step2:输入密码:123456"):
        browser.find_element_by_name("p").send_keys("123456")


if __name__ == "__main__":
    pytest.main(['--alluredir', 'D:/se_frame/Reports/allure_data', 'test_2.py::test_login'])
    # allure转换成---html并打开测试报告
    os.system('cd D:/se_frame/Reports/allure_data')
    os.system('allure generate D:/se_frame/Reports/allure_data -o D:/se_frame/Reports/html --clean')

Análisis de código de función de gancho:

Muchos ganchos proporcionados por pytest facilitan el desarrollo secundario del marco del caso de prueba, que se puede modificar de acuerdo con nuestras propias necesidades.
Aprenda primero el método de gancho pytest_runtest_makereport, puede comprender el proceso de ejecución del caso de uso con mayor claridad y obtener el resultado de ejecución de cada caso de uso.
Primero mire el código fuente relevante, en _pytest / runner.py, después de que pueda importarlo, haga clic para ver
def pytest_runtest_makereport (item, call):
“” "return a: py: class: _pytest.runner.TestReportobject
para el dado: py: class : pytest.Itemy
: Py: clase: _pytest.runner.CallInfo.
"" "
aquí es el elemento de prueba, llamada es un paso de la prueba, el proceso de implementación es el siguiente:
la primera aplicación cuando la configuración = 'setup' del resultado de la ejecución devuelto
se lleva a cabo a continuación, cuando = ' call 'call devuelve un resultado de ejecución
Finalmente ejecutar cuando =' teardown 'para devolver el resultado de ejecución de desmontaje

(2) Decorador: @ pytest.hookimpl () >>> Modifica la definición de la función de enganche del informe de pytest-html
. La
función de enganche también se llama función de enganche. entendido como un mensaje), y luego trata las cosas que te gustan por separado

# 对于给定的测试用例(item)和调用步骤(call),返回一个测试报告对象(_pytest.runner.TestReport)
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
  每个测试用例执行后,制作测试报告
  :param item:测试用例对象
  :param call:测试用例的测试步骤
           执行完常规钩子函数返回的report报告有个属性叫report.when
            先执行when=’setup’ 返回setup 的执行结果
            然后执行when=’call’ 返回call 的执行结果
            最后执行when=’teardown’返回teardown 的执行结果
    :return:
    """
    # 获取常规钩子方法的调用结果,返回一个result对象 
    outcome = yield
    report = outcome.get_result()
    if report.when == "call" and report.failed:

        # 就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
        mode = "a" if os.path.exists("failures") else "w"
        # 打开这个文件
        with open("failures", mode) as f:
            if "tmpir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
                f.write(report.nodeid + extra + "\n")

            # 添加1个测试测试步骤为了防截图
            with allure.step('添加失败截图...'):
                # 插入截图的详细信息
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)

http://www.51testing.com/html/42/n-4474642.html
https://blog.csdn.net/u011035397/article/details/109546814

Supongo que te gusta

Origin blog.csdn.net/weixin_45451320/article/details/113926107
Recomendado
Clasificación