ApprovalTests.Python:用快照对比做测试验证
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项目做集成验证也很方便。

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 特别适合以下情况:
- 测试输出是一段长文本或复杂数据结构,肉眼比对费时
- 需要多人协作确认预期输出,diff 工具比控制台更适合沟通
- 回归测试中需要检测任何细微的格式变化
目前项目支持 Python 3.10 到 3.14,核心依赖只有 pytest 和 empty-files。如果只需要基础功能,还可以用更精简的 approvaltests_minimal。
一点看法
ApprovalTests 208 个 Star,在开源测试工具里不算高,但这个思路很成熟。golden master 测试在数据转换、代码生成、模板渲染等场景已经广泛应用。它的优势在于把"预期输出是什么"这个问题交给了 diff 工具和人类判断,而不是把预期结果硬编码在测试代码里。
如果你正在处理复杂输出的测试验证,这个库值得一看。
渲染等场景已经广泛应用。它的优势在于把"预期输出是什么"这个问题交给了 diff 工具和人类判断,而不是把预期结果硬编码在测试代码里。
如果你正在处理复杂输出的测试验证,这个库值得一看。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)