Определенно хороший список. Вот несколько мыслей по этому поводу:
Сначала напишите тест, а затем код.
Согласен, на высоком уровне. Но я бы сказал более конкретно: «Сначала напишите тест, затем напишите достаточно кода, чтобы пройти тест, и повторите». В противном случае я бы боялся, что мои модульные тесты будут больше похожи на интеграционные или приемочные тесты.
Создавайте классы с помощью внедрения зависимостей.
Согласованный. Когда объект создает свои собственные зависимости, вы не можете их контролировать. Инверсия управления/внедрение зависимостей дает вам этот контроль, позволяя изолировать тестируемый объект с помощью mocks/stubs/etc. Так вы тестируете объекты изолированно.
Отделите код пользовательского интерфейса от его поведения с помощью Model-View-Controller или Model-View-Presenter.
Согласованный. Обратите внимание, что даже презентатор/контроллер можно протестировать с помощью DI/IoC, передав ему заглушенное/издевательское представление и модель. Чтобы узнать больше об этом, посетите Presenter First TDD.
Не пишите статические методы или классы.
Не уверен, что согласен с этим. Можно провести модульное тестирование статического метода/класса без использования моков. Итак, возможно, это одно из тех конкретных правил Rhino Mock, которые вы упомянули.
Программируйте интерфейсы, а не классы.
Я согласен, но немного по другой причине. Интерфейсы обеспечивают большую гибкость для разработчика программного обеспечения — помимо поддержки различных фреймворков фиктивных объектов. Например, невозможно правильно поддерживать DI без интерфейсов.
Изолируйте внешние зависимости.
Согласованный. Скройте внешние зависимости за своим собственным фасадом или адаптером (в зависимости от ситуации) с интерфейсом. Это позволит вам изолировать ваше программное обеспечение от внешней зависимости, будь то веб-сервис, очередь, база данных или что-то еще. Это особенно важно, когда ваша команда не контролирует зависимость (также известную как внешняя).
Отметьте как виртуальные методы, над которыми вы хотите посмеяться.
Это ограничение Rhino Mocks. В среде, которая предпочитает написанные вручную заглушки фреймворку фиктивных объектов, в этом нет необходимости.
И пара новых моментов для рассмотрения:
Используйте творческие шаблоны проектирования. Это поможет с внедрением зависимостей, но также позволит вам изолировать этот код и протестировать его независимо от другой логики.
Напишите тесты, используя метод Arrange/Act/Assert Билла Уэйка. Этот метод очень четко показывает, какая конфигурация необходима, что на самом деле тестируется и что ожидается.
Не бойтесь создавать собственные макеты/заглушки. Часто вы обнаружите, что использование фреймворков макетов объектов делает ваши тесты невероятно сложными для чтения. Свернув свои собственные, вы получите полный контроль над своими макетами/заглушками и сможете сделать свои тесты читабельными. (Вернитесь к предыдущему пункту.)
Избегайте искушения реорганизовать дублирование ваших модульных тестов в абстрактные базовые классы или методы настройки/удаления. Это скрывает код конфигурации/очистки от разработчика, пытающегося выполнить модульный тест. В этом случае ясность каждого отдельного теста важнее рефакторинга, исключающего дублирование.
Внедрите непрерывную интеграцию. Проверяйте свой код на каждой "зеленой полосе". Создавайте свое программное обеспечение и запускайте полный набор модульных тестов при каждой регистрации. (Конечно, это не практика кодирования как таковая, но это невероятный инструмент для поддержания чистоты и полной интеграции вашего программного обеспечения.)
person
aridlehoover
schedule
24.09.2008