Вопрос

Мы работаем над проектом здесь, в Visual Studio 2008.Мы используем встроенный набор для тестирования, поставляемый вместе с ним (пространство имен Microsoft.VisualStudio.TestTools.UnitTesting).Оказывается, к нашему большому огорчению, большая сложность (и, следовательно, ошибки) оказалась закодированной в нашем пользовательском интерфейсе.В то время как наши модульные тесты неплохо справляются с охватом бизнес-уровня, уровень пользовательского интерфейса является постоянным источником раздражения.В идеале мы бы хотели провести модульное тестирование и этого.Кто-нибудь знает хороший "Microsoft-совместимый" способ сделать это в Visual Studio?Приведет ли это к какому-то конфликту для "смешивания" фреймворков модульного тестирования, таких как Формы NUnit с материалами Microsoft?Есть ли какие-либо очевидные медвежьи ловушки, о которых я должен знать при использовании форм модульного тестирования?

Это было полезно?

Решение

Вам нужно было бы реорганизовать пользовательский интерфейс, чтобы он не нуждался в модульном тестировании.Пользовательский интерфейс должен содержать минимум бизнес-логики или вообще не содержать ее.Существует множество шаблонов, которые решают эту проблему.У Мартина Фаулера есть очень хорошая статья, которая многое объясняет об этих паттернах: http://martinfowler.com/eaaDev/uiArchs.html

В книге Мартина Фаулера "Рефакторинг" есть небольшая глава, в которой говорится о рефакторинге не тестируемого пользовательского интерфейса.Вы также могли бы прочитать "Эффективная работа с устаревшим кодом".

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

Другие советы

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

Я использую архитектуру пассивного просмотра, подробно описанную здесь http://martinfowler.com/eaaDev/PassiveScreen.html

По сути, переместите весь ваш код в формах в отдельный класс под названием xxxUI.Затем форма реализует интерфейс IxxxUI и предоставляет все, что нужно классу xxxUI.Вероятно, вы можете упростить ситуацию и объединить работу с несколькими элементами управления в один метод.

Затем поток переходит к ПОЛЬЗОВАТЕЛЮ, нажимающему на кнопку.Кнопка вызывает метод в соответствующем классе пользовательского интерфейса.Передача всех необходимых параметров.Метод класса пользовательского интерфейса изменяет модель.Затем с помощью интерфейса обновляется пользовательский интерфейс.

Для модульного тестирования у вас есть тестовые или фиктивные классы, реализующие интерфейсы и регистрирующие себя в классах пользовательского интерфейса.Вы можете заставить эти тестовые классы запускать любой тип входных данных и реагировать соответствующим образом.Обычно у меня есть списки последовательностей, которые выполняют действия в точном порядке.(Нажмите A, щелкните это, прокрутите это, затем введите B и т.д.).

Протестировать Winforms с помощью ApprovalTests (www.approvaltests.com или nuget approval tests) довольно просто, и они совместимы как с MSTest, так и с Nunit.

Здесь есть видео о том, как это сделать: https://www.youtube.com/watch?v=hKeKBjoSfJ8

Но процесс очень прост.1) создайте форму, которую вы хотите протестировать, в том состоянии, в котором вы хотите, чтобы она была проверена.2) вызовите WinFormApprovals.Подтвердите (форма)

ApprovalTests использует парадигму golden master для вывода результата на экран.если вам это нравится, просто переименуйте файл в .approved, и тест пройдет.

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

Посмотри на Джереми Ди .НЗП Миллера Вики-страница шаблонов презентаций для вдохновения при рефакторинге :)

Миллер пишет книгу, и, похоже, она станет обязательной для такого рода занятий.

Я использовал NUnitForms, когда дело доходило до тестирования моих собственных элементов управления пользовательским интерфейсом с хорошими результатами!Я согласен с ассортиментом на рефакторинг, если вы используете стандартный (или хорошо протестированы) Элементы управления пользовательского интерфейса.

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

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

Вы должны использовать Microsoft Coded UI для тестирования уровня пользовательского интерфейса.Это включает в себя написание (или запись) тестов, имитирующих действия, которые мог бы выполнить пользователь, и написание инструкций assert, чтобы гарантировать получение правильного результата.

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

Закодированный пользовательский интерфейс встроен в последние версии Visual Studio Premium.Я предлагаю вам не просто использовать функциональность записи, но вместо этого научиться писать тесты самостоятельно, поскольку это дает вам большую гибкость.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top