Тестирование тяжелого графического приложения WPF - PullRequest
30 голосов
/ 11 марта 2010

У нас (моих коллег) есть зрелое приложение 12 лет , основанное на графическом интерфейсе, и в настоящее время планируется добавить новые диалоговые окна и другие графические интерфейсы в WPF, а также заменить некоторые старые диалоги в WPF также. В то же время мы хотим иметь возможность протестировать эту автоматизацию Monster - GUI в понятном виде. Некоторые проблемы:

  1. Приложение массивное.
  2. Он постоянно получает новые функции.
  3. Это изменяется вокруг (исправления ошибок, патчи).
  4. У него есть задний конец и промежуточный слой. Его состояние может выйти из строя, если вы победите его до смерти.

То, что мы хотим, это:

  • Некоторый инструмент, который может автоматизировать тестирование WPF.
  • автоматическое обнаружение того, что является входами и выходами диалогового окна. Старый тест должен работать, если вы добавите метку, которая ничего не делает. Однако, если вы удалите необходимое текстовое поле, произойдет сбой. Было бы очень хорошо, если бы набор тестов был прост в обслуживании, если бы он работал и не ломался большую часть времени.
  • Каждый новый диалог должен создаваться с учетом тестируемости.

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

Ответы [ 5 ]

21 голосов
/ 16 марта 2010

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

MVVM

В общем, я бы также порекомендовал шаблон MVVM и провел бы как можно больше испытаний без графического интерфейса. Тестирование GUI просто сложно! Мне нравится статья Джоша Смита на MSDN: « Приложения WPF с шаблоном проектирования Model-View-ViewModel » (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)

Тестовые сценарии

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

Мое решение состояло в том, чтобы придумать специальный инструмент тестирования, который бы использовал существующие библиотеки. У нас был простой скрипт-движок, который считывал файл и выполнял команды. По сути, мы разработали DSL (http://en.wikipedia.org/wiki/Domain-specific_language) для тестирования нашего конкретного приложения. DSL включал в себя несколько простых команд для обозначения того, какое «окно» он тестировал, какие-либо конкретные «установочные» сигналы, а затем серия команд с последующими утверждениями. Выглядело это примерно так:

Test NewXyzItem
Setup Clear_items

Press Some_button
Enter_text_into Name Bobby Joe
(...)
Press Save

Assert_db_has_itemX SomeKey

Формат каждой строки

"command" "argument" [data]

Сценарии объединяются в группы каталогов, и «тестовый прогон» загружает их, анализирует и выполняет их. Создание журналов и отчетов на ходу полезно, я попался на крючке для создания скриншотов и т. Д., Которые пригодились. Если вы заинтересованы в реализации чего-то подобного и хотите руку, дайте мне знать .

Удобно было то, что мы могли вносить общие изменения в стратегию тестирования.

Написание сценариев становится довольно простым, что важно, потому что у вас получается много, много сценариев. Элементы управления обнаруживаются по имени, поэтому вы следуете соглашению (например, «Имя» может быть «NameTextBox» в коде или «Сохранить» может быть «SaveButton»).

На самом деле вы можете использовать NUnit и т. Д., Чтобы быть вашим тестовым бегуном.

ПРИМЕЧАНИЕ. - Просто запустите тесты в интерактивном режиме, получить тест GUI для работы с CI сложно и проблемно ...

Данные и тестирование

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

Библиотеки

Библиотека, которую вы можете найти наиболее полезной в " White " (http://white.codeplex.com/). Она может тестировать приложения Windows в целом - т.е. как WPF, так и WinForms. По сути, вы в конечном итоге кодируете такие вещи, как эта :

Button button = window.Get<Button>("SaveButton");
button.Click();

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

Опять же, много работы, но оно того стоит.

ПК: -)

15 голосов
/ 11 марта 2010

Одной из основных сильных сторон WPF, на мой взгляд, является возможность НЕ требовать специального тестирования пользовательского интерфейса. Использование подхода M-V-VM позволит вам вывести логику из области UI / messy-GUI. Наличие модульной тестируемой ViewModel (особенно если вы пишете новые диалоги!) Позволяет вам писать модульные тесты, которые эмулируют щелчок вашего графического интерфейса.

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

5 голосов
/ 11 марта 2010

Как говорит Джимми Лайк, большая часть вашего тестирования должна быть сосредоточена на ViewModel. Это состоит из написания модульных тестов для ViewModel - в основном отправка команд и установка и получение свойств.

Как только это будет сделано, 95% ваших испытаний закончится. Если вы хотите сделать еще один шаг и протестировать представление, выходящее за рамки ручного «пошагового тестирования», которое вы бы в любом случае сделали, есть ряд простых «проверок работоспособности», которые вы можете легко автоматизировать, чтобы убедиться, что вы случайно не удалили важную TextBox или сделать визуальный индикатор невидимым.

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

  • Чтобы убедиться, что все данные ViewModel связаны, найдите все Visuals и Freezables (используя визуальное дерево) и проверьте каждое связанное свойство для пути привязки его BindingExpression.

  • Чтобы убедиться, что все данные ViewModel отображаются каким-либо образом, измените данные ViewModel с помощью скрипта и после каждого изменения используйте RenderTargetBitmap, чтобы захватить пользовательский интерфейс и сравнить его с данными до изменения данных, чтобы убедиться, что пользовательский интерфейс изменился.

  • Чтобы убедиться, что значения свойств обновляются правильно, найдите все визуальные и произвольные объекты, а также отсканируйте и запишите все связанные с ними свойства, затем внесите изменения в ViewModel, выполните повторное сканирование и выполните поиск ожидаемого изменения любого свойства данный тип. (Для двойной проверки вы можете использовать технику сравнения растровых изображений для конкретного визуального объекта.)

  • Чтобы убедиться, что все команды доступны, установите известное состояние ViewModel, затем запустите каждую команду, привязанную к видимой кнопке, чтобы увидеть, запускает ли какая-либо из них ICommand или иным образом обновляет состояние ViewModel.

  • Чтобы убедиться, что свойство ViewModel действительно редактируется пользователем, измените содержимое или выделение каждого видимого TextBox, ComboBox, ListBox, чтобы увидеть, влияет ли какое-либо из них на свойство.

  • Чтобы получить возможность проверять любые изменения, влияющие на пользовательский интерфейс, сохраняйте базу данных, содержащую растровые снимки каждого вида в различных состояниях ViewModel, в наборе различных размеров окна. Когда будет создана новая версия приложения, запустите ту же систему моментальных снимков и сравните с предыдущими растровыми изображениями. Если что-то изменилось, сгенерируйте ручное задание для персонала QA, чтобы визуально сравнить старые и новые растровые изображения, чтобы увидеть, изменилось ли что-нибудь важное.

Возможна другая автоматизация тестирования в представлении, но приведенное выше даст вам старт.

Опять же, я должен отметить, что лучше всего сосредоточиться на тщательном тестировании модели представления. Ошибки в самом представлении довольно редки, обычно выявляются быстро и обычно тривиально исправить. Но после тщательного тестирования ViewModel имеет смысл автоматизировать тестирование представления.

4 голосов
/ 15 марта 2010

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

У вас нет большого выбора, но:

  1. Рефакторинг кода по мере продвижения. Это может быть небольшим извлечением метода, так что вы можете выполнить модульное тестирование или перейти к подходящей модели.
  2. Используйте один или несколько из множества инструментов тестирования Windows GUI . Обратите внимание, если вы планируете много изменений макета и / или управления, отложите это как можно дольше. Инструменты в этой статье будут использовать абсолютное позиционирование действий, управление, связанное (иногда внутренними идентификаторами) или их комбинацию. Поскольку их обычно нужно обучать без использования кода (предназначенного для тестировщиков QC, а не программистов), ваши тесты прекратят работу после изменения.
  3. Инвестируйте в людей-тестеров. Хотя это и не лучший выбор, он улучшает конечное качество и заставляет руководство задуматься о затратах на рефакторинг приложения.
1 голос
/ 18 марта 2010

Для тестирования приложений WPF есть несколько вещей, с которыми мы добились успеха:

  1. PowerShell
  2. TestPlant

и, возможно, это будут новые VSTS 2010 функции , хотя мы не пробовали их

...