Де слід провести межу між одиничними тестами та тестами інтеграції? Чи повинні вони бути окремими?


11

У мене є невелика рамка MVC, над якою я працював. Це кодова база, безумовно, не велика, але це не просто пара занять. Нарешті я вирішив скористатися і почав писати тести на це (так, я знаю, я мав би це робити весь час, але API до цього часу був надзвичайно нестабільним)

У будь-якому разі, мій план - зробити його надзвичайно простим для тестування, включаючи тести інтеграції. Приклад тесту на інтеграцію проходитиме приблизно за цими напрямками:

Підроблений об’єкт запиту HTTP -> FV Framework MVC -> HTTP-об'єкт відповіді -> перевірте правильність відповіді

Оскільки це все можливо без будь-яких державних чи спеціальних інструментів (автоматизація браузера тощо), я фактично міг би це зробити з легкістю за допомогою звичайних тестових фреймворків (я використовую NUnit).

Тепер велике питання. Де саме слід провести межу між одиничними тестами та тестами інтеграції? Чи повинен я перевіряти один раз одночасно (наскільки це можливо) одиничні тести? Також, чи слід інтегрувати тести інтеграції в той самий проект тестування, що і мій тестовий проект?


Тест на інтеграцію включає тестування більш ніж однієї реальної реалізації ваших компонентів разом (фактична реалізація означає відсутність макетів).
Kemoda

1
Це питання стосується тестування та забезпечення якості. Тому я б запропонував перенести його на відповідний сайт, SQA на Stack Exchange ( sqa.stackexchange.com )
dzieciou

@dzieciou навіть не знав, що існує!
Граф

Відповіді:


19

Інтеграція та одиничні тести

Ви повинні тримати тести своїх одиниць і ваші інтеграційні тести повністю відокремленими. Ваші одиничні тести повинні перевіряти лише одне і одне, а також повністю ізолювати решту системи. Одиниця визначена непросто, але вона зазвичай зводиться до методу чи функції.

Є сенс мати тести для кожного блоку, щоб ви знали, що їх алгоритми реалізовані правильно, і ви відразу знаєте, що пішло не так, якщо реалізація є недоліком.

Оскільки ви протестуєте повну ізоляцію під час тестування одиниць, ви використовуєте заглушки та знущаються над об'єктами, щоб вести себе як і решта вашої програми. Тут проводяться інтеграційні тести. Тестування всіх одиниць ізольовано, але вам потрібно знати, чи реально вони працюють разом.

Це означає знати, чи справді модель зберігається в базі даних чи дійсно попередження видається після відмови алгоритму X.

Тестово-розвинений розвиток

Якщо зробити це крок назад і подивитися на тест-керовану розробку (TDD), слід врахувати кілька речей.

  1. Ви пишете свій тест на одиницю, перш ніж фактично написати код, який змушує його пройти.
  2. Ви зробите тестовий пропуск, напишіть достатньо коду для цього.
  3. Тепер, коли тест проходить, настав час зробити крок назад. Чи є що-небудь для рефактора з цією новою функціональністю? Це можна зробити безпечно, оскільки все охоплене тестами.

Інтеграція перша - Інтеграція остання

Інтеграційні тести вписуються в цей цикл TDD двома способами. Я знаю людей, які люблять писати їх заздалегідь. Вони називають тест на інтеграцію тестом "кінець в кінці" і визначають тест "від кінця до кінця" як тест, який повністю випробовує весь шлях корисної коробки (подумайте про налаштування програми, завантаження програми, перехід до контролера, виконання його, перевірка результату, результату тощо ...). Потім вони починають свій перший тест на одиницю, змушують його пройти, додати другий, зробити його проходження тощо. Повільно все більше і більше частин тесту на інтеграцію проходять також до тих пір, поки функція не буде закінчена.

Інший стиль - це побудова тестування одиничних можливостей за допомогою тестування одиниць та додавання тестів інтеграції, які вважаються необхідними після цього. Велика різниця між цими двома полягає в тому, що у випадку тесту на інтеграцію спочатку ви змушені думати про розробку програми. Цей вид не погоджується з припущенням, що TDD стосується дизайну додатків стільки ж, скільки щодо тестування.

Практика

У мене на роботі всі наші тести в одному проекті. Однак існують різні групи. Інструмент безперервної інтеграції спочатку виконує те, що позначено як одиничні тести. Тільки якщо вони досягли успіху, також виконуються повільніші (оскільки вони роблять реальні запити, використовують реальні бази даних тощо) інтеграційні тести.

Ми, до речі, використовуємо один тестовий файл для одного класу.

Пропоноване читання

  1. Зростаюче об’єктно-орієнтоване програмне забезпечення, керується тестами Ця книга є надзвичайно хорошим прикладом першої методології тесту інтеграції
  2. Мистецтво одиничного тестування, з прикладами в dot.net Про тестування одиниць, із прикладами в dot.net: D Дуже хороша книга про принципи, що стоять за тестуванням одиниці.
  3. Роберт К. Мартін на TDD (Безкоштовні статті): Читайте перші два статті, які він також пов’язував.

2

У будь-якій стратегії тестування важливо тестове покриття - тобто можливість показати, що вся функціональність перевіряється.

Я загалом, і якщо ви не маєте конкретних вимог протилежного (наприклад, DO178 рівня A, IEC61508 SIL 4 тощо), що, як видається, не відповідає вашій ситуації, тоді, якщо ви можете перевірити повну функцію класу або модуля (і продемонструйте, що у вас є) на системному рівні, тоді тестування на рівні системи є адекватним. І так далі вниз. Тестування приладів необхідне лише тоді, коли ви далі не покривали тестування.

Де саме слід провести межу між одиничними тестами та тестами інтеграції?

Зважаючи на тест на інтеграцію, як правило, простіше, швидше і дешевше, проведіть лінію, наскільки ви можете ...

Чи повинен я перевіряти один раз одночасно (наскільки це можливо) одиничні тести?

Це залежить від обсягу, знову ж таки ... за визначенням, одиничний тест - це тестування однієї одиниці. Але якщо ви можете повністю протестувати повний модуль за один раз, то, якщо хочете, зробіть це. Ви фактично виконуєте кілька одиничних тестів за один удар.

Також, чи слід інтегрувати тести інтеграції в той самий проект тестування, що і мій тестовий проект?

Немає принципових причин, чому б ні ... якщо тільки випробування вищого рівня не проводиться незалежним тестером, тоді вам слід видавати лише виконуваний і мінімальний інструментарій.


2
Я не бачу, як тестування інтеграції простіше, швидше або дешевше. Для мене це навпаки всіх 3. І інтеграційні тести, як правило, більш крихкі, ніж одиничні тести
Earlz

0

Коли у мене є невеликі проекти, я просто перекладаю всі тести в один і той же проект. Оскільки більш великий проект матиме ці розколи, я просто гарантую, що можна було б розірвати їх, якщо це буде необхідно.

За допомогою одиничних тестів я зазвичай тестую лише один клас (SUT) у файлі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.