Simon Willison · 博客

呵

推出 wrapture

Introducing wrapture

二〇二六年九月一日 · 英文原文

Graham Dumpleton(wrapt、mod_wsgi 及 New Relic Python agent 作者)发布新项目 Wrapture,将 monkeypatching 思想扩展至测试与追踪。该库支持包装任意函数或方法以追踪访问或覆盖返回值,可作为 unittest.mock 替代方案,并内置 OpenTelemetry 支持及基于 TOML 配置的追踪机制。项目仅数周历史,全部代码与文档由 AI 助手在作者指导下生成,属 agent 驱动开发。后续文章展示其单元测试模式,包括 stub 与结果转换示例。

介绍 wrapture 来自 Graham Dumpleton 的新作品(他以 wrapt、mod_wsgi 和 New Relic 的 Python agent 闻名),他将 Wrapture 描述为从 wrapt 中汲取 monkeypatching 思想,并将其扩展应用于测试和追踪。Wrapture(完整文档在此)使得包装任何函数或方法变得简单,从而可以追踪所有访问,或覆盖以返回不同的值。它既可作为 unittest.mock 的替代方案,也可用于对现有项目实现追踪:将观察附加到你无法控制的代码上,记录流经它的内容,并且不干扰被观察的程序——这是我从未真正停止思考的问题。Wrapture 包含 OpenTelemetry 支持,甚至有一种完全基于配置的机制来为现有 Python 项目添加追踪,看起来像这样:

capture = "summary"

[[observe]]
target = "domain:Calculator"
name = ["outer", "inner"]

[[sink]]
type = "jsonlines"
path = "trace.jsonl"

这仍是一个非常年轻的项目——只有几周历史——但已经有了一个非常有前景的开端。有趣的是,这也是 Graham 首次尝试完全由 agent 驱动的大型项目:wrapture 中的每一行代码和文档都是由 AI 助手在我的指导下编写的。我想对此坦诚相告,同样坦诚地说明它不是什么。这不是 vibe coding,那种一次性 prompt 生成一堆代码,而驱动者因缺乏判断能力而只能寄希望于最好的结果。Vibe coding 已经赢得了它的坏名声。我从一开始就仔细设计了 wrapture。我在 Python 的这个特定领域花了很长时间,确切知道结果需要是什么,而 AI 是产生它的手段,而非设计的来源。

在后续文章《使用 wrapture 进行单元测试》中,Graham 展示了这个新库支持的测试模式:

def test_stub_with_wrapture():
    with wrapture.binding(Gateway, "charge").on_call.returns({"id": "stub", "amount": 0}):
        assert OrderService().place(500)["id"] == "stub"

以及这个简洁的示例,展示了一个调用然后修改原始方法返回值的测试:

def test_pinned_result_with_wrapture():
    charge = wrapture.binding(Gateway, "charge")
    charge.on_call.transforms_result(lambda r: {**r, "id": "ch_TEST"})
    with charge:
        assert OrderService().place(500) == {"id": "ch_TEST", "amount": 500}

(在这两个示例中,OrderService().place(...) 方法调用 Gateway().charge(...)。)

标签:graham-dumpleton、monkey-patching、python、testing、pytest、observability、ai-assisted-programming、agentic-engineering、opentelemetry

译自 Simon Willison · 博客 · 录于 二〇二六年九月一日