Об автоматических тестах писал ещё Сам Кент Бек. Ну, а автоматические функциональные тесты — это вообще лакомый кусок для современных agile методик разработки ПО. Вместе с участниками кемпа мы узнаем, с какой стороны подходить к процессу автоматизации тестирования в целом. Кроме того, мы создадим проект автотестирования с использованием одного из самых популярных продуктов для тестирования веб-приложений — Selenium 2.
2. Ребров Андрей
• ScrumTrek
• Тренер инженерного
направления
• Luxoft
• Разработчик
• Scrum Master
3. Зачем заниматься автотестами?
• Ручное тестирование отнимает много времени
• Ручное тестирование приводит к ошибкам
• Автоматизация позволяет делать основную работу лучше
• Автоматизированное регрессионное тестирование служит «ремнем
безопасности»
• Автоматизированные тесты дают возможность получать результаты
раньше
• Тесты – это отличное подспорье при разработке как пример
• Тесты являются документацией
• Автоматизация может дать хорошее ROI
4. Проблемы автоматизации
• Взаимоотношения с программистами
• “Hump of Pain”
• Начальный вклад
• Код, который всегда меняется
• «Код по наследству» (Legacy)
• Страх
• Старые привычки
17. Что стоит автоматизировать
• Continuous Integration, Builds и Deployment
• API или Web Service Testing
• Тесты «до» GUI
• Тестрование GUI
• Load Tests
• Сравниение
• Повторяющие задачи
• Генерация данных и настройка
18. Что не нужно автоматизировать
• Тестирование usability
• Исследовательское тестирование
(Exploratory Testing)
• Тесты, которые никогда не упадут
• Одноразовые тесты
20. Внедрение автоматизации
тестирования
• Внедрение невозможно при отсутствии
процесса тестирования
• Надо учесть затраты и выгоды (ROI)
• Выбрать инструмент для автоматизации
• Что должно быть автоматизировано (ROI)
• Определить правила и гайдлайны
22. Как выбирать инструменты
• Позволяют начать писать тесты сразу же
• Позволяют отделить логику тестов от реализации
• Позволяют и подталкивают к использованию известных
практик разработки
• Позволяют использовать существующие языки
программирования и IDE
• Имеют активное сообщество
23. Принципы
• Keep It Simple (“KISS”)
• Чаще запускать ради того, чтобы чаще иметь результат
• Вовлечена вся команда
• Нужно время, чтобы сделать правиль
• Больше практики, меньше теоретики
24. Принципы при написании кода
• Работа в паре
• Рефакторинг
• Простой дизайн
• Модульность
• ООП
• Независимость
26. Selenium WebDriver
Общая суть работы с WebDriver может быть описана
так:
• реализуется код, использующий какую-либо
имплементацию WebDriver. Данный код выполняет
какие-либо действия с веб-страницей и сравнивает
результат с эталонным:
• WebDriver транслирует команды в запущенный
браузер (при использовании «браузерной»
реализации) и сообщает результаты «обратно в
код»
29. 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().
30. Работа с окошками
• void Close() - закрыть текущее окно. Закрывает браузер, если нету
больше открытых окон;
• void Dispose() - Member of System.IDisposable. С помощью данного
метода можно удалять, освобождать или сбрасывать
неуправляемые ресурсы;
• Manage() - позволяет изменять настройки драйвера;
• void Quit() выход из драйвера, закрытие всех окон связанных с ним;
31. Работа с 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() – клик по чекбоксу
32. Работа с 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() - отправка формы на сервер;
33. 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() - очистка содержимого текстового элемента.
34. 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) - деактивировать опцию, по
значению элемента;
35. 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;} -
возвращает значение текущего элемента.
36. 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();
37. Еще возможности
• Можно работать с куками
• Можно использовать профили для Firefox
• Можно выполнять JS на страницах
• Поддержка HTML5
• И многое другое
38. Задание
• Пишем тест только с WebDriver
• Рефакторим тест - выделяем
класс PageObject, описывающий страницу с
которой работали
• Рефакторим тест - выделяем хардкод данные в
отдельные DataProvider`ы
• Добавляем в тест работу с базой данной.
чтобы из нее брались данные которые
пригодятся в тестах (опционально)
• Пишем следующий тест cразу по правилам
39. Полезные статьи – Автоматизация
• 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
40. Полезные статьи – 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