跳转到主要内容

pytest的快照测试插件。

项目描述

PyPI version Python versions CI Status Coverage

pytest的快照测试插件。

此库受jest的快照测试的启发。快照测试可用于测试表达式的值是否意外更改。快照测试的优势包括

  • 它们很容易创建。

  • 当测试的预期值更改时,它们很容易更新。

当表达式的预期值更改时,不需要手动更新测试,开发者只需

  1. 运行 pytest --snapshot-update 来更新快照测试

  2. 验证快照文件是否包含新的预期结果

  3. 将快照更改提交到版本控制

特性

  • 字符串和字节的快照测试

  • (可选嵌套的)字符串和字节集合的快照测试

  • 完全控制快照文件的路径和内容

需求

安装

您可以通过pipPyPI安装“pytest-snapshot”。

$ pip install pytest-snapshot

用法

assert_match

一个经典的等式测试看起来像这样

def test_function_output():
    assert foo('function input') == 'expected result'

可以使用快照测试重写为

def test_function_output_with_snapshot(snapshot):
    snapshot.snapshot_dir = 'snapshots'  # This line is optional.
    snapshot.assert_match(foo('function input'), 'foo_output.txt')

测试的作者应该

  1. 运行pytest --snapshot-update来生成包含foo()输出的快照文件snapshots/foo_output.txt

  2. 验证快照文件的内容是否有效。

  3. 将其提交到版本控制。

现在,每次运行测试时,它都会断言foo()的输出等于快照。

如果foo()的行为发生变化,测试开始失败怎么办?

在第一个例子中,开发人员需要手动更新test_function_output中的预期结果。如果预期结果很大或有多个测试,这可能会很繁琐。

在第二个例子中,开发人员只需

  1. 运行pytest --snapshot-update

  2. 验证快照文件是否包含新的预期结果

  3. 将其提交到版本控制。

快照测试可用于值是字符串或字节的表达式。对于其他类型,您应首先创建值的人类可读表示。例如,为了测试可序列化为JSON的值,您可以将其转换为JSON,或者更优地使用PyYAML将其转换为更易读的yaml格式。

snapshot.assert_match(yaml.dump(foo()), 'foo_output.yml')

assert_match_dir

当测试值的集合时,assert_match_dir非常有用。它将值的集合保存为一个包含快照文件的目录。assert_match_dir接受从文件名到值的字典。字典也可以嵌套,以创建包含快照文件的嵌套目录。

例如,以下代码创建了包含文件john.jsonjane.json的目录snapshots/people

def test_something(snapshot):
    snapshot.snapshot_dir = 'snapshots'
    snapshot.assert_match_dir({
        'john.json': '{"first name": "John", "last name": "Doe"}',
        'jane.json': '{"first name": "Jane", "last name": "Doe"}',
    }, 'people')

当运行pytest --snapshot-update时,快照文件将根据需要添加、更新或删除。作为安全措施,只有在使用--allow-snapshot-deletion标志时,才会删除快照。

常见用法

创建快照测试的一个快速方法是创建一个包含许多测试用例目录的目录。在每个测试用例中,添加包含您要测试的函数输入的文件。例如

test_cases
    case1
        input.json
    case2
        input.json
    ...

接下来,添加一个对所有测试用例目录进行参数化的测试。测试应该

  • 从测试用例目录读取输入

  • 调用要测试的函数

  • 将结果快照到测试用例目录

import json
import os

import pytest
import yaml
from pathlib import Path


def json_to_yaml(json_string):
    obj = json.loads(json_string)
    return yaml.dump(obj, indent=2)


@pytest.mark.parametrize('case_dir', list(Path('test_cases').iterdir()))
def test_json(case_dir, snapshot):
    # Read input files from the case directory.
    input_json = case_dir.joinpath('input.json').read_text()

    # Call the tested function.
    output_yaml = json_to_yaml(input_json)

    # Snapshot the return value.
    snapshot.snapshot_dir = case_dir
    snapshot.assert_match(output_yaml, 'output.yml')

现在,我们可以运行pytest --snapshot-update为每个测试用例创建一个output.yml快照。如果后来我们决定修改测试的函数行为,我们可以使用另一个pytest --snapshot-update来修复测试用例。

类似包

另一个可用于快照测试的Python包是snapshottest。虽然这个包和snapshottest执行相同的角色,但有一些区别。

使用pytest-snapshot

  • 每个快照都保存到单独的文件中。

  • 快照文件的路径可以完全自定义。

  • 对象到快照的序列化可以完全自定义(库不进行序列化)。

这允许用户在代码仓库中将快照组织在最具可读性和逻辑性的位置。这非常有好处,因为用户在开发和代码审查期间将多次查看快照。

贡献

欢迎贡献。在贡献之前,请与我讨论变更。我希望保持此插件灵活,不对用户强制任何项目布局。

可以使用 toxpython -m pytest 运行测试。注意,当使用 --assert=plain 运行时,测试套件无法通过。

许可证

在 MIT 许可证的条款下分发,“pytest-snapshot”是免费和开源软件。

问题

如果您遇到任何问题,请附上详细描述提交问题

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

pytest-snapshot-0.9.0.tar.gz (19.9 kB 查看哈希值)

上传时间:

构建分布

pytest_snapshot-0.9.0-py3-none-any.whl (10.7 kB 查看哈希值)

上传时间: Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面