Приемочные тесты хороши тем что проверяют уже готовый продукт, в максимально приближенной к боевой среде. Тем самым эти тесты, отчасти страхуют нас от глупых ошибок.
Столкнувшись с ситуацией, когда все мои юнит и интеграционные тесты прошли, продукт автоматически поставился на тестовые машины, и лишь через несколько билдов, зайдя на тестовую машину и попробовав запустить приложение я увидел ошибку о том что одна из сборок не найдена.
Оказывается при добавлении нового проекта я забыл прописать его библиотеку в конфиг WIX и она не попала в сетап.
Тогда я начал задумываться о том, как бы мне проверять моё WPF приложение в боевой обстановки, автоматически, без сторонних тулов типа TestComplete да еще и бесплатно.
Первым делом я наткнулся на фичу VS2010 Coded UI Test, но очень скоро оказалось что эта фича требует наличие более дорогой версии студии чем моя компания распологает.
После некоторых изыскании окзалось что в основе Coded UI Test лежит UI Automation API, которое ничего не стоит. Так же есть бесплатная и открытая библиотека White, позволяющая упростить работу с этим API.
В итоге я решил написать тест который будет запускать приложение, нажимать кнопку на Ribbon, заполнять диалоги и проверять элементы в списке
Вот пример кода который это делает:
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 процесса все работает замечательно
Комментариев нет:
Отправка комментария