Любая тестируемая архитектура или шаблон проектирования для приложения MFC? - PullRequest
4 голосов
/ 15 декабря 2011

Этот вопрос меня давно беспокоит.

Я ищу тестируемый шаблон архитектурного дизайна для приложения MFC. Пожалуйста, не говорите мне, что MFC уже MVC или что-то в этом роде, потому что это не имеет никакого смысла, пока мы не можем протестировать приложение.

Я понимаю, что эмпирическое правило заключается в том, чтобы сделать просмотр / документ настолько тупым, насколько это возможно, и сделать другие классы тестируемыми. Но я хочу больше подробностей об этом. Как я могу сделать View / Document максимально тупым и подключить их к другим тестируемым классам?

Сначала я подумал о MVP, так как у меня был некоторый успех с ним для приложений Windows .NET и Android. Но в этом случае с MFC нам нужно сделать Document тоже немым. Это усложняет вещи.

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

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Тестирование GUI - все еще ужасная задача. Есть инструменты, которые помогут вам отслеживать и воспроизводить интерактивный ввод. Я использовал часть этого API (код, украденный из Perl), чтобы внедрить события нажатия клавиш в другое приложение (чтобы открыть новый URL в Firefox, не всегда открывая новую вкладку). Но это не совсем хорошо для тестирования.

Расширенные инструменты стоят несколько килограмм долларов и поставляются с внешними языками сценариев, а отчеты об удобстве использования разделены. http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

В тестировании GUI есть две разные области. Один - это заполнение диалогов с пользовательскими настройками, а другой - тестирование модели / вида.

Первое можно легко решить с помощью нескольких правил кодирования. Например, диалоги ничего не изменяют, а принимают и возвращают классы со всеми опциями. В этом случае вы можете просто заменить код диалога своим собственным кодом. Это легкая часть. В моем диалоговом окне кода измените настройки INI-файла, а затем просто уведомите модель с несколькими подсказками о том, что изменилось.

Тестирование вида и модели намного сложнее. Если речь идет о рисовании, вы можете попытаться использовать сообщение WM_PRINT для захвата вида, а затем запустить тест и сравнить его вывод с предыдущими захваченными данными. Если растровые изображения совпадают, тест проходит. Я никогда не видел, чтобы эта техника применялась в реальном мире, за исключением одного инструментария, в котором она использовалась для тестирования пиксельного рисования на нескольких платформах.

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

Есть много разных способов в зависимости от вашей собственной кодовой базы, если вы абстрагируетесь от MFC достаточно хорошо, чтобы использовать фиктивные объекты GUI вместо реальных окон MFC. И если вы уже внедрили язык сценариев, который может помочь вам в тестировании и т. Д., Извините, простой схемы не существует. Это должно быть решено в каждом конкретном случае.

Мой собственный опыт показывает, что мне совсем не нравятся GUI модульного тестирования и модульное тестирование. Это часто не стоит времени. Я использую Eiffel и Design by Contract (это означает множество заявлений об утверждении), и я провожу обширные бета-тесты с заказчиками и позволяю заказчикам находить оставшиеся ошибки. В любом случае, большинство ошибок - это непроверяемые ошибки юзабилити.

1 голос
/ 15 декабря 2011

Вы имеете в виду MVC? Это есть в архитектуре doc / view, но часть контроллера немного отсутствует. Вы все еще можете добиться хороших результатов, отделяя GUI от данных, но реальное преимущество отделения модели от представления заключается в том, что вы можете использовать его в другом месте, но, по меньшей мере, это нелегко с doc / view.

Редактировать : Добавить на: Что касается возможностей тестирования, приложение MFC поставляется с обработкой командной строки. Вы можете использовать это и отправлять команды тестирования в приложение из командной строки.

0 голосов
/ 29 января 2012

Не думаю, что вам может понадобиться какой-то особый шаблон проектирования, чтобы отделить логику от пользовательского интерфейса.MVP может помочь, но может не быть практически необходимым.Разделения будет достаточно для тестирования, если вы сможете превратить свою логику в отдельные библиотеки DLL или статические библиотеки и сделать их доступными из других приложений.Это будет хорошим началом для того, чтобы практически сделать вашу логику тестируемой.

Но даже до этого я нашел бы хорошую среду тестирования для вашей среды разработки.У меня был некоторый успех с каркасом Google Testing или Boost Testing в случае MFC.

Что касается шаблонов проектирования, они очень хороши для обеспечения поддержки вашей программы и максимального повторного использования кода, но я не уверен, что это хорошая практикаиспользовать их, чтобы сделать вашу программу тестируемой.Тестируемость - это хорошее свойство вашей программы, но она не может быть целью вашего дизайна.

...