Це важлива відмінність, але, на жаль, ви ніколи не знайдете згоди. Проблема полягає в тому, що більшість розробників визначають це з власної точки зору. Це дуже схоже на дебати щодо Плутона. (Якби воно було ближче до Сонця, чи було б це планетою?)
Тестування одиниць легко визначити. Він тестує CUT ( Code Under Test ) і більше нічого. (Ну, як мінімум іншого.) Це означає глузування, підробки та світильники.
На іншому кінці спектру є те, що багато хто називає тестуванням системної інтеграції . Це тестування, наскільки це можливо, але все ж шукає помилок у власній CUT.
А як щодо величезних просторів між?
- Наприклад, що робити, якщо ви протестуєте трохи більше ніж CUT? Що робити, якщо ви включите функцію Фібоначчі, замість того, щоб використовувати кріплення, які ви вводили? Я б назвав це функціональним тестуванням , але світ зі мною не погоджується.
- Що робити, якщо ви включите
time()
або rand()
? Або що робити, якщо ви телефонуєте http://google.com
? Я б назвав це тестування системи , але знову ж таки, я один.
Чому це має значення? Тому що тести на систему недостовірні. Вони необхідні, але іноді вони можуть виходити з ладу з незалежних від вас причин. З іншого боку, функціональні тести завжди повинні проходити, а не провалюватися випадковим чином; якщо вони швидкі, вони також можуть бути використані з самого початку для використання тестово керованої розробки без написання занадто багато тестів для вашої внутрішньої реалізації. Іншими словами, я думаю, що одиничні тести можуть бути більшими проблемами, ніж вони варті, і в мене хороша компанія .
Я поставив тести на 3 осі з усіма їх нулями при одиничному тестуванні :
- Функціональне тестування: використання реального коду все глибше і глибше стека викликів.
- Інтеграція тестування: всі вище і вище вгору ваш виклик в стек; Іншими словами, тестуючи свій CUT, запустивши код, який би його використовував.
- Тестування системи: все більше і більше повторюваних операцій (планувальник O / S, годинник, мережа тощо )
Тест може легко пройти всі 3, в різній мірі.