Тестирование на свойствах

Тестирование на свойствах формулирует правило, которому код обязан удовлетворять для всех допустимых входов, и позволяет фреймворку сгенерировать множество входов и попытаться его нарушить. Вместо утверждения, что разворот [1,2,3] даёт [3,2,1], вы утверждаете, что двойной разворот любого списка возвращает исходный; вместо трёх примеров для парсера — что разбор вывода вашего сериализатора всегда воспроизводит вход. Генератор исследует значения, которые человек не догадался бы написать: пустые коллекции, повторяющиеся ключи, юникод, экстремальные числа, глубоко вложенные структуры, — а именно там живёт большинство настоящих дефектов. Когда случай падает, хороший фреймворк его сжимает: многократно упрощает падающий вход, пока не найдёт наименьший, который всё ещё падает, — и отчёт приходит в виде списка из двух элементов, а не тысячеэлементного монстра, который всё запустил. Этот сжатый случай затем стоит добавить обычным примерным тестом, потому что он ещё вернётся. Трудность в выборе свойств, и есть повторяющиеся формы, которые можно заимствовать. Круговой путь: закодировать и раскодировать возвращает вход. Инвариант: отсортированный вывод содержит тот же мультимножество элементов, что и вход. Оракул: быстрая реализация согласуется с медленной, очевидно верной. Идемпотентность: двойное применение операции равно однократному. Тесты на свойствах не заменяют примерные — пример читаемо документирует намерение, — а из-за недетерминизма стоит хранить фиксированное зерно и запись падения, чтобы красную сборку можно было воспроизвести.

Похожие термины

Ещё термины: Инструменты разработки