Тестирование тяжелого графического приложения WPF

Правильный ответ выше. Если, однако, вы хотите периодически перезагружать кеш, и вы используете Firefox, инструменты веб-разработчика (в пункте меню «Инструменты» по состоянию на ноябрь 2015 года) предоставляют параметр «Сеть». Это включает кнопку перезагрузки. Выберите перезагрузку для сброса кэш-памяти.

30
задан Hamish Grubijan 11 March 2010 в 01:39
поделиться

5 ответов

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

MVVM

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

Test Scripting

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

Моим решением было разработать собственный инструмент тестирования, который использовал существующие библиотеки. У нас был простой скриптовый механизм, который читал файл и выполнял команды. По сути, мы разработали 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]

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

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

Написание сценариев становится довольно простым, что очень важно, поскольку в итоге у вас получается много-много сценариев. Элементы управления обнаруживаются по имени, поэтому вы следуете соглашению (например, "Name" может быть "NameTextBox" в коде, или "Save" может быть "SaveButton").

Вы также можете использовать NUnit и т.д. для запуска тестов.

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

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

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

Библиотеки

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

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

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

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

PK :-)

21
ответ дан 28 November 2019 в 00:04
поделиться

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

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

15
ответ дан 28 November 2019 в 00:04
поделиться

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

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

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

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

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

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

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

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

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

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

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

5
ответ дан 28 November 2019 в 00:04
поделиться

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

У вас не так много вариантов, но:

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

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

  1. PowerShell
  2. TestPlant

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

1
ответ дан 28 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: