глоссарий

Property-based testing

Property-based testing

Property-based testing — подход к тестированию, при котором вместо набора конкретных примеров вы задаёте общие свойства функции, а специальный инструмент сам подбирает случайные входные данные. Например, свойство «обратная строка, применённая дважды, возвращает исходную» — фреймворк генерирует тысячи произвольных строк и убеждается, что оно верно для всех.

Зачем это важно? Обычные юнит-тесты проверяют несколько заранее выбранных значений, но реальный код сталкивается с миллионами неожиданных комбинаций. Свойственная человеку привычка подбирать «удобные» примеры часто пропускает краевые случаи: пустые списки, отрицательные числа, огромные строки. Property-based testing смещает фокус с частного на общее, заставляя думать о гарантиях, а не о конкретных цифрах, и автоматически находит ошибки, которые трудно предусмотреть.

Интуитивно это работает так: вы описываете инвариант — условие, которое должно выполняться всегда. Инструмент (например, Hypothesis для Python или QuickCheck для Haskell) генерирует случайные данные и проверяет свойство. Если тест провалился, фреймворк пытается «ужать» входные данные до минимального примера, всё ещё вызывающего ошибку, — так становится легко понять, что именно пошло не так.

Практический пример: функция деления с остатком. Свойство может быть таким: для любых целых a и положительного b выполняется a == b * (a // b) + a % b, а остаток меньше b. Тестировщик сгенерирует тысячи пар a и b, включая отрицательные a, нули и большие числа, и мгновенно докажет корректность алгоритма или найдёт сбой. Вручную сделать это невозможно.

Главный вывод: property-based testing — не замена классическим проверкам, а мощное дополнение, которое переводит тестирование с уровня «все нужные примеры сработали» на уровень «свойство выполняется для всех возможных случаев». Оно помогает писать более надёжные программы и глубже понимать их логику.