IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【pytest-html】深度探索pytest-html测试报告的自定义使用 -> 正文阅读

[Python知识库]【pytest-html】深度探索pytest-html测试报告的自定义使用

一、前言

插件项目地址:https://github.com/pytest-dev/pytest-html

官方文档地址:https://pytest-html.readthedocs.io/en/latest/

二、安装

依赖

  • Python >=3.6
  • or PyPy3

直接安装

pip install pytest-html

从源码安装

 pip install -e .

三、基本使用

# 直接在当前目录生成名称为report.html的报告,同时会自动生成一个assets样式文件目录
pytest --html=report.html
# 直接在当前目录生成名称为report.html的报告,报告自带样式
pytest --html=report.html --self-contained-html

四、深度使用

1. 改变报告样式

pytest --html=report.html --css=自定义的样式文件的路径

示例

  1. 首先新建一个css文件,入如:report.css
    在这里插入图片描述

  2. 打开pytest-html生成的报告,用F12查看标签的相关信息,class,id,标签名等

在这里插入图片描述
3. 先尝试直接通过F12更改报告样式,看是否有效。(当前如果你很会css,可以忽略这个步骤)
在这里插入图片描述

  1. 拷贝样式代码到report.css
    在这里插入图片描述

  2. 运行测试时,指定该css文件:pytest --html=report.html --css=report.css
    在这里插入图片描述

  3. 再次打开报告,可以看到我们指定的css样式生效了。
    在这里插入图片描述

2. 修改报告标题

默认情况下,pytest-html会使用报告文件名作为报名标题,这里我们可以通过钩子函数pytest_html_report_title更改报告标题。

def pytest_html_report_title(report):
    report.title = "My very own title!"

示例

  1. 找到项目根目录下的conftest.py文件,往里面粘贴上面的代码,其中标题是可以自定义的。
    在这里插入图片描述

  2. 重新生成报告就可以看到效果了。
    在这里插入图片描述

3. 修改Enviroment

环境模块是由 pytest-metadata 插件提供的。有两个钩子函数:pytest_configurepytest_sessionfinish

在测试运行前修改环境配置pytest_configure

def pytest_configure(config):
    config._metadata["键"] = "值"

在测试运行后修改环境配置pytest_sessionfinish

import pytest

@pytest.hookimpl(tryfirst=True)
def pytest_sessionfinish(session, exitstatus):
    session.config._metadata["键"] = "值"

注意:

  • @pytest.hookimpl(tryfirst=True)非常重要;
  • 它可以使得pytest_sessionfinish在任何其他插件(包括pytest-htmlpytest-metadata)运行前运行;
  • 如果我们没有增加@pytest.hookimpl(tryfirst=True),就会导致环境表不会按照我们预想的发生变化。

示例

  1. 在conftest.py文件上增加如下代码
    在这里插入图片描述

  2. 重新运行生成报告后,报告如下图所示
    在这里插入图片描述

问题

官方文档这部分功能,没有理解,大家如果搞定了可以给我留言,谢谢啦!
在这里插入图片描述

4. 修改Summary

我们可以通过钩子函数pytest_html_results_summary修改summary部分内容。

from py.xml import html


def pytest_html_results_summary(prefix, summary, postfix):
    prefix.extend([html.p("追加的内容")])

示例

  1. 在conftest.py文件上增加如下代码
    在这里插入图片描述

  2. 重新运行生成报告后,报告如下图所示
    在这里插入图片描述

5. 增加额外的内容

我们能通过extra给报告增加更多的详细信息。以下是我们可以增加的内容。

TypeExample
Raw HTMLextra.html(‘
Additional HTML
’)
JSONextra.json({‘name’: ‘pytest’})
Plain textextra.text(‘Add some simple Text’)
URLextra.url(‘http://www.example.com/’)
Imageextra.image(image, mime_type=‘image/gif’, extension=‘gif’)
Imageextra.image(‘/path/to/file.png’)
Imageextra.image(‘http://some_image.png’)

注意:

  • 当我们从文件中增加一个图片时,图片的路径可以是绝对路径或者相对路径。

  • 当我们使用 --self-contained-html, 图片也许无法按照预期的加载出来。(这里我试过,是可以正常加载的。

  • 官方文档说图片还可以使用如下格式:

Image formatExample
PNGextra.png(image)
JPEGextra.jpg(image)
SVGextra.svg(image)

但是我亲自尝试过,直接使用extras.image就可以加载上述类型的图片。上述指定格式显得稍有点多余。

而且注意:官方文档都是写的extra.image 或者 extra.svg, extra没有带s,实际示例中有s,实际使用也需要用extras。这里不知道是不是我理解的有问题,还是官方文档笔误,大家注意一下。

我们可以在conftest.py中通过钩子函数pytest_runtest_makereport 来增加这些额外的内容。

import pytest


@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    pytest_html = item.config.pluginmanager.getplugin("html")
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, "extra", [])
    if report.when == "call":
        # always add url to report
        extra.append(pytest_html.extras.url("http://www.example.com/"))
        xfail = hasattr(report, "wasxfail")
        if (report.skipped and xfail) or (report.failed and not xfail):
            # only add additional html on failure
            extra.append(pytest_html.extras.html("<div>Additional HTML</div>"))
        report.extra = extra

示例1

  1. 首先修改我们的用例,让用例产生各种类型的数据,方便看效果。
    在这里插入图片描述

  2. 我们在conftest.py文件中增加如下代码

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    pytest_html = item.config.pluginmanager.getplugin("html")
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, "extra", [])
    if report.when == "call":
        # 增加URL
        extra.append(pytest_html.extras.url("https://www.gitlink.org.cn"))
        # 增加json
        extra.append(pytest_html.extras.json({"name": "pytest"}))
        # 增加plain text
        extra.append(pytest_html.extras.text("这里是xxx自动化测试用例"))
        xfail = hasattr(report, "wasxfail")
        if (report.skipped and xfail) or (report.failed and not xfail):
            # 增加HTML
            extra.append(pytest_html.extras.html(
                "<div style='background-color:red;text-align: center;font-size:16px;color:white;'>这条用例xfail 或者 failed</div>"))
            # 增加图片,指定图片格式和后缀
            extra.append(pytest_html.extras.image("111.gif", mime_type="image/gif", extension="gif"))
            # 增加图片,图片路径是相对路径
            extra.append(pytest_html.extras.image("1.bmp"))
            # 增加图片,图片格式是svg
            # extra.append(pytest_html.extras.image("2.svg"))
            # 增加图片,使用extras指定svg格式添加
            extra.append(pytest_html.extras.svg("2.svg"))
            # 增加图片,图片是一个URL地址
            extra.append(pytest_html.extras.image("https://www.gitlink.org.cn/api/attachments/389903"))
        report.extra = extra

在这里插入图片描述
3. 运行生成报告后如下图所示
在这里插入图片描述

我们还可以给除了html的其他类型来增加name来改变增加内容的标题。

extra.append(pytest_html.extras.text("some string", name="Different title"))

示例2

  1. 修改conftest.py中的pytest_runtest_makereport的内容
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    pytest_html = item.config.pluginmanager.getplugin("html")
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, "extra", [])
    if report.when == "call":
        # 增加URL
        extra.append(pytest_html.extras.url("https://www.gitlink.org.cn", name="gitlink"))
        # 增加json
        extra.append(pytest_html.extras.json({"name": "pytest"}, name="接口响应数据"))
        # 增加plain text
        extra.append(pytest_html.extras.text("这里是xxx自动化测试用例", name="文本"))
        # 注意:实际报告上会直接显示图片,不会有图片的name
        extra.append(pytest_html.extras.image("1.bmp", name="图片"))
        xfail = hasattr(report, "wasxfail")
        if (report.skipped and xfail) or (report.failed and not xfail):
            # 增加HTML
            extra.append(pytest_html.extras.html(
                "<div style='background-color:red;text-align: center;font-size:16px;color:white;'>这条用例xfail 或者 failed</div>"))
        report.extra = extra

在这里插入图片描述

  1. 运行生成报告后如下图所示
    在这里插入图片描述

我们也可以直接在测试方法中将extra当做一个fixture使用,而不使用上述的钩子函数pytest_runtest_makereport

from pytest_html import extras

def test_extra(extra):
    extra.append(extras.text("some string"))

示例3

  1. 在测试函数代码如下:
    注意:原先conftest.py中的pytest_runtest_makereport可以注释掉了。
import pytest
from pytest_html import extras
def test_demo_01(extra):
    # 注意:这个语句不能放在断言后
    extra.append(extras.text("这是一条通过的用例", name="测试通过的文本"))
    assert 1 == 1
def test_demo_02(extra):
    extra.append(extras.json("这是一条失败的用例", name="测试失败的JSON"))
    assert True == False
def test_demo_03(extra):
    # 注意:这个语句不能放在xfail之后
    extra.append(extras.html(
        "<div style='background-color:red;text-align: center;font-size:16px;color:white;'>这条用例xfail 或者 failed</div>"))
    pytest.xfail("这是一条xfail的用例")
def test_demo_04():
    pytest.skip("这条用例跳过")

在这里插入图片描述

  1. 运行生成报告后如下图所示
    在这里插入图片描述

6. 修改结果表

增加description, Time列,移除Links列

  1. 首先修改一下测试方法,给部分测试方法增加文档注释
    在这里插入图片描述

  2. 在conftest.py中增加如下代码

from datetime import datetime
def pytest_html_results_table_header(cells):
    """
    处理结果表的表头
    """
    # 往表格增加一列Description,并且给Description列增加排序
    cells.insert(2, html.th("Description", class_="sortable desc", col="desc"))
    # 往表格增加一列Time,并且给Time列增加排序
    cells.insert(1, html.th("Time", class_="sortable time", col="time"))
    # 移除表格最后一列
    cells.pop()
def pytest_html_results_table_row(report, cells):
    """
    处理结果表的行
    """
    # 往列 Description插入每行的值
    cells.insert(2, html.th(report.description))
    # 往列 Time 插入每行的值
    cells.insert(1, html.th(datetime.utcnow(), class_="col-time"))
    cells.pop()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    # 定义列 Description的值,默认为测试方法的文档注释,如果测试方法没有文档注释,就自定义Description的值
    if str(item.function.__doc__) != "None":
        # 结果表的description列的值 = 测试方法的文档注释
        report.description = str(item.function.__doc__)
    else:
        # 结果表的description列的值 = 自定义的信息
        # 注意:这里可以将测试用例中的用例标题或者描述作为列 Description的值
        report.description = "这里是描述信息"
  1. 运行生成报告后如下图所示
    在这里插入图片描述

测试通过的情况下删除所有的单元格

注意:这种情况下,我们在报告中无法看到通过用例的任何信息。
在conftest.py中增加如下代码:

def pytest_html_results_table_row(report, cells):
    if report.passed:
        del cells[:]

钩子函数pytest_html_results_table_html修改日志输出和其他HTML

在conftest.py中增加如下代码:

from py.xml import html

def pytest_html_results_table_html(report, data):
    if report.passed:
        del data[:]
        data.append(html.div("这条用例通过啦!", class_="empty log"))

运行后产生的报告如下:
在这里插入图片描述

7. 自动收起所有的列

默认情况下,结果表中的所有行都是展开显示的。如下图所示:
在这里插入图片描述

我们可以通过在pytest的配置文件pytest.ini中设置来决定是否展开还是收起。

[pytest]
# 收起结果表中的所有行
render_collapsed = True

重新运行生成报告后如下图所示:
在这里插入图片描述

官方文档这里提出的设置查询参数,没有搞明白怎么设置,有搞明白的,欢迎给我留言~
在这里插入图片描述

8. 设置哪些测试结果可见

官方文档这里提出的设置查询参数,没有搞明白怎么设置,有搞明白的,欢迎给我留言~
在这里插入图片描述

9. 格式化Duration列

默认情况下,Durations列是用得一个格式化的时间戳,使用的是%S.%f %S是秒%f 是毫秒, 是通过duration_formatter 设置的。目前pytest-html是支持所有的格式化指令的。

但是我们可以在conftest.py文件中对Duration列进行格式化设置。

import pytest

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

NOTE: Milliseconds are always displayed with a precision of 2

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:44:49  更:2022-07-03 10:47:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:28:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码