Post on 29-Nov-2014
description
Automation Functional Testing
Андрей РебровТренер по инженерным практикам
Ребров Андрей
• ScrumTrek• Тренер инженерного
направления• Luxoft• Разработчик• Scrum Master
Зачем заниматься автотестами?• Ручное тестирование отнимает много времени• Ручное тестирование приводит к ошибкам• Автоматизация позволяет делать основную работу лучше• Автоматизированное регрессионное тестирование служит «ремнем
безопасности»• Автоматизированные тесты дают возможность получать результаты
раньше• Тесты – это отличное подспорье при разработке как пример• Тесты являются документацией• Автоматизация может дать хорошее ROI
Проблемы автоматизации• Взаимоотношения с программистами• “Hump of Pain” • Начальный вклад• Код, который всегда меняется• «Код по наследству» (Legacy)• Страх• Старые привычки
Взаимоотношения с программистами
The “Hump of Pain”
Начальные вложения
Код, который постоянно меняется
Legacy
Страх
Старые привычки
Как преодолевать препятствия
• Участвует вся команда• TDD• Нужен лидер• Надо менять культуру / отношение к работе
СТРАТЕГИЯ АВТОМАТИЗАЦИИ
Где начать
Автоматизировать или нет
Sprin
t 1
Sprin
t 2
Sprin
t 3
Sprin
t 4
Sprin
t 5
Sprin
t 6
Sprin
t 7
Sprin
t 8
Sprin
t 9
Sprin
t 10
Sprin
t 11
Sprin
t 12
Sprin
t 13
Sprin
t 14
РучноеАвтоматизированноеСлабо автоматизированно
Что стоит автоматизировать
• Continuous Integration, Builds и Deployment• API или Web Service Testing• Тесты «до» GUI• Тестрование GUI• Load Tests• Сравниение• Повторяющие задачи• Генерация данных и настройка
Что не нужно автоматизировать
• Тестирование usability• Исследовательское тестирование
(Exploratory Testing)• Тесты, которые никогда не упадут• Одноразовые тесты
С чего начнем?
Внедрение автоматизации тестирования
• Внедрение невозможно при отсутствии
процесса тестирования
• Надо учесть затраты и выгоды (ROI)
• Выбрать инструмент для автоматизации
• Что должно быть автоматизировано (ROI)
• Определить правила и гайдлайны
Инструменты
Как выбирать инструменты
• Позволяют начать писать тесты сразу же• Позволяют отделить логику тестов от реализации• Позволяют и подталкивают к использованию известных
практик разработки• Позволяют использовать существующие языки
программирования и IDE• Имеют активное сообщество
Принципы
• Keep It Simple (“KISS”)• Чаще запускать ради того, чтобы чаще иметь результат• Вовлечена вся команда• Нужно время, чтобы сделать правиль• Больше практики, меньше теоретики
Принципы при написании кода
• Работа в паре• Рефакторинг• Простой дизайн• Модульность• ООП• Независимость
Структура Selenium 2
Selenium WebDriver
Общая суть работы с WebDriver может быть описана так:• реализуется код, использующий какую-либо
имплементацию WebDriver. Данный код выполняет какие-либо действия с веб-страницей и сравнивает результат с эталонным:
• WebDriver транслирует команды в запущенный браузер (при использовании «браузерной» реализации) и сообщает результаты «обратно в код»
Selenium WebDriver
Локаторы и поиск элементов
• By.id("idOfObject") • By.linkText("TextUsedInTheLink") • By.partialLinkText("partOfThelink") • By.tagName("theHTMLNodeType") • By.className("cssClassOnTheElement")• By.cssSelector("cssSelectorToTheElement") • By.xpath("//Xpath/to/the/element") • By.name("nameOfElement")
WebDriver - Навигация
За навигацию отвечает класс Navigate.• void GoToUrl(string url) – перейти по указанному адресу.
Пример: driver.Navigate().GoToUrl("some_url");• void Back() - вернуться на предыдущую страницу.
Пример: driver.Navigate().Back();• void Forward() - перейти на следующую страницу.
Пример: driver.Navigate().Forward();• void Refresh() - обновить страницу. Пример: driver.Navigate().Refresh().
Работа с окошками
• void Close() - закрыть текущее окно. Закрывает браузер, если нету больше открытых окон;
• void Dispose() - Member of System.IDisposable. С помощью данного метода можно удалять, освобождать или сбрасывать неуправляемые ресурсы;
• Manage() - позволяет изменять настройки драйвера;• void Quit() выход из драйвера, закрытие всех окон связанных с ним;
Работа с WebElement
• WebElement – представление HTML-элемента (тега) вместе с его содержимым
• Действия:– void click() – клик по элементу– void submit() – отправка формы– String getValue() – получение значения элемента– void sendKeys(keysToSend) – ввод текста в input-элемент– void clear() – очистка input-элемента– String getElementName() – получение name элемента– String getAttribute(java.lang.String name) – получение значения
атрибута– boolean toggle() – клик по чекбоксу
Работа с WebElement
• WebElement – представление HTML-элемента (тега) вместе с его содержимым
Действия над элементами страницы:• void Click() - одиночное нажатие по элементу;• string GetAttribute(string attributeName) - возвращает значения атрибута;• string GetCssValue(string propertyName) - возвращает значение свойства
CSS элемента;• void SendKeys(string text) - ввод текста в текстовые поля. При работе с
текстовыми полями можно использовать функциональные клавиши, их работу обеспечивает класс Keys. Например: element.SendKeys("sds" + Keys.Up);
• void Submit() - отправка формы на сервер;
WebDriver
Действия над элементами страницы:• bool Displayed { get; } - возвращает значение, которое указывает на
то, является ли элемент невидимым;• bool Enabled { get; } - возвращает значение, которое указывает на то,
является ли элемент видимым;• System.Drawing.Point Location { get; } - возвращает координаты
элемента;• bool Selected { get; } - возвращает значение, является ли данный
элемент (checkboxes, radio buttons) выбранным;• string TagName { get; } - возвращает имя тега элемента;• string Text { get; } - возвращает innerText элемента (без пробелов);• System.Drawing.Size Size { get; } - вовращает размеры элемента;• void Clear() - очистка содержимого текстового элемента.
WebDriver
Выпадающие списки. Элементы множественного выбора. В WebDriver есть специальный класс SelectElement, который предназначен для упрощения работы с HTML select элементами. Для того, чтобы воспользоваться всеми прелестями данного класса нужно подключить пространство имен OpenQA.Selenium.Support.UI. Данный класс сожержит следующие методы:• public void DeselectAll() - очистить все записи. Использовать только для
элементов множественного выбора (multiple selections);• public void DeselectByIndex(int index) - деактивировать опцию,
используя индекс элемента;• public void DeselectByText(string text) - деактивировать опцию,
используя видимый текст элемента;• public void DeselectByValue(string value) - деактивировать опцию, по
значению элемента;
WebDriver
• public void SelectByIndex(int index) - активировать опцию, используя индекс элемента;
• public void SelectByText(string text) - активировать опцию, используя видимый текст элемента;
• public void SelectByValue(string value) - активировать опцию, по значению элемента;
• public System.Collections.Generic.IList AllSelectedOptions { get; } - возвращает все выбранные опции в пределах текущего элемента;
• public bool IsMultiple { get; } - возвращает значения, является ли данный элемент множественного выбора;
• public System.Collections.Generic.IList Options { get; } - возвращает список опций для выбранного элемента;
• public OpenQA.Selenium.IWebElement SelectedOption { get;} - возвращает значение текущего элемента.
WebDriver
IWebElement element = driver.FindElement(By.Id("submit")); SelectElement select = new SelectElement(driver.FindElement(By.XPath("//select"))); select.DeselectAll(); select.SelectByIndex(1); select.SelectByText("TestText"); select.SelectByValue("Value2"); element.submit();
Еще возможности
• Можно работать с куками• Можно использовать профили для Firefox• Можно выполнять JS на страницах• Поддержка HTML5• И многое другое
Задание
• Пишем тест только с WebDriver• Рефакторим тест - выделяем класс PageObject,
описывающий страницу с которой работали• Рефакторим тест - выделяем хардкод данные в
отдельные DataProvider`ы• Добавляем в тест работу с базой данной.
чтобы из нее брались данные которые пригодятся в тестах (опционально)
• Пишем следующий тест cразу по правилам
Полезные статьи – Автоматизация• Test Automation Pyramid http://goo.gl/MPjLD• Continuous Testing: Building Quality into Your Projects http://
goo.gl/LFQGR• Tester Developers, Developer Testers http://goo.gl/KvcYF• How to Catch Up on Test Automation http://goo.gl/dJRQg
Полезные статьи – Selenium WebDriver
Статьи• Debugging Tips for Selenium Test Failures• Автоматизация тестирования HTML5-приложений на Ruby c
помощью Selenium WebDriver• Functional Testing with Selenium WebDriver and Scala• Selenium Two Tutorial using C#/NUnit and InternetExplorerDriver• A guide to using the python bindings for Selenium/Webdriver
Ребров Андрей
• andrebrov@gmail.com • Twitter: andrebrov• Skype: rebrov.andrey• Блог: andrebrov.net