Pytest-测试报告pytest-html

简介: Pytest-测试报告pytest-html

测试报告必不可少,例如pytest-html亦或者allure,本系列都会讲到。

pytest-html

下载

pip install pytest-html

执行命令

pytest -vs --html=./result/report.html

意思是在根目录下创建一个result文件,在此文件下生产report.html测试报告。

ini配置

addopts = -vs --html=./result/report.html

如果你不想在执行后css于html文件分开,可以执行如下命令:

addopts = -vs --html=./result/report.html --self-contained-html

修改测试报告

中文乱码问题

看清楚哦,此处是标题以及内容全部乱码,本人已经将网上的方法全部写试过了。例如:改conftest.py里面的默认语言设置等。都无用。

解决方案:

  1. 在开始搜索框输入“更改国家或地区”,回车,点击右上角的“管理语言设置”,点击右上角的“管理”标签。
  2. 点击“更改系统区域设置”,勾选“beta版:使用Unicode UTF-8 提供全球语言支持”的选项,点击“确定”。
  3. 在弹出的对话框中,点击“现在重新启动”按钮,即可把系统默认编码设为utf-8。

这样的方式会导致电脑中的一些第三方应用(正常途径下载不了的,私包等)无法正常使用,因为编码格式不一样。所以需要注意一下。产生的原因可能是因为公司电脑加密的原因。

测试用例中文显示问题

def pytest_collection_modifyitems(items):
    # item表示每个测试用例,解决用例名称中文显示问题
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode-escape")
        item._nodeid = item._nodeid.encode("utf-8").decode("unicode-escape")

亦或者:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    if item.function.__doc__ is None:
        report.description = str(item.function.__name__)
    else:
        report.description = str(item.function.__doc__)
    report.nodeid = report.nodeid.encode("utf-8").decode("unicode_escape")  # 设置编码显示中文

pytest_runtest_makereport除了这个用处,下文中还会介绍到其他用法。

修改测试报告标题

"""conftest.py"""
def pytest_html_report_title(report):
    report.title = "清安的APP测试报告"

修改测试环境

若要在运行测试「之前」修改_“环境_”部分,请使用:pytest_configure

"""conftest.py"""
def pytest_configure(config):
    config._metadata["selenium"] = "4.7.0"

若要在运行测试「后」修改_“环境_”部分,请使用:pytest_sessionfinish

"""conftest.py"""
import pytest
@pytest.hookimpl(tryfirst=True)
def pytest_sessionfinish(session, exitstatus):
    session.config._metadata["foo"] = "bar"

当然,如果你觉的这些无用,我可以清除掉,只写自己认为有用的:

def pytest_configure(config):
    config._metadata.clear()
    config._metadata['测试项目'] = "清安笔记展示"
    config._metadata['公众号'] = "测个der"
    config._metadata["selenium"] = "4.7.0"

编辑摘要信息

"""conftest.py"""
from py.xml import html
def pytest_html_results_summary(prefix, summary, postfix):
    # prefix.clear()  # 清空summary中的内容
    prefix.extend([html.p("负责人: 清安")])

添加测试时间表单以及用例描述

"""conftest.py"""
from py.xml import html
from time import strftime
import pytest
def pytest_html_results_table_header(cells):
    cells.insert(2, html.th("用例描述"))
    cells.insert(1, html.th("Time", class_="sortable time", col="time"))
    cells.pop()
def pytest_html_results_table_row(report, cells):
    cells.insert(2, html.td(report.description))
    cells.insert(1, html.td(strftime('%Y-%m-%d %H:%M:%S'), class_='col-time'))
    cells.pop()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    report.description = str(item.function.__doc__)

注意,此时Links已经没有了哦,被pop掉了。关于用例描述:

def test01():
    """我是test01"""
    assert True

只需要在测试用例中加上"""""",如上所示即可。

错误截图并添加进测试报告,示例:

from py.xml import html
import pytest
@pytest.fixture(scope="session")
def driver_():
    global driver
    desired_capas = {
        "deviceName": readini('devicename', 'name'),
        "platformName": readini('devicename', 'platform'),
        "platformVersion": readini('devicename', 'Version'),
        "noReset": readini('devicename', 'Reset')
    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capas)
    yield driver
def _capture_screenshot():
    return driver.get_screenshot_as_base64()
@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 = _capture_screenshot()
            if file_name:
                html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:300px;height:500px;" ' \
                       'onclick="window.open(this.src)" align="right"/></div>' % screen_img
                extra.append(pytest_html.extras.html(html))
        report.extra = extra
        if item.function.__doc__ is None:
            report.description = str(item.function.__name__)
        else:
            report.description = str(item.function.__doc__)
        report.nodeid = report.nodeid.encode("utf-8").decode("unicode_escape")

测试报告收集日志

from loguru import logger
def test01():
    """我是test01"""
    logger.debug('This is <DEBUG> information')
    assert True

在配置文件中加上:--capture=sys即可,例如:

addopts = -vs --html=./result/report.html --self-contained-html --capture=sys

你也可以测试用例正常通过的不收集用例:

"""conftest.py"""
def pytest_html_results_table_html(report, data):
    if report.passed:
        del data[:]
        data.append(html.div("用例通过,不收集日志", class_="empty log"))

用例执行持续时间修改

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    setattr(report, "duration_formatter", "%H:%M:%S.%f")
    report.description = str(item.function.__doc__)

关于pytest_runtest_makereport

你还可以:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    out = yield  # 钩子函数
    res = out.get_result()  # 获取用例执行结果
    print(res)
    if res.when == "call":  # 只获取call用例失败时的信息
        print("item:{}".format(item))
        print("用例描述:{}".format(item.function.__doc__))
        print("异常:{}".format(call.excinfo))
        print("详细日志:{}".format(res.longrepr))
        print("测试结果:{}".format(res.outcome))
        print("用例耗时:{}".format(res.duration))
        print(res.__dict__)
    res.description = str(item.function.__doc__)

这样会在每一条用例执行的时候会打印出相对应得信息,个人认为,了解即可。

关于测试报告的其他中文修改

此项需要自己先找到包所在的位置,找到site-packages/pytest_html。例如我的pytest_文件在D盘,那么就去D:/site-packages/pytest_html

找到pytest_html包下的html_report.py源文件:修改Summary以及environment 为中文信息,在html_report.py中搜索这两个单词直接修改即可:

body.extend([html.h2("摘要")] + summary_prefix + summary + summary_postfix)
environment = [html.h2("环境信息")]

想修改测试标题下的文字信息找到,搜索generated可以直接找到:

body = html.body(
            html.script(raw(main_js)),
            html.h1(self.title),
            html.p(
                "Report generated on {} at {} by ".format(
                    generated.strftime("%d-%b-%Y"), generated.strftime("%H:%M:%S")
                ),
                html.a("pytest-html", href=__pypi_url__),
                f" v{__version__}",
            ),
            onLoad="init()",
        )

直接修改Report generated on {} at {} by即可。记得两个中括号是时间信息,当然,你要是不喜欢可以直接删除。想修改摘要下的英文提示信息只需要找到,搜索关键字check:

summary = [
            html.p(f"{numtests} tests ran in {suite_time_delta:.2f} seconds. "),
            html.p(
                "(Un)check the boxes to filter the results.",
                class_="filter",
                hidden="true",
            )

直接修改即可。想修改测试报告中的Results,直接搜索这个单词即可找到下述部分,修改即可:

results = [
            html.h2("Results"),

如果你想修改测试报告中

cells = [
            html.th("Result", class_="sortable result initial-sort", col="result"),
            html.th("Test", class_="sortable", col="name"),
            html.th("Duration", class_="sortable", col="duration"),
            html.th("Links", class_="sortable links", col="links"),
        ]

找到此部分修改即可。有关测试报告部分中英文问题的大部分都可以在html_report.py文件中进行修改。唯有一处需要在main.js中修改。pytest_html/resources/main.js

showhideall.innerHTML = '<a href="javascript:showAllExtras()">Show all details</a> / ' +
                            '<a href="javascript:hideAllExtras()">Hide all details</a>';

找到这个地方,直接将Show all details以及Hide all details修改即可。

目录
相关文章
|
6月前
|
数据可视化 测试技术 持续交付
自动化测试神器:Python之Pytest库入门使用
自动化测试神器:Python之Pytest库入门使用
164 4
|
5月前
|
存储 设计模式 测试技术
怎么基于Pytest+Requests+Allure实现接口自动化测试?
该文介绍了一个基于Python的自动化测试框架,主要由pytest、requests和allure构成,采用关键字驱动模式。项目结构分为六层:工具层(api_keyword)封装了如get、post的请求;参数层(params)存储公共参数;用例层(case)包含测试用例;数据驱动层(data_driver)处理数据;数据层(data)提供数据;逻辑层(logic)实现用例逻辑。代码示例展示了如何使用allure装饰器增强测试报告,以及如何使用yaml文件进行数据驱动。
152 0
|
22天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
100 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
22天前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
19 2
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
67 6
基于Python访问Hive的pytest测试代码实现
|
3月前
|
前端开发 关系型数据库 测试技术
django集成pytest进行自动化单元测试实战
在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试框架,Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。
45 3
django集成pytest进行自动化单元测试实战
|
3月前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
50 1
|
3月前
|
Web App开发 安全 测试技术
自动化测试中的Python魔法:使用Selenium和pytest框架
【8月更文挑战第31天】 在软件开发的海洋中,自动化测试是确保航行安全的灯塔。本文将带你探索如何利用Python语言结合Selenium和pytest框架,搭建一套高效的自动化测试体系。我们将从基础设置讲起,逐步深入到编写测试用例,最后通过一个实战案例来展示如何在实际项目中运用这些工具。文章旨在为读者提供一套清晰的自动化测试解决方案,让你的开发之旅更加顺畅。
|
4月前
|
Shell Python
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
|
4月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。