Pull to refresh

White — автоматизация функционального тестирования приложений

Reading time 6 min
Views 4.7K
Существует множество инструментов для автоматизации функционального тестирования приложений. С одной стороны универсальные коммерческие пакеты, настоящие монстры автоматизации – HP QuickTest Pro, SilkTest, TestComplete. С другой – специализированные или «бедные» по функциональности свободные инструменты – Selenium (web-приложения), pyWinAuto, Win32::GuiTest и т.д. Но настоящей жемчужиной среди свободных инструментов, на мой взгляд является Codeplex White Framework.

Не так давно потребовалось автоматизировать некоторое .net приложение. На работе основным инструментом для автоматизации принят QuickTest Pro, но для этого конкретного проекта он был слишком дорог: проект очень небольшой – автоматизации подлежали всего несколько операций. Встал вопром с поиском бесплатной альтернативы.

Первым бы опробован перловый Win32::GuiTest. С задачей он справился, но код скрипта получился очень уж неаккуратный – слишком тяжело его было бы в последствии поддерживать. И тут на сайте codeplex’a был обнаружен White
Он оказался настолько простым и удобным, что было решено применять его. Этот framework поддерживает большинство стандартных контролов Win32, WinForms, WPF (Silverlight), SWT. Под катом пример простой автоматизации Калькулятора Windows XP.

Что делаем:
Складываем на калькуляторе два числа 10 и 59, и убеждаемся, что результат равен 69.
Что понадобится:
1. Visual C# Express для сборки примеров
2. UISpy для определения параметров окон и контролов. Входит в состав Windows 7 SDK.
3. Собственно White Framework
4. NUnit. Его удобно использовать, чтобы не создавать свой UI или механизм сообщений об ошибках/успехах.

Поехали %)

Создаем проект CalcAutoTests типа Class Library в Visual C# Express.
Добавляем ссылки на сборки
1. Nunit.Framework
2. White.Core
3. White.Nunit

NUnit вводит атрибуты для классов и методов, облегчающие написание тестов, в этом примере мы будем использовать только некоторые из них –
1. TestFixture – обозначает наш класс, как набор тестов;
2. TestFixtuteSetUp – обозначает метод, который выполняется перед выполнением тестов;
3. TestFixtureTearDown – обозначает метод, который выполняется после выполнения тестов;
4. Test – тестовый метод

White может идентифицировать контролы по нескольким параметрам – по надписям (заголовкам окна), по AutomationID – ресурсному идентификатору контрола, по типу контрола, по его индексу. Идентификация может проходить как по одному признаку, так и по нескольким с логическим условием «И». В нашей задаче цифровые кнопки, кнопки «+» и «=» могут быть идентифицированы по надписям, а поле отображения результата – по AutomationID. Для идентификации этого поля, нам понадобится UISpy.

image

Наконец, когда мы полностью готовы – пишем код тест сета.

using System;<br>using System.Diagnostics;<br>using NUnit.Framework;<br>using Core;<br>using Core.UIItems.Finders;<br>using Core.WindowsAPI;<br>using Core.Factory;<br>using Core.UIItems;<br>using Core.UIItems.WindowItems;<br><br><br>namespace CalcAutoTests<br>{<br>    [TestFixture]<br>    public class CalcTestSet<br>    {<br>        private Application application;<br>        private Window mainform;<br>        private Button[] btnDigits;<br>        [TestFixtureSetUp]<br>        public void CalcStartup() <br>        {<br>            //определяем параметры запуска калькулятора<br>            var psi = new ProcessStartInfo();<br>            psi.WorkingDirectory = @"C:\Windows\";<br>            psi.FileName = @"calc.exe";<br>            //запуск<br>            application = Application.Launch(psi);<br>            //получаем главное окно калькулятора по его заголовку.<br>            //В русской Windows заголовок окна "Калькулятор"<br>            mainform = application.GetWindow("Calculator",InitializeOption.NoCache);<br>            //поле ввода цифр калькулятора имеет атрибут "read only", <br>            //поэтому для ввода цифр нам нужны "цифровые кнопки калькулятора"<br>            btnDigits = new Button[10];<br>            for (int i = 0; i < 10; i++)<br>                btnDigits[i] = mainform.Get<Button>(i.ToString());<br>        }<br>        [TestFixtureTearDown]<br>        public void CalcShutdown() <br>        {<br>            //закрываем приложение<br>            application.Kill();<br>        }<br>        [Test]<br>        public void testAddition()<br>        {<br>            int a = 10, b = 59;<br>            //получаем кнопки + и = по их надписям<br>            var btnAdd = mainform.Get<Button>("+");<br>            var btnExec = mainform.Get<Button>("=");<br>            //получаем окно ввода по его AutomationID, которое определил UISpy<br>            var tbResult = mainform.Get<TextBox>("403");<br>            //вводим 10<br>            btnDigits[1].Click(); //"1"<br>            btnDigits[0].Click(); //"0"<br>            btnAdd.Click(); // "+"<br>            //вводим 59<br>            btnDigits[5].Click(); // "5"<br>            btnDigits[9].Click(); // "9"<br>            btnExec.Click(); // "="<br>            var result = tbResult.Text; // получаем результат<br>            int ires = int.Parse(result,System.Globalization.NumberStyles.Float);<br>            //совпадает с ожидаемым?<br>            Assert.AreEqual(a + b, ires);<br>        }<br>    }<br><br>}<br><br>* This source code was highlighted with Source Code Highlighter.


Собираем проект.

Если NUnit установлен в каталог по-умолчанию, то переходим в каталог с результатом сборки и используем следующую строку для запуска тестов:

“c:\Program Files\NUnit 2.5.2\bin\net-2.0\nunit-console.exe” CalcAutoTests.dll

И наслаждаемся тем, как Калькулятор сам нажимает кнопки %)

Этот синтетический по сути тест не раскрыл и десятой доли функциональности White, но, надеюсь, показал, что для автоматизации приложений необязательно использовать дорогие коммерческие средства. Всегда можно найти бесплатную альтернативу, в которой может отсутствовать рекордер (я знаю, что в White он теоретически есть, но он не идет ни в какое сравнение с рекордером QTP), развитые средства отчетности (их несложно сделать), интеграция с промышленными системами поддержки тестирования. Но у которой будет одно неоспоримое преимущество — стоимость лицензий, которое очень важно для небольших проектов.
Tags:
Hubs:
+4
Comments 6
Comments Comments 6

Articles