ApprovalTests.Python:用快照对比做测试验证

ApprovalTests 是一个开源的断言验证库,它的 Python 版本 approvaltests 已有 208 个 Star。这个库解决的问题很具体:当测试结果是一段长字符串、一个复杂对象或一大段输出时,传统的 assertEqual 很难快速定位差异。

正文顶部截图

核心机制:快照对比

ApprovalTests 的工作流程基于 golden master 模式。第一次运行测试时,它会保存当前输出作为基准快照。后续运行中,如果输出与快照不同,工具会自动调用你配置的 diff 工具,把差异直观呈现出来。

这个思路适用于很多场景:API 响应的 JSON 结构、HTML 页面渲染结果、日志输出、命令行输出等。只要输出内容固定且可预期,ApprovalTests 都能接管验证工作。

安装很简单:

pip install approvaltests

三种使用方式

ApprovalTests.Python 覆盖了 Python 生态主流的测试框架。

pytest 用户可以直接安装 pytest-approvaltests 插件:

from approvaltests.approvals import verify


def test_simple() -> None:
    result = "Hello ApprovalTests"
    verify(result)

运行测试时指定 reporter,比如 pytest --approvaltests-use-reporter='PythonNative'

unittest 用户不需要额外插件:

import unittest

from approvaltests.approvals import verify


class GettingStartedTest(unittest.TestCase):
    def test_simple(self) -> None:
        verify("Hello ApprovalTests")

行为与 pytest 版本一致。

命令行调用支持从其他语言栈通过 subprocess 调用:

python -m approvaltests --test-id hello --received "hello world!"

这对于非Python项目做集成验证也很方便。

README区域截图

Reporter 机制

Reporter 是 ApprovalTests 的核心组件,负责在测试失败时展示差异。库内置了 Linux、macOS、Windows 的常用 diff 工具支持,比如 Beyond Compare、WinMerge 等。

你也可以通过 GenericDiffReporterFactory 自定义 reporter,或者加载自己的 JSON 配置文件:

import unittest

from approvaltests.approvals import verify
from approvaltests.reporters.generic_diff_reporter_factory import GenericDiffReporterFactory


class GettingStartedTest(unittest.TestCase):
    def setUp(self):
        factory = GenericDiffReporterFactory()
        factory.load('myreporters.json')
        self.reporter = factory.get_first_working()

    def test_simple(self):
        verify('Hello', self.reporter)

所有 verify...() 函数都接受 options 参数来指定 reporter。

适用场景

ApprovalTests 特别适合以下情况:

  1. 测试输出是一段长文本或复杂数据结构,肉眼比对费时
  2. 需要多人协作确认预期输出,diff 工具比控制台更适合沟通
  3. 回归测试中需要检测任何细微的格式变化

目前项目支持 Python 3.10 到 3.14,核心依赖只有 pytest 和 empty-files。如果只需要基础功能,还可以用更精简的 approvaltests_minimal

一点看法

ApprovalTests 208 个 Star,在开源测试工具里不算高,但这个思路很成熟。golden master 测试在数据转换、代码生成、模板渲染等场景已经广泛应用。它的优势在于把"预期输出是什么"这个问题交给了 diff 工具和人类判断,而不是把预期结果硬编码在测试代码里。

如果你正在处理复杂输出的测试验证,这个库值得一看。

渲染等场景已经广泛应用。它的优势在于把"预期输出是什么"这个问题交给了 diff 工具和人类判断,而不是把预期结果硬编码在测试代码里。

如果你正在处理复杂输出的测试验证,这个库值得一看。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐