Безумовно, хороший список. Ось кілька думок щодо цього:
Спочатку напишіть тест, а потім код.
Погоджуюсь, на високому рівні. Але я б сказав більш конкретно: "Спочатку напишіть тест, потім напишіть достатньо коду, щоб пройти тест, і повторіть". В іншому випадку я б побоювався, що мої модульні тести будуть більше схожими на тести інтеграції чи прийняття.
Класи проектування з використанням введення залежностей.
Домовились. Коли об’єкт створює власні залежності, ви не маєте над ними контролю. Інверсія управління / інжекція залежності дає вам цей контроль, дозволяючи вам ізолювати об'єкт, що тестується, макетами / заглушками / тощо. Це те, як ви тестуєте об'єкти ізольовано.
Відокремте код інтерфейсу від його поведінки за допомогою Model-View-Controller або Model-View-Presenter.
Домовились. Зверніть увагу, що навіть ведучий / контролер може бути протестований за допомогою DI / IoC, передавши йому затьмарений / глузливий вигляд та модель. Перевірте Presenter First TDD, щоб дізнатися більше про це.
Не пишіть статичні методи або класи.
Не впевнений, що я з цим згоден. Можливо юніт-тестування статичного методу / класу без використання макетів. Тож, можливо, це одне із тих специфічних правил Rhino Mock, про які ви згадали.
Програмуйте інтерфейси, а не класи.
Я згоден, але з трохи іншої причини. Інтерфейси надають розробнику програмного забезпечення велику гнучкість - окрім простої підтримки різних макетних об’єктів. Наприклад, неможливо належним чином підтримати DI без інтерфейсів.
Виділіть зовнішні залежності.
Домовились. Приховуйте зовнішні залежності за власним фасадом або адаптером (за потреби) з інтерфейсом. Це дозволить вам ізолювати своє програмне забезпечення від зовнішньої залежності, будь то веб-служба, черга, база даних чи щось інше. Це особливо важливо, коли ваша команда не контролює залежність (вона ж зовнішня).
Позначте як віртуальні методи, над якими ви збираєтеся знущатися.
Це обмеження Rhino Mocks. У середовищі, яке віддає перевагу ручно закодованим заглушкам перед макетним об'єктом, це не буде необхідним.
І ще кілька нових пунктів, які слід врахувати:
Використовуйте креативні шаблони дизайну. Це допоможе з DI, але також дозволяє ізолювати цей код і протестувати його незалежно від іншої логіки.
Напишіть тести, використовуючи техніку Білла Вейка Arrange / Act / Assert . Ця техніка чітко дає зрозуміти, яка конфігурація необхідна, що насправді тестується та що очікується.
Не бійтеся закочувати власні знущання. Часто ви виявите, що використання макетних фреймворків робить ваші тести неймовірно важкими для читання. Прокачуючи власні, ви будете мати повний контроль над своїми макетами / заглушками, і ви зможете тримати свої тести читабельними. (Зверніться до попереднього пункту.)
Уникайте спокуси реконструювати дублювання з ваших модульних тестів на абстрактні базові класи або методи налаштування / розірвання. Це приховує код конфігурації / очищення від розробника, який намагається проаналізувати модульний тест. У цьому випадку чіткість кожного окремого тесту важливіша, ніж рефакторинг дублювання.
Впровадити безперервну інтеграцію. Реєструйте свій код на кожній "зеленій панелі". Створюйте програмне забезпечення та запускайте повний набір модульних тестів під час кожної реєстрації. (Звичайно, це не є практикою кодування як такою; але це неймовірний інструмент для забезпечення чистоти та повної інтеграції програмного забезпечення.)