Коли я повинен використовувати макетні об'єкти?


14

Я читав багато речей про TDD, але все ще сумніваюся. Наприклад, у мене є такі діаграми класів:

введіть тут опис зображення

Це простий приклад, просто дізнатися про TDD та знущатися над об’єктами.

Який тест я повинен написати першим? Продукт , потім лінія та остання, замовлення ? Якщо я це роблю, чи слід використовувати лінію та товар для тестування замовлення чи слід використовувати макети об'єктів? Коли я повинен використовувати макетні об’єкти? Чи варто використовувати UML з XP та TDD?

Я ще не розумію цих речей.

Відповіді:


10

Судячи з діаграми, продукт - це німий клас даних, не має функціональних можливостей для тестування. Тож я би почав писати тести (і реалізовувати, стиль TDD) спочатку рядка, а потім замовлення, вгору по сходах залежності. Зазвичай доцільно пройти випробування класів нижчого рівня перед початком роботи над класами вищого рівня (тобто залежать від нижчого рівня). Це робить вилов помилок більш ефективним.

Чи потрібно використовувати макетні об’єкти, залежить від фактичних залежностей тестованого класу. Якщо це прості класи, які ви можете легко інсталювати та налаштувати з будь-якими потрібними даними / станом, необхідними для ваших тестів, вам не потрібно глузувати. (Мабуть, це стосується вашої прикладної конструкції тут.) Однак, якщо будь-яку із залежностей важко ініціалізувати / сама велика залежність / має небажані побічні ефекти / залежить від зовнішнього ресурсу, такого як БД, то це має сенс використовувати замість цього макетний об’єкт.


Як я вже говорив, це був простий сценарій, просто дізнатися про TDD та Mock об'єкти ... Чудова відповідь, дякую. А що з UML? Чи слід цього уникати?

@thomas, не потрібно уникати UML, це не суперечить TDD. UML дуже хороший для візуалізації / спілкування питань дизайну. Це може бути надзвичайно корисно на певних етапах розвитку. Однак дизайн розвивається, і намагання зберегти красиву та детальну схему системи UML у синхронізації з кодом може швидко стати тягарем. Тож пам’ятайте, що викинете його, коли вам це більше не потрібно :-)
Péter Török

1
@thomas, але домовленість тут полягає в тому, щоб підтвердити відповіді, які вам здаються корисними, натиснувши на стрілку вгору поруч із відповіддю :-)
Péter Török

4

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

Наприклад, ми використовували їх у проектах Ruby on Rails, коли ми перевіряли контролери та потребували входу користувача, який потребував би дзвінка до іншого контролера та збереження частини його інформації у файлі cookie. У цьому випадку корисно знущатися над користувачем, який увійшов у систему, який повертає значення true, коли його запитують про певну привілей доступу.


2

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


Оскільки Продукт не залежить від Line, немає необхідності (ні способу) використовувати макет для Line там. Те саме для лінії та порядку.
Péter Török

2

"TDD - це в першу чергу техніка дизайну з побічним ефектом, що забезпечує те, що ваш вихідний код ретельно перевірений" - Скотт У. Амблер

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

Щодо глузування. Якщо ви хочете знущатися, пропоную вам знущатися над Продуктом під час написання тестів для Line та макет Line під час тестування замовлення. Але це може бути надмірним тут. Я особисто намагаюся максимально обмежити глузування і використовую його для розв’язування залежностей від зовнішніх класів (наприклад, екземплярів бази даних).


2
Я просто маю просту діаграму класу ...

-1 Тож роздуми про дизайн (включаючи списання діаграми класу) заважають вам робити TDD? Це звучить просто неправильно.
Bjarke Freund-Hansen

1
@bjarkef: Прочитайте мою відповідь ще раз. Якщо дизайн остаточний, ви не можете реально використовувати TDD, щоб вигнати дизайн, саме про це йдеться у TDD. І я думаю, що це також змушує ОЗ заплутатися: він вже має рішення, і зараз намагається написати тести на це. "Які тести слід написати першим, Товар чи Замовлення". Це питання насправді не актуальне, якщо ви спочатку пишете тести.
Мартін Вікман

Як Ви визначаєте, що конструкція остаточна без тестів чи виробничого коду? Припустимо, що ви хочете створити щось, що працює.
JeffO

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