И то и другое.
Детерминированные и недетерминированные тесты имеют разные варианты использования и разные значения для вашего набора. Как правило, недетерминированный не может обеспечить ту же точность, что и детерминированный тест, который постепенно превращается в «недетерминированный тест, не имеющий никакой ценности». Это неверно Они могут быть менее точными, но они также могут быть гораздо шире, что имеет свои преимущества.
Давайте рассмотрим пример: вы пишете функцию, которая сортирует список целых чисел. Какие бы детерминированные юнит-тесты вы бы нашли полезным?
- Пустой список
- Список только с одним элементом
- Список со всеми одинаковыми элементами
- Список с несколькими уникальными элементами
- Список с несколькими элементами, некоторые из которых являются дубликатами
- Список с
NaN
, INT_MIN
иINT_MAX
- Список, который уже частично отсортирован
- Список с 10 000 000 элементов
И это только функция сортировки! Конечно, вы можете утверждать, что некоторые из них не нужны, или что некоторые из них могут быть исключены с помощью неформальных рассуждений. Но мы инженеры, и мы видели неформальные рассуждения, взрывающиеся перед нами. Мы знаем, что мы недостаточно умны, чтобы полностью понимать системы, которые мы построили, или полностью держать сложность в наших головах. Вот почему мы пишем тесты в первую очередь. Добавление недетерминированного тестирования просто говорит о том, что мы не обязательно достаточно умны, чтобы априори знать все хорошие тесты. Добавляя полуслучайные данные в вашу функцию, вы с большей вероятностью найдете пропущенный крайний случай.
Конечно, это не исключает и детерминированного тестирования. Недетерминированное тестирование помогает находить ошибки в огромных рядах программы. Однако, как только вы нашли ошибки, вам нужен воспроизводимый способ показать, что вы их исправили. Так:
- Используйте недетерминированные тесты, чтобы найти ошибки в вашем коде.
- Используйте детерминированные тесты для проверки исправлений в вашем коде.
Обратите внимание, что это означает, что много твердых советов о модульных тестах не обязательно относятся к недетерминированным тестам. Например, что они должны быть быстрыми. Низкоуровневые тесты свойств должны быть быстрыми, но недетерминированный тест, такой как «симуляция случайного нажатия пользователем кнопок на вашем веб-сайте и проверка того, что вы никогда не получите ошибку 500», должен способствовать полноте над скоростью. Просто запустите такой тест независимо от процесса сборки, чтобы он не замедлял разработку. Например, запустите его в своем личном инсталляционном окне.