2014-09-04 2 views
1

Необходимо создать небольшие приложения winform для частного использования моей компанией для взаимодействия с нашей базой данных. Период. Я знаю, что .NET MVC имеет очень зрелую структуру модульного тестирования для шаблона MVC, поскольку я хочу делать TDD.Единичное тестирование для Winforms с использованием шаблона MVC?

Таким образом, можно ли использовать NUnit или какую-либо другую легкую/зрелую модульную систему тестирования (EDIT: на основе моего опыта работы с ASP.NET) со следующим руководством, приведенным ниже: here? У меня есть googled и проверял мою техническую библиотеку книг, и есть отчетливая нехватка документации для того, как сделать эффективное модульное тестирование для winforms. Таким образом, я обращаюсь к этому форуму, надеясь, что люди смогут поделиться со мной своими знаниями о домене.

Большинство, которые я нашел, рекомендовал шаблон MVC (с которым я согласен), но не как решить конкретные проблемы с winform. Например, как я могу проверить нажатие кнопки и последующее действие этой кнопкой?

Планирую использовать C# VS13 .NET 4.5. Я рад присоединиться к этому ресурсу и внес свой вклад всем, кто отвечает на мой запрос. Благодарю.

+3

«.NET MVC имеет очень зрелую модульную систему тестирования»? - обратите внимание на то, что вы имеете в виду. (Предполагая MVC == ASP.Net MVC) .Net не имеет какой-либо конкретной модульной структуры тестирования для ASP.Net MVC ... В Visual Studio есть универсальная среда тестирования, но она не имеет ничего общего с ASP.Net MVC или почти любой из определенных стеков (WPF/WinForms/WebForms ...). –

+2

Winforms хорошо сочетаются с шаблоном MVP. Отделите своих докладчиков от зависимостей и протестируйте докладчиков. –

+1

У кого-то другого, похоже, был несколько аналогичный вопрос: http://stackoverflow.com/questions/128086/how-can-i-write-a-unit-test-for-a-controller-class-that-uses -winforms-for-views? rq = 1 – jbutler483

ответ

3

Как вы, наверное, заметили, что идея есть иметь свой вид описано с интерфейсом.

Таким образом, контроллеру действительно не нужно окно , ему нужен класс, реализующий интерфейс.

И, таким образом, у вас может быть еще одна, автоматическая фальсификация или ручная реализация интерфейса вида, которая не включает подсистему WinForms, а скорее предоставляет данные для записи ваших утверждений.

Имея свой заглушку, вы просто пишете сценарий против него. Вы раскрыть некоторые методы из класса, которые позволяют автоматизировать взаимодействие:

public class ViewStub : IView 
{ 
    // implement the view interface as it is but also 
    // an extra stuff to let you automate this in your unit tests 

    public void RaiseButtonClick() 
    { 
     this.controller.DoTheButtonClickStuff(); 
    } 
} 

Тогда ваш тест будет (я следую конвенции из учебника)

ViewStub form = new ViewStub(); 
IModel mdl = new IncModel(); 
IController cnt = new IncController(view,mdl); 

form.RaiseButtonClick(); 
+0

Я думаю, что это сработает с NUnit, учитывая, как вы это сформулировали. Например, предположим, что buttonclick увеличивает счетчик. Я мог бы выполнить сценарий выше, а затем утверждать, что счетчик увеличился на 1 или что-то еще. Да? Если так, начните получать супер возбуждение. Это может сработать. :) – hlyates

+0

Это ** будет ** работать, это было придумано для работы следующим образом:) –

-3

Для пользовательского интерфейса не требуется модульное тестирование. Конечно, вы можете это сделать, но я не рекомендую это по нескольким причинам: вы не можете выполнять тестирование DPI изменений, несколько экранов, как ваша программа действует в разных состояниях окна или что происходит, если пользователь перемещается с помощью табулятора между вашими элементами управления. Пользовательский интерфейс тестирования модулей даст вам только ложную безопасность.

Используйте инструменты автоматизации пользовательского интерфейса, чтобы проверить пользовательский интерфейс автоматически, если хотите, но не оставляйте тестирование устройства из него. Вы можете удержать слой UI тонким, насколько это возможно, и это также хорошая практика проектирования. Вы можете использовать модульное тестирование для других классов, которые используются в вашем приложении winforms.

+0

Тестирование устройства не должно давать вам 100% -ное чувство безопасности, но для проверки основных функций и быстрого поиска проблем. Нет ничего плохого в том, что вам нужно будет тестировать пользовательский интерфейс. Проблема в том, что обычно это сложно сделать. – mason

+1

@Mino: То, что вы сказали, неверно. MVC (или MVP, как некоторые называют его) или MVVM, представляют собой шаблоны архитектуры, разработанные для юниверсирования приложений ui. Дело не в том, что вы тестируете фактический пользовательский интерфейс, а скорее как поведение приложения, когда пользователь его использует. С другой стороны, то, что вы предлагаете, также важно и несколько дополняет друг друга. Это похоже на тестирование белого/черного ящика. Вот почему я понижаю голос, ваш ответ звучит так, будто вы отговариваете его делать что-то совершенно справедливое. –

+0

Я знаю, что единичный тест не покрывает ничего. В третьем комментарии к вопросу есть ссылка на документ Майкла Перса, и я думаю, что он также пытается сказать, что вы не должны тестировать слой пользовательского интерфейса. Это не повредит вам, если вы оставите тонкий слой пользовательского интерфейса без тестов. Если вы кодируете стиль TDD и начинаете тесты с уровня пользовательского интерфейса. Я думаю, что это поможет вам легко написать код непосредственно в слой пользовательского интерфейса. Также подключение UI может быть болью в заднице. Делать что-то медленное, просто проверить несколько вызовов методов - пустая трата времени, на мой взгляд. Используйте инструменты, которые предназначены для определенной задачи, не используйте только те инструменты, которые вам известны. – Mino

2

Unit Тестирование GUI является то, что независимо от используемой библиотеки GUI. Ответ на общий случай также отвечает на ваш случай: How can I unit test a GUI?

Единичное тестирование графического интерфейса пользователя выполняется путем минимизации отпечатков классов, которые зависят от вашего графического интерфейса. Тогда классы, которые по-прежнему зависят от структуры GUI, не тестируются на единицу (что совсем не так, как «не проверены»). Этими классами являются «Вид» в шаблонах, таких как MVP, MVC, MVVM.

Заключение: Каждая хорошая инфраструктура тестирования .Net Unit - это хорошая платформа тестирования модулей WinForms. Одним из примеров такой структуры является NUnit, о котором вы упомянули в своем вопросе.

Смежные вопросы