
Hypothesis: тесты, которые сами ищут контрпримеры к вашему коду
badcasedaily1 25 минут назад Hypothesis: тесты, которые сами ищут контрпримеры к вашему коду Средний 9 мин 1.6K Блог компании OTUS Тестирование IT-систем * Open source * Python * Туториал Привет, Хабр! Тестирование...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: badcasedaily1 25 минут назад Hypothesis: тесты, которые сами ищут контрпримеры к вашему коду Средний 9 мин 1. 6K Блог компании OTUS Тестирование IT-систем * Open source * Python * Туториал Привет, Хабр! Тестирование свойств придумали в конце девяностых: Коэн Клаессен и Джон Хьюз собрали для Haskell библиотеку QuickCheck и описали её в статье на ICFP 2000.
Идея была вывернута наизнанку относительно привычной: разработчик не перечисляет примеры входов и ожидаемых ответов, а формулирует утверждение, которое обязано выполняться для любого корректного входа. Примеры дальше придумывает библиотека, сотнями, и старается придумать такие, на которых утверждение сломается. С тех пор подход разошёлся почти по всем языкам: fast‑check в TypeScript, proptest в Rust, ScalaCheck, PropEr в Erlang.
Технические детали
В Python эталоном стал Hypothesis Дэвида МакАйвера, который живёт с 2013 года и давно перестал быть экзотикой: он стоит в тестовой инфраструктуре CPython, NumPy, SciPy, Pandas, Django. Свежий и довольно убедительный аргумент в его пользу пришёл со стороны, откуда не ждали. В работе «Agentic Property‑Based Testing» LLM‑агента научили читать сигнатуры, докстринги и код, выводить из этого свойства и писать по ним тесты на Hypothesis.
Его прогнали по сотне популярных Python‑пакетов, он выдал 984 отчёта о багах, из которых после ручной проверки 56% оказались настоящими багами, а 32% — такими, которые имеет смысл нести мейнтейнерам. Часть патчей, включая правку в NumPy, приняли. Речь про библиотеки, которые тестируют десятилетиями тысячи людей.
Разница на одной функцииОбычный тест сортировки выглядит так:def test_sort_examples(): assert my_sort() == assert my_sort() == assert my_sort() == assert my_sort() == Четыре примера проверены, четыре ответа зафиксированы. Про список из десяти тысяч элементов тест не знает ничего. Про список из одинаковых чисел, про огромные int, про NaN среди float — тоже ничего, потому что таких примеров никто не написал.
Отраслевые последствия
Тот же тест как свойство:from hypothesis import given, strategies as st @given(st. integers())) def test_sort(lst): result = my_sort(lst) assert len(result) == len(lst) # ничего не потеряли assert sorted(result) == sorted(lst) # состав элементов тот же assert all(a <= b for a, b in zip(result, result)) # порядок неубывающийHypothesis сгенерирует сотню списков: пустые, из одного элемента, с повторами, с граничными значениями int, с отрицательными числами. Генератор не просто кидает случайные данные, он целенаправленно тянется к краям диапазонов, потому что именно там обычно живут баги.
Обратите внимание на второе утверждение.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





