среда, 14 сентября 2011 г.

UI test for WPF applications with White framework

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

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

Оказывается при добавлении нового проекта я забыл прописать его библиотеку в конфиг WIX и она не попала в сетап.

Тогда я начал задумываться о том, как бы мне проверять моё WPF приложение в боевой обстановки, автоматически, без сторонних тулов типа TestComplete да еще и бесплатно.

Первым делом я наткнулся на фичу VS2010 Coded UI Test, но очень скоро оказалось что эта фича требует наличие более дорогой версии студии чем моя компания распологает.

После некоторых изыскании окзалось что в основе Coded UI Test лежит UI Automation API, которое ничего не стоит. Так же есть бесплатная и открытая библиотека White, позволяющая упростить работу с этим API.

В итоге я решил написать тест который будет запускать приложение, нажимать кнопку на Ribbon, заполнять диалоги и проверять элементы в списке

Вот пример кода который это делает:

// Run application
var application = Application.Launch(@"C:\Reps\WPFApp.exe");

// Find main window
var window = application.GetWindow("Title of My WPF application", InitializeOption.NoCache);

// Click ribbon button by Id
var connectBtn = (Button)window.Get(SearchCriteria.ByAutomationId("AddFarmBtn"));
connectBtn.Click();

// Find wizard dialog
var conWz = window.ModalWindow("Add farm window");

// Type url into TextBox
var urlTextBox = (TextBox)conWz.Get(SearchCriteria.ByAutomationId("FarmTB"));
urlTextBox.Enter(@"http://superfarmurl.com");

// Click Add button
var addBtn = (Button)conWz.Get(SearchCriteria.ByAutomationId("AddBtn"));
addBtn.Click();

// Wait till dialog closed
conWz.WaitTill(() => { return conWz.IsClosed; });

// Check list box
var farmsList = (ListBox)window.Get(SearchCriteria.ByAutomationId("FarmsListBox"));
var resFarms = farmsList.Items.FindAll(li => { return li.Text == @"http://superfarmurl.com"; });
Console.WriteLine(resFarms[0]);

// Kill app
application.Kill();

Для просмотра всяких Automation ID достаточно удобно пользоваться UISpy

Но конечно не обошлось и без ложки дегтя, при работе c White из x64 (или Any CPU) приложении ф-ии Click() работают некорректно, кто уж в этом виноват я не знаю, но если запускать из x32 процесса все работает замечательно

Комментариев нет: