Если вы хоть раз тратили полдня на то, чтобы вручную переписывать огромные JSON-словари в тестах после мелкого изменения в API — этот инструмент для вас.
Команда Pydantic вовсю использует inline-snapshot, чтобы навсегда забыть о ручном обновлении ассертов.
Вместо того чтобы придумывать «ожидаемый результат», вы просто пишете:
from inline_snapshot import snapshot
def test_api():
data = fetch_data()
assert data == snapshot({}) # Сначала оставляем пустым
Теперь запустите:
pytest --inline-snapshot=fix.Библиотека сама вставит актуальные данные прямо в ваш .py файл! Теперь ваш тест выглядит так:
def test_api():
data = fetch_data()
assert data == snapshot({
"id": 123,
"status": "active",
"name": "Pydantic Fan"
})
😎 Продвинутые хаки для профи
1. Динамические данные (dirty-equals)
Если в ответе есть поля, которые меняются при каждом запуске (ID, таймстампы), используйте
dirty-equals. Они идеально работают в связке с инлайн-снимками:
from dirty_equals import IsInt, IsNow
assert user_data == snapshot({
"id": IsInt(), # Снепшот запомнит условие, а не число
"created_at": IsNow(), # Проверит время, близкое к текущему
"status": "active"
})
2. Нормализация данных
Чтобы тесты не падали из-за того, что объект — это не словарь, а инстанс класса, используйте Pydantic для конвертации:
from pydantic import TypeAdapter
_adapter = TypeAdapter(object)
# Конвертируем всё в обычные dict/list перед сравнением
assert _adapter.dump_python(user_model) == snapshot(...)
🔗 Попробовать: https://clc.to/RHb6SA
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
