І те й інше.
Детерміновані та недетерміновані тести мають різні випадки використання та різні значення для вашого набору. Як правило, недетермінований не може забезпечити таку ж точність, як детерміновані тестування, що повільно переросло у "недетерміновані тестування не мають значення". Це помилково. Вони можуть бути менш точними, але вони можуть бути і значно ширшими, що має свої переваги.
Візьмемо приклад: ви пишете функцію, яка сортує список цілих чисел. Якими були б детерміновані одиничні тести, які ви знайдете корисними?
- Порожній список
- Список лише з одним елементом
- Список із тим самим елементом
- Список з декількома унікальними елементами
- Список з декількома елементами, деякі з яких є дублікатами
- Список з
NaN
, INT_MIN
іINT_MAX
- Список, який уже частково відсортований
- Список з 1000000000 елементів
І це лише функція сортування! Звичайно, ви можете стверджувати, що деякі з них непотрібні, або що деякі з них можна виключити за допомогою неофіційних міркувань. Але ми інженери, і ми бачили, як неофіційні міркування спалахують перед нами. Ми знаємо, що ми не досить розумні, щоб повністю зрозуміти побудовані системи або повністю зберегти складність в голові. Ось чому ми в першу чергу пишемо тести. Додавання недетермінованого тестування просто говорить про те, що ми не можемо бути достатньо розумними, щоб знати всі хороші тести апріорі. Закинувши напів випадкові дані у свою функцію, ви набагато більше шансів знайти кращий випадок, який ви пропустили.
Звичайно, це не виключає і детермінованого тестування. Недетерміновані тестування допомагають знаходити помилки у величезних місцях програми. Однак, виявивши помилки, вам знадобиться відтворюваний спосіб показати, що ви його виправили. Так:
- Використовуйте недетерміновані тести, щоб знайти помилки у своєму коді.
- Використовуйте детерміновані тести для перевірки виправлень у своєму коді.
Зауважте, що це означає, що багато твердих порад щодо одиничних тестів не обов'язково стосуються недетермінованих тестів. Наприклад, що вони повинні бути швидкими. Тести властивостей низького рівня повинні бути швидкими, але недетермінований тест на зразок "імітувати користувача випадковим чином натисканням кнопок на вашому веб-сайті та переконайтеся, що ви ніколи не отримуєте помилку 500", повинен сприяти всебічності над швидкістю. Просто проведіть такий тест, який виконується незалежно від процесу збирання, щоб це не сповільнило розвиток. Наприклад, запустіть його на власному приватному екрані.