Автоматизация тестирования как сервис, Павел Сташевский
Все мы хотим получать качественные сервисы. Мы хотим, чтобы обслуживание было быстрым, качественным и недорогим. Нам важно получить удовольствие от сервиса, будь то парикмахерская или бронирование авиабилетов. Автоматизация тестирования в этом плане практически не отличается от других сервисов, особенно, если она развивается в крупной компании. При этом нужно учесть стек технологий и уровень развития проекта и при этом не наступить на те грабли, что мы собрали при автоматизации тестирования других продуктов. Как строить такой сервис, как его адаптировать под различные команды и получать предсказуемый результат, именно про эти вопросы Павел расскажет в своем докладе. И все это на примерах из 2ГИС.
The document discusses Test Driven Development (TDD) in AngularJS. It provides examples of writing unit tests for an AngularJS password strength controller and directive. The key points are:
1) Examples are given of writing unit tests for an AngularJS password strength controller that tests the grading of password strength based on length.
2) An example directive for adding a greeting is shown, and a test is written to ensure it replaces the element and binds the greeting name correctly.
3) TDD in AngularJS involves writing tests before code, keeping code testable by separating concerns, and using tests to ensure code works as intended. If code is hard to test it likely has design issues
Регрессивное тестирование особенно важно во фронтенд-приложениях, где велика связность сразу трёх технологий: HTML, CSS и JavaScript. Мы расскажем о юнит-тестах, которые проверяют часть приложения (блок, модуль и т.п.) по всем этим параметрам: размеры и другие CSS-свойства; наличие или отсутствие определённых элементов и их атрибутов; отработка кликов и других событий; и многое другое. Покажем примеры тестов, типичные ошибки и реальные баги.
Building scalable applications with angular jsAndrew Alpert
This document discusses best practices for organizing AngularJS applications. It recommends organizing files by feature rather than type, with each feature having related HTML, CSS, tests, etc. It also recommends structuring modules to mirror the URL structure and listing submodules as dependencies. The document discusses using services for reusable logic rather than large controllers. It emphasizes writing tests, managing technical debt, following code style guides, and using task runners like Grunt or Gulp to automate tasks.
Highway to Continuous Integration — Денис Трифонов, 2ГИС2ГИС Технологии
В своем докладе я поделюсь опытом внедрения Continuous Integration в наши процессы. Я расскажу, как мы используем Jenkins в качестве CI-сервера, какие задачи мы решаем с его помощью и с помощью других инструментов.
Вот основные из них:
— развертывание и конфигурирование приложений и тестов с помощью Open Stack и Chef;
— запуск функциональных тестов с помощью PHPUnit и параллельное выполнение с помощью Paratest;
— обновление окружения и тестирование задачи в ветке с последующим вливанием в master-ветку;
— ежедневная регрессия на master-ветке и откат до состояния последнего релиза, а также тестирование развертывания с нуля.
Я затрону интеграцию с JIRA для наших процессов и решения других задач для разработки и тестирования.
В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом.
Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.
Тимофей Чаптыков «Верстальщик должен быть ленивый»DevDay
Большую часть рабочего времени мы занимаемся не написанием новой функциональности, а тестированием, исправлением ошибок, рефакторингом. При этом писать классные фичи всем нравится гораздо больше, чем искать причину очередного хитроумного бага. Как сделать так, чтобы ошибок стало меньше, и мы могли тратить время на то, что доставляет удовольствие?
Регрессивное тестирование особенно важно во фронтенд-приложениях, где велика связность сразу трёх технологий: HTML, CSS и JavaScript. Мы расскажем о юнит-тестах, которые проверяют часть приложения (блок, модуль и т.п.) по всем этим параметрам: размеры и другие CSS-свойства; наличие или отсутствие определённых элементов и их атрибутов; отработка кликов и других событий; и многое другое. Покажем примеры тестов, типичные ошибки и реальные баги.
Building scalable applications with angular jsAndrew Alpert
This document discusses best practices for organizing AngularJS applications. It recommends organizing files by feature rather than type, with each feature having related HTML, CSS, tests, etc. It also recommends structuring modules to mirror the URL structure and listing submodules as dependencies. The document discusses using services for reusable logic rather than large controllers. It emphasizes writing tests, managing technical debt, following code style guides, and using task runners like Grunt or Gulp to automate tasks.
Highway to Continuous Integration — Денис Трифонов, 2ГИС2ГИС Технологии
В своем докладе я поделюсь опытом внедрения Continuous Integration в наши процессы. Я расскажу, как мы используем Jenkins в качестве CI-сервера, какие задачи мы решаем с его помощью и с помощью других инструментов.
Вот основные из них:
— развертывание и конфигурирование приложений и тестов с помощью Open Stack и Chef;
— запуск функциональных тестов с помощью PHPUnit и параллельное выполнение с помощью Paratest;
— обновление окружения и тестирование задачи в ветке с последующим вливанием в master-ветку;
— ежедневная регрессия на master-ветке и откат до состояния последнего релиза, а также тестирование развертывания с нуля.
Я затрону интеграцию с JIRA для наших процессов и решения других задач для разработки и тестирования.
В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом.
Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.
Тимофей Чаптыков «Верстальщик должен быть ленивый»DevDay
Большую часть рабочего времени мы занимаемся не написанием новой функциональности, а тестированием, исправлением ошибок, рефакторингом. При этом писать классные фичи всем нравится гораздо больше, чем искать причину очередного хитроумного бага. Как сделать так, чтобы ошибок стало меньше, и мы могли тратить время на то, что доставляет удовольствие?
Особенности автоматизации тестирования: Single-page vs Multi-page (Seleniumcamp 2013)
1. ОСОБЕННОСТИ
АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Single-page vs. Multi-page
Татьяна Курносова
[email protected]
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