More than Just Lines on a Map: Best Practices for U.S Bike Routes
Особенности автоматизации тестирования: Single-page vs Multi-page (Seleniumcamp 2013)
1. ОСОБЕННОСТИ
АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Single-page vs. Multi-page
Татьяна Курносова
t.kurnosova@2gis.ru
1-2 марта 2013 г., Киев, Украина
Saturday, 2 January, 13
2. 2ГИС СЕГОДНЯ
• > 200 городов
(Новосибирск, Москва, Одесса, Падуя, …)
• 4 страны (Россия, Казахстан, Украина, Италия)
• > 20 млн. пользователей (desktop, online, mobile)
WWW.2GIS.RU
Saturday, 2 January, 13
3. ТЕСТИРОВАНИЕ В 2ГИС
Quality Assurance
2GIS Online
QA Team
Developer
2GIS API
in Test
QA Team Team
Flamp
QA Team
WWW.2GIS.RU
Saturday, 2 January, 13
4. ТЕСТИРОВАНИЕ В 2ГИС
Quality Assurance
2GIS Online
Ручное и автоматизированное
QA Team
Developer
2GIS API
in Test
QA Team Team
тестирование
Flamp
QA Team
• Разработка фреймворков
• Обучение тестировщиков
WWW.2GIS.RU
Saturday, 2 January, 13
5. ИСТОРИЯ РОЖДЕНИЯ ФРЕЙМВОРКОВ
maps.2gis.ru flamp.ru
Single-page Multi-page
Электронный справочник (карты +
справочный контент) Сервис отзывов о компаниях
городов России
Поставщиком справочных данных является
сервис справочного API (api.2gis.ru)
WWW.2GIS.RU
Saturday, 2 January, 13
6. ИСТОРИЯ РОЖДЕНИЯ ФРЕЙМВОРКОВ
maps.2gis.ru flamp.ru
Автоматизация тестирования продуктов
• Создать фреймворки для автоматизации тестирования двух
продуктов (SPA и MPA)
• Покрыть базовый функционал автотестами
• Single-Page Application (SPA)
за минимальное время
• Multi-Page Application (MPA)
WWW.2GIS.RU
Saturday, 2 January, 13
7. ТРЕБОВАНИЯ К ТЕСТОВЫМ ФРЕЙМВОРКАМ
• Простая архитектура – лёгкость в освоении
для тестировщиков
Архитектурный стиль
KISS – Keep It Short
• Компактные тесты – минимум LOC
and Simple
• Устойчивость к изменениям, расширяемость
WWW.2GIS.RU
Saturday, 2 January, 13
17. PAGE COMPONENT
class ReviewForm()
{
public function __construct($test)
{
$this->reviewText = $test->byId('at_text');
$this->reviewRating = $test->byId('at_rating');
$this->reviewSubmit = $test->byId('at_submit');
}
public function fill($text, $rating)
{
$this->reviewText->value($text);
$this->reviewRating->value($rating);
}
public function submit()
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
18. PAGE OBJECT
class ReviewPage
{
public function __construct($test)
{
$this->authForm = $this->getAuthForm();
$this->reviewForm = $this->getReviewForm();
$this->reviewsList = $this->getReviewsList();
/* ... */
}
public function addReview($text, $rating)
{
$this->reviewForm->fill($text, $rating);
$this->reviewForm->submit();
return $this;
}
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
19. ПРИМЕР ТЕСТА “ДОБАВЛЕНИЕ ОТЗЫВА”
public function testAddReviewAndCheckInTheList()
{
$this->url('...');
$page = new ReviewPage();
$count = $page->getReviewsCount();
$page = $page->addReview($text, $rating);
$this->assertEquals(
$count + 1,
$page->getReviewsCount()
);
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
20. ПРИМЕР ТЕСТА “ДОБАВЛЕНИЕ ОТЗЫВА”
public function testAddReviewAndCheckInTheList()
{
$this->url('...');
$page = new ReviewPage();
$count = $page->getReviewsCount();
$page = $page->addReview($text, $rating);
$this->assertEquals(
$count + 1,
$page->getReviewsCount()
);
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
21. PAGE OBJECT – КЛАССИКА
PageObject
PageObject
PageObject
ReviewForm
ReviewForm
ReviewForm
Для тестирования новой страницы
нужно повторно инициализировать
компоненты страницы: ReviewForm, ...
WWW.2GIS.RU
Saturday, 2 January, 13
22. НОВАЯ СТРУКТУРА
• Widget – это функциональный блок
страницы
SearchWidget • Тесты создаются на основе Widget’ов,
а не страниц
• Повторное использование кода
• Проще архитектура
ReviewWidget
WWW.2GIS.RU
Saturday, 2 January, 13
23. ПРИМЕР ТЕСТА “ДОБАВЛЕНИЕ ОТЗЫВА”
public function testAddReviewAndCheckInTheList()
{
$this->openReviewPage();
• Переходим на страницу отзывов о компании
$count = $this->review->count();
$this->review->add($text, $rating, $user);
• Смотрим сколько отзывов уже добавлено
$this->assertEquals($count + 1,
• Добавляем тестовый отзыв
$this->review->count()
);
• Проверяем что он появился
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
24. ПРИМЕР ТЕСТА “ДОБАВЛЕНИЕ ОТЗЫВА”
public function testAddReviewAndCheckInTheList()
{
$this->openReviewPage();
$count = $this->review->count();
$this->review->add($text, $rating, $user);
$this->assertEquals($count + 1,
$this->review->count()
);
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
26. MAPS.2GIS.RU
Особенности приложения
• Большинство элементов страницы создаются динамически
• Картографические элементы создаются при помощи
картографического API
WWW.2GIS.RU
Saturday, 2 January, 13
28. PAGE OBJECT – КЛАССИКА
class OnlinePage
{
public function __construct($test)
{
$this->searchForm = $this->getSearchFormComponent();
$this->catalog = $this->getCatalogComponent();
$this->balloon = $this->getBalloonComponent();
/* ... */
}
public function search($what, $where)
{
$this->searchForm->fill($what, $where);
$this->searchForm->submit();
return $this;
}
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
29. PAGE OBJECT – КЛАССИКА
class OnlinePage
{
public function __construct($test)
{
$this->searchForm = $this->getSearchFormComponent();
$this->catalog = $this->getCatalogComponent();
$this->balloon = $this->getBalloonComponent();
/* ... */
}
public function search($what, $where)
{
$this->searchForm->fill($what, $where);
$this->searchForm->submit();
return $this;
}
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
30. ПРИМЕР ТЕСТА “СМЕНА ГОРОДА”
public function testSelectCity()
{
$page = $this->getPage();
$page->citySelect->select('Новосибирск');
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
31. КОМПОНЕНТЫ
Page • Объект Page
SearchForm реализует доступ
Catalog к компонентам
Catalog, SearchForm
и др.
• Тест-кейсы
реализуются при
помощи операций
Balloon с объектом Page
и его компонентами
WWW.2GIS.RU
Saturday, 2 January, 13
32. ПРИМЕР ТЕСТА “ПОЯВЛЕНИЕ BALLOON”
public function testSelectFirmAndShowBalloon()
{
$page = $this->getPage();
• Выбираем город
$page->selectCity('Новосибирск');
$page->searchForm->send(...);
• Выполняем поиск организации (“что” , “где”)
$firm = $page->catalog->getFirm();
• Выбираем случайную фирму из справочника и кликаем по ней
$firm->click();
$this->assertNotNull(
• Проверяем, что объект balloon отобразился на карте
$page->map->getBalloon());
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
33. ПРИМЕР ТЕСТА “ПОЯВЛЕНИЕ BALLOON”
public function testSelectFirmAndShowBalloon()
{
$page = $this->getPage();
$page->selectCity('Новосибирск');
$page->searchForm->send(...);
$firm = $page->catalog->getRandomFirm();
$firm->click();
$this->assertNotNull(
$page->map->getBalloon());
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
35. СНИМОК СОСТОЯНИЯ
• Состояние – это текущие (runtime) параметры
всех компонентов страницы
• Состояния позволяют проверять корректность работы коротких
ссылок
Saturday, 2 January, 13
36. ТЕСТ “КОРОТКАЯ ССЫЛКА”
public function testShortLink()
{
/* ... */
• Формируем тестовое состояние
$state = $this->page->createState();
/*
• Создаём короткую ссылку and open it
* Create short link
*/
• Переходим по короткой ссылке
$this->assertEquals($state,
• Сравниваем $this->page->createState());
состояния
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
37. ТЕСТ “КОРОТКАЯ ССЫЛКА”
public function testShortLink()
{
/* ... */
$state = $this->page->createState();
/*
* Create short link and open it
*/
$this->assertEquals($state,
$this->page->createState());
/* other asserts */
}
WWW.2GIS.RU
Saturday, 2 January, 13
38. ИНТЕГРАЦИЯ С TMS
/**
* Проверка Example feature
* - step1
* - step2
* @suite Example
* @section Example feature
*/
public function testExample()
{
/* ... */
}
WWW.2GIS.RU
Saturday, 2 January, 13
39. KEEP IT SHORT AND SIMPLE
2GisOnlineTestFramework Widget Test
Component Page Test FlampTestFramework
WWW.2GIS.RU
Saturday, 2 January, 13
40. ЗАКЛЮЧЕНИЕ
• Простота в использовании фреймворков позволила подключить к
автоматизации тестировщиков продуктов
• Основной функционал продуктов покрыт автотестами
• Простая архитектура фреймворков позволила тестировщикам
поддерживать и развивать фреймворки
WWW.2GIS.RU
Saturday, 2 January, 13
41. СПАСИБО ЗА ВНИМАНИЕ!
Татьяна Курносова
t.kurnosova@2gis.ru
@tanyfromsiberia
1-2 марта 2013 г., Киев, Украина
Saturday, 2 January, 13