Запись архива

Wrapture: библиотека для тестирования и трассировки Python-кода, написанная ИИ под руководством эксперта

Грэм Дамплтон, создатель wrapt и mod_wsgi, представил Wrapture — библиотеку, расширяющую идеи «обезьяньего патчинга» для тестирования и трассировки. Весь код написан ИИ-ассистентом, но под строгим контролем автора.

Пример конфигурации трассировки Wrapture с секциями capture, observe и sink
Пример конфигурации трассировки Wrapture с секциями capture, observe и sink
Codex CLI screenshot.png | by OpenAI / Codex CLI GitHub repository | wikimedia_commons | Apache License 2.0

Грэм Дамплтон, известный по библиотеке wrapt, модулю mod_wsgi и Python-агенту New Relic, представил новый проект — Wrapture. Это библиотека, которая расширяет концепцию «обезьяньего патчинга» (monkey-patching) до инструмента для тестирования и трассировки. Примечательно, что весь код и документация Wrapture были написаны ИИ-ассистентом, работавшим под руководством автора.

Wrapture позволяет обернуть любую функцию или метод так, чтобы отслеживать все обращения к ним или переопределять возвращаемые значения. Библиотека позиционируется как альтернатива unittest.mock и одновременно как способ внедрения трассировки в существующие проекты.

«Прикрепление наблюдения к коду, который вы не контролируете, запись того, что через него проходит, и выполнение этого без нарушения работы наблюдаемой программы — это проблема, о которой я никогда не переставал думать», — пишет Дамплтон в анонсе.

Ключевые факты

Параметр Значение
Автор Грэм Дамплтон (wrapt, mod_wsgi, New Relic Python agent)
Назначение Тестирование и трассировка Python-кода через обёртывание функций
Поддержка OpenTelemetry Встроенная, включая конфигурационный механизм
Метод создания Весь код написан ИИ-ассистентом под руководством автора
Статус проекта Молодой (несколько недель), активно развивается

Как это работает

Библиотека предоставляет простой API для подмены возвращаемых значений и модификации результатов. В базовом примере тестирования с Wrapture вызов метода charge у класса Gateway подменяется на возврат фиктивного ответа:

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(…), что позволяет изолированно тестировать сервисный слой.

Трассировка через конфигурацию

Отдельного внимания заслуживает поддержка OpenTelemetry и механизм конфигурационной трассировки. Вместо программного добавления обёрток можно описать правила в TOML-файле:

capture = “summary”

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

[[sink]]
type = “jsonlines”
path = “trace.jsonl”

Этот подход позволяет добавить трассировку в существующий проект без изменения исходного кода — достаточно указать, какие классы и методы отслеживать, и куда сохранять результаты.

Проект как эксперимент с ИИ

Дамплтон подчёркивает, что Wrapture стал его первой крупной попыткой полностью агентно-ориентированной разработки. Каждая строка кода и документации была написана ИИ-ассистентом под его руководством. При этом автор проводит чёткую границу между таким подходом и «vibe coding»:

«Это не было виб-кодингом, где одноразовый промпт порождает кучу сгенерированного кода, а человек надеется на лучшее, потому что у него не хватает знаний, чтобы оценить результат. Виб-кодинг заслужил свою плохую репутацию. Я тщательно спроектировал Wrapture с самого начала. Я провёл много времени в этом конкретном уголке Python и точно знал, каким должен быть результат. ИИ был средством его производства, а не источником дизайна».

Это важное разграничение для разработчиков, рассматривающих использование ИИ в программировании. Дамплтон показывает, что глубокое понимание предметной области остаётся критическим фактором — ИИ ускоряет реализацию, но не заменяет архитектурное проектирование.

Что это значит для разработчиков

Wrapture предлагает несколько практических преимуществ:

Упрощение тестирования. Библиотека позволяет создавать заглушки (stubs) и моки без изучения unittest.mock, с более декларативным синтаксисом.

Трассировка без вторжения. Конфигурационный подход делает добавление observability в существующие проекты делом нескольких строк TOML.

OpenTelemetry из коробки. Интеграция с популярным стандартом сбора телеметрии упрощает мониторинг микросервисов.

Потенциал для CI/CD. Возможность переопределять поведение методов в тестовом окружении может пригодиться при интеграционном тестировании.

Проект остаётся молодым — ему всего несколько недель. Полная документация доступна на сайте библиотеки. Дамплтон также опубликовал пост о модульном тестировании с Wrapture, где демонстрирует дополнительные паттерны.

Источник: Simon Willison, «Introducing wrapture»