Proptest

Links:

Proptest - это инструмент для тестирования на основе свойств (property-based testing). Он не проверяет память и не следит за выполнением кода. Вместо этого он автоматически генерирует тысячи случайных входных данных для твоей функции и проверяет, выполняются ли заданные тобой правила.

Пример работы

use proptest::prelude::*;

// Функция, которая должна работать для любых чисел
fn divide(a: i32, b: i32) -> i32 {
    a / b  // Ой! А если b = 0? Будет паника!
}

// Пишем свойство: "при любых a и b (где b != 0) деление работает"
proptest! {
    #[test]
    fn test_division_doesnt_panic(a: i32, b in 0..1000) {
        let result = divide(a, b);
        prop_assert!(result.is_finite());
    }
}

Для нахождения каких проблем нужен Proptest?

Тип проблемыПример
Крайние случаиДеление на ноль, выход за границы массива
Неочевидные багиФункция работает для 1, 2, 3, но ломается на 127 из-за переполнения
Нарушение инвариантов“После сортировки длина массива не изменилась”
Алгоритмические ошибки“Если я зашифрую и расшифрую — получится исходное сообщение”
РегрессииСтарый код работал для всех чисел, новый — нет