[Из песочницы] Автоматизация тестирования. Начало пути
Добрый день, Хабр! Это мой первый пост, в этой связи прошу строго не судить, но критика приветствуется.Темой сегодняшней статьи будет автоматизация функционального тестирования веб-приложений. Точнее говоря, не сама автоматизация, как вид тестирования, а быстрый старт в этом, безусловно, увлекательном деле.Многие тестеры, занимающиеся проведением функционального и регрессионного тестирования, рано или поздно приходят к мысли об автоматизации процесса, т.к. совершенно точно можно сказать, что выполнение одних и тех же регрессионных кейсов со временем ужасно надоедает.Статья рассчитана на людей, которые только-только подходят к этой мысли и не знают думают, с чего бы им начать свой путь в автоматизации.Если вспомнить себя в начале этого пути, то получаются такие исходные данные (готов поспорить, что я не одинок):
Есть желание автоматизировать, есть проект, который можно автоматизировать; Больше 50 открытых вкладок в браузере с информацией об автоматизации, selenium«е, построении фреймворков и т.д.; Несколько начатых проектов Visual Studio, которые уже заброшены в результате тупика и осознания неверного подхода; Отсутствие времени, официально выделенного руководством на автоматизацию, т.к. нет опыта, неизвестно что получится (и получится ли). Руководство — отдельная тема.Нельзя просто так взять и сказать: «Хочу автоматизировать!» и в итоге получить одобрение и время на выполнение задачи. Руководству нужен результат, поэтому с их стороны очень резонно не выделять время «не известно на что».Отсюда следуют 2 ситуации:
Ситуация 1.
Шаг 1. Тестировшик озвучил идею автоматизации, возможно даже подготовил ТЗ и произвел оценку трудозатрат и окупаемости. Шаг 2. Руководство сказало: «Ок, дружище, приступай. К окончанию срока нужно предоставить отчет о проделанной работе». Далее начинается разработка, пробы и ошибки, новые знания, тестер замотивирован до предела. Но вот подходит срок, 90% вероятности были трудности при разработке (мы же новички, да), из-за которых поехали сроки, были новые идеи, которые не учитывались в ТЗ, но реализовать ой как хочется. В итоге скорее всего получится так, что система не будет сдана в срок, руководство расстроится (и не важно что мы много добились, что мы узнали много нового, что мы стали более компетентны), результата нет.Оговорюсь. Вероятно, дорогой читатель проходил по этому пути и все получилось, но уверен, таких людей меньшинство.
Ситуация 2.
Шаг 1. Тестировщик втихаря в свободное от работы время начал изучать тему, читать статьи, немного автоматизировать. Шаг 2. Проходит какое-то время и тестировщик уже имеет более менее рабочий проект автоматизации, несколько десятков авто-тестов. Проект еще не завершен, да, но самое время сообщить руководству о своей инициативе и своих успехах, это поднимет вам цену и придаст дополнительную мотивацию. Шаг 3. Тестировщик сообщает руководству, показывает рабочий, пусть и не завершенный проект, в результате получает одобрение и время на завершение начатого. На мой взгляд здесь предпочтительнее путь 2 (вероятно мне так кажется, потому что я сам шел именно по этому пути), потому что он гарантирует отсутствие отрицательного результата, ведь если у вас вдруг не получится, никто не узнает об этом.Размещая эту статью, я преследую несколько целей:
Принести пользу начинающему тестировщику — автоматизатору, помочь быстро создать первый авто-тест и продолжить автоматизировать; Получить критику по проекту, т.к. он еще допиливается и наполняется; Найти людей, которые будут использовать систему, получать от них обратную связь о том, какой функционал они бы хотели видеть из того, что нет. Надеюсь, что статья принесет пользу начинающему автоматизатору.Также я надеюсь на критику, т.к. приложенный проект в данный момент разрабатывается и нуждается в дополнении.Что используется:
Язык и среда разработки: C# в MS Visual Studio 2012 (проект class library). Управление браузером: Selenium Webdriver. Фреймворк тестирования: NUnit. Для работы с БД (нам ведь нужно откуда-то брать тестовые данные, верно?) на данном этапе используются стандартные OracleClient и SqlClient; Установка приложений и настройка проектаДля работы потребуется:
Чтобы закачать проект из репозитория, необходимо в папке (где вы хотите его содержать) открыть git bash и выполнить команду: git clone git://github.com/4gott3n/AT.git master
Ознакомиться с работой Git можно, например, в этой статье.
Далее открываем файл AT.sln в Visual Studio и видим перед собой Solution, содержащий проект AT (собственно сам фреймворк), а также пример тестового проекта, в котором можно увидеть реализацию страниц, тестов и т.д. (он является удобным примером для создания своего проекта).
Следующий шаг — создание проекта, который будет хранить все ваши тесты, страницы и все остальное.
Что нужно сделать:
Добавить в Solution новый проект (Class library) это название позже нужно прописать в App.config; Подключить ссылки; В итоге должно быть как на картинке: Создать файл конфигурации App.config; В этом файле будут содержаться все основные параметры проекта.
Подробнее. App.config
Подробнее. WebPages. Несколько правил: Папка со страницами должна называться WebPages; Она должна находиться в корне проекта; Внутри нее должны содержаться корневые папки ваших тестируемых системы (к примеру если вы тестируете Яндекс, то в папке WebPages должна быть папка yandex); Страницы в папках должны находиться в тоже же иерархии, как они находятся в тестируемой системе; Пример: Страница: test.ru/step1/service/index.htmlИерархия папок: WebPages → Test → step1 → service → index.html.csВажно: имена папок и классов чувствительны к регистру Названия файлов классов страниц должны соответствовать реальным именам страниц Названия классов страниц: Пример: Страница: index-1.htmlКласс: index___1__htmlЗдесь: Дефис в названии страницы заменяется тремя слешами (можно изменить, параметр dash_prefix в App.config); Точка файла заменяется двумя слешами (можно изменить, параметр extension_prefix в App.config; Названия классов, когда нет названия файла, а есть только папка: Пример: Страница: test.ru/step1/service/Класс: _fld (можно изменить, параметр folder_index_prefix в App.config) Создать класс Pages.cs public static class Pages { } Класс будет содержать объекты классов страниц (WebPages); Подробнее. Pages.cs Этот класс содержит объекты классов страниц, через которые осуществляется доступ к элементам и т.д. Несколько правил:
В данном классе иерархия подклассов должна совпадать с иерархией в папке WebPages; Класс и все объекты внутри него должны быть public static. Пример класса: public static class Pages { public static class Test { public static index__html Index = new index__html (); public static class step1 { public static class service { public static _fld Main = new _ fld (); } public static add__php Add = new add__php (); } } } При такой записи страницы будут доступны в тестах примерно так:
Pages.Test.Index.Open (); Pages.Test.step1.service.Main.Open (); Создать папку для тестов (Tests)Здесь нет особых правил, достаточно создать в корне проекта папку Tests, внутри нее создать папки с тестами по тестируемым системам так, как душе угодно.
Подробнее. Tests На картинке изображено как это сделано у меня на проекте: Очень уместным будет создать два «служебных» теста, которые всегда будут запускаться первым и последним. В первом тесте можно выполнять различные действия по настройке среды, в последнем, к примеру, выполнять очистку стенда и запускать нотификацию.Nunit запускает тесты внутри категории в алфавитном порядке (по полному названию классов)Для запуска нотификации необходимо выполнить код:
AT.Service.Notifier.SendNotif (); Также не лишним будет создать класс Environment.cs public static class Environment { } Лично я использую его для хранения различных глобальных переменных и констант. Пример создания страницы (WebPages)Все создаваемые страницы наследуются от базового класса PageBase, который содержит необходимые методы, одинаковые для всех страниц: «открыть», «открыть с параметром», «получить Url».
Пример класса страницы:
public class index__php: PageBase { public void OpenVpdnTab () { new WebElement ().ByXPath (»//a[contains (@href, '#internet')]»).Click (); } public string VpdnAction { get { return new WebElementSelect ().ByXPath (»//select[@name='action']»).GetSelectedValue (); } set { new WebElementSelect ().ByXPath (»//select[@name='action']»).SelectByValue (value); } } public string VpdnLid { set { new WebElement ().ByXPath (»//input[@name='lid']»).SendKeys (value); } } public string VpdnTechlist { set { new WebElement ().ByXPath (»//input[@name='file']»).SendKeys (value); } } public string VpdnStartDate { set { new WebElement ().ByXPath (»//input[@name='start_date']»).SendKeys (value); } } public void VpdnSubmit () { new WebElement ().ByXPath (»//input[@value='Применить']»).Click (); } } Правило: Все элементы, которые присутствуют на странице, должны инициализироваться в момент обращения к ним.Примеры работы со страницами: Pages.Test.Index.Open (); — открытьPages.Test.Index.Open (»? id=1»); — открыть с параметромvar url = Pages.Test.Index.Url; — получение адреса страницыPages.Test.Index.VpdnSubmit (); — запуск функции, прописанной в классе страницы выше
Пример создания тест-кейса (Test)
Как уже отмечалось выше, все тест-кейсы должны лежать в папке Tests.Все тест-кейсы должны быть public и наследоваться от базового класса TestBase.
Перед названием класса с тест-кейсом должен быть указан атрибут [TestFixture].Перед каждым шагом тест-кейса должен быть указан атрибут [Test].
Подробнее об атрибутах тестов можно почитать тут.
Пример класса с тест-кейсом:
namespace TestProject.Tests.OSE { [TestFixture] [Category («OSE»), Category («OSE_Internet»)] /* категории, nunit позволяет запускать тесты выборочно по категориям */ public class test_253750: TestBase { [Test] public void step_01() { Pages.OSE.Inaclogin.Open (); Pages.OSE.Inaclogin.Login = «user»; Pages.OSE.Inaclogin.Password = «password»; Pages.OSE.Inaclogin.Submit ();
Assertion («Ошибка авторизации», () => Assert.AreEqual (Pages.OSE.Inaclogin.IsAuthSuccess, true)); } } Assertion — это проверка выполнения условия.
Формат записи: Assertion (текст ошибки, () => Assert.любой_accert_из_nunit ());
Почему не используем просто Assert? Все Assert«ы отлавливаются специальным классом, в котором выполняются действия по регистрации ошибок, логирования и т.д.
Примеры работы с БД
Для работы с БД используется класс AT.DataBase.Executor, содержащий методы:
Выполнение запросов на выборку (select); Выполнение запросов типа insert, update, delete (unselect); Выполнение хранимых процедур. Примеры: Select:
var query = select col1, col2 from table_name»;
var list = Executor.ExecuteSelect (query, Environment.Имя_БД);
Unselect:
var query = «DELETE FROM table_name»;
Executor.ExecuteUnSelect (query, Environment.Имя_БД);
Выполнение хранимой процедуры:
Executor.ProcedureParamList.Add (new ProcedureParam («varchar», «имя_параметра», «значение»)); /* входной параметр */
Executor.ProcedureParamList.Add (new ProcedureParam («varchar»)); /* возвращаемое значение */
var res = Executor.ExecuteProcedure («имя_процедуры», Environment.Имя_БД);
имя_БД должно соответствовать значению sid из строки инициализации БД в App.config
Как уже упоминалось выше, для запуска нотификации и получения отчета на почту необходимо после запуска последнего теста выполнить код AT.Service.Notifier.SendNotif (); Логика NUnit такова, что он запускает тесты в алфавитном порядке, соответственно чтобы нужный тест запустился последним, его нужно назвать соответствующим образом.
Настройки оповещения указываются в файле App.config.
Пример отчета (он еще сыроват, мало информации):
Autotest Report
000001 Failed step_01: errorСлед. шаг: Шаг не выполнялся, ошибка на предыдущем шагеСлед. шаг: Шаг не выполнялся, ошибка на предыдущем шагеСлед. шаг: Шаг не выполнялся, ошибка на предыдущем шаге Summary: Pass Rate = 0%.Выполнив все пункты этой мини-инструкции юный тестировщик — автоматизатор сможет в короткие сроки создать свой проект и получить тот минимум, который необходим для начала этого пути.
Подведение итогов.Стоит отметить, что предлагаемая система еще окончательно не доделана, есть еще много идей, которые будут реализованы (очень надеюсь на предложения по улучшению от дорогого читателя).Если будет интерес, в следующих статьях я детально опишу работу фреймворка, настройку и запуск тестов.Насчет запуска тестов скажу лишь, что я в работе использую бесплатный teamcity, он, на мой взгляд, очень удобен и прост в освоении.
Надеюсь, что прочтение этого поста оказалось для кого-нибудь полезным.Спасибо за внимание.