Как начать работу с TDD с помощью Winforms

В последнее время я так много читал/смотрел о TDD и BDD, что очень хочу освоить их. Я был разработчиком, который только пишет код, а затем тестирует его извне (как мы всегда начинали). Проблема, кажется, заключается в том, чтобы начать работу с TDD. Я хочу просто создать простое приложение Winform, в котором я хочу показать список чего-то, скажем, продуктов. Я просто не знаю, с чего начать, должен ли я сначала написать тест для контроллера? контроллеру нужна ссылка для просмотра и обслуживания и так далее. ASP.Net MVC создан для тестирования, поэтому начать работу с ним немного просто, но Winforms — настоящая боль. Пожалуйста, дайте мне несколько видео (наиболее предпочтительных), которые показывают TDD в Winforms.

Я просмотрел множество видеороликов, в которых показано, как вы тестируете класс или функцию, но как вы тестируете пользовательский интерфейс, который не поддерживает тестирование?

Короче говоря, я хочу знать, занимается ли кто-нибудь TDD какое-то время, как он/она делает это в Winforms?

Я написал кучу кода, который просто удаляю, потому что застрял. Пожалуйста, помогите!


person Afraz Ali    schedule 06.02.2013    source источник


Ответы (3)


Вот как я это делаю для любого пользовательского интерфейса, будь то Web, Winforms, WPF, Swing на Java или даже интерфейс веб-службы, который будет использоваться другой системой.

  • Напишите пользовательский интерфейс и жестко закодируйте любые данные за ним.
  • Напишите контроллер и переместите жестко закодированные данные в контроллер. Контроллер должен просто представлять данные в форме, понятной пользовательскому интерфейсу.

Ваш контроллер теперь не имеет поведения; просто статические данные, но у них есть правильный API для пользовательского интерфейса, и теперь вы знаете, как пользовательский интерфейс хочет их использовать.

  • Напишите пример, который показывает, как пользовательский интерфейс будет использовать контроллер в самой простой форме.
  • Заставьте пример работать.
  • Напишите еще один пример, показывающий, как контроллер ведет себя по-разному в другом контексте.
  • Заставьте пример работать.

Это ваши модульные тесты! Если вы знаете, что вашему контроллеру потребуются другие классы для совместной работы, вы также можете смоделировать их.

Как только ваши соавторы высмеиваются, вы уже знаете, как контролер хочет их использовать. Опять же, у вас уже есть API для этих соавторов, потому что контроллер использует их.

Это то, что мы делаем, когда говорим о «снаружи-внутри» в BDD.

person Lunivore    schedule 07.02.2013
comment
Спасибо Лунивор за ваш отзыв. Это интересно! Я дам ему попробовать. Что мне нравится в вашем решении, так это то, что вы делаете первый шаг и сначала пишете знакомый код. Как только я овладею этой техникой, я смогу применить чистую технику «сначала тест». Спасибо, ваш ответ очень полезен. - person Afraz Ali; 12.02.2013
comment
Ну, я никогда не пишу юнит-тесты для UI — слишком много эстетики. Но да, вы можете сначала написать сценарии BDD, если хотите. Это хорошее начало. Удачи! - person Lunivore; 12.02.2013

Я тоже новичок в TDD и, как и вы, пытаюсь учиться. Вот что нарыл во время поисков, может и вам поможет:

  1. Посетите веб-сайт Роя Ошерова, а также его книгу "Искусство модульного тестирования". Посмотрите видео, там есть отличные, особенно раздел "Парное программирование". Его книга была единственной лучшей книгой, которую я читал о модульном тестировании и TDD, и единственной, которую я прочитал от корки до корки.
  2. Посмотрите некоторые ката TDD. Есть некоторые на веб-странице, которую я предложил в предыдущем пункте. Посмотрите, как другие люди решают ката. Это действительно полезно.
  3. Почитайте про внедрение зависимостей.
  4. Если вы хотите использовать TDD в WinForms, ознакомьтесь с шаблоном MVP. Насколько я знаю, это де-факто шаблон для отделения пользовательского интерфейса от бизнес-кода в WinForms.

Удачи в вашем поиске.

person hattenn    schedule 09.02.2013
comment
Спасибо, hattenn, ваш вклад очень ценен, и вы дали ссылку на несколько замечательных видео и книгу. Чрезвычайно полезно! Спасибо за ответ. - person Afraz Ali; 12.02.2013

Контроллер является хорошей отправной точкой. Извлеките общедоступный API View в интерфейс и проверьте взаимодействие контроллера с этим интерфейсом с помощью Mocking Framework. Вы можете сделать то же самое и для сервисного слоя. Кроме того, я бы воспользовался подходом «снизу вверх» для этого приложения и провел бы модульное тестирование слоев нижнего уровня, прежде чем добавлять тесты на слой пользовательского интерфейса. На уровне пользовательского интерфейса я напишу набор приемочных тестов, используя инфраструктуру BDD, и буду использовать фиктивные фреймворки, чтобы сделать эти тесты легковесными и сократить количество тестов.

Удачи!

person Ikaso    schedule 09.02.2013