SlideShare a Scribd company logo
1 of 93
How to Build Your Own Test
Automation Framework?
Dmitry Buzdin
08.12.2017 Moscow
@buzdin
Пару Слов о Докладчике
http://rigadevdays.lv
http://jug.lv https://www.meetup.com/Riga-Test-Automation-Club/
dmitry@buzdin.lv
Из Юрмалы
2005
2013
2016 FREELANCE
Keyword-driven
Cross-platform

Multi-language
Distributed
1000+ users
Scenario-based
Distributed
Cucumber
Selenium
Cloud and Microservices
Мои прелестные
фреймворки!
…
…
Самый первый фреймворк, который я
написал в 2005 году
до сих пор используют…
С годами я понял, что ничего не меняется
Технологии приходят и уходят, но базовые принципы
остаются
О чем это я…
• Что-же такое тестовый фреймворк?
• Из каких компонентов он состоит?
• Что следует принять во внимание при построении
фреймворка?
• Как сделать большой и долгоиграющий фреймворк?
Мы не будем сегодня говорить
о коммерческих тулах*
* но тема тоже к ним относится
Большинство примеров будет
на языке Java*
* не потому что он самый-самый, но и поэтому тоже
Что-же такое тестовый
фреймворк?
Красивый
язык!
Хорошая
расширяемость!
Неплохая
отчетность на
выходе
Много
интеграций!
Как разные люди
видят фреймворк?
Существуют некие
архитектурные
принципы!
ISTQB Generic Test Automation Architecture
https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html
По крайней мере
один нашелся
“В теории нет разницы между практикой и
теорией. На практике разница есть.”
Давайте посмотрим, что-же нам впаривают…
Опустим детали типа ДевОпс,
тестового и проектного менеджмента
Нам интересно само построение
фреймворка
Test Adaptation Layer
GUI
API
Services
Protocols
Databases
Simulators
Emulators
“Test Adaptation” Слой
• Взаимодействие с тестируемой системой
• Абстракция над GUI технологиями: 

Web, Mobile, Desktop, Image Recognition
• Абстракция над протоколами общения:
HTTP, AMQP, SSH, JDBC и т.д.
Тестовые Адаптеры
• Просты в использовании
• Конфигурабельные
• Независимые
• Можно заменить
Пример Адаптера
JmxAdapter adapter = JmxAdapter.builder()
.withHost("http://localhost")
.withPort(5000)
.withContext("context")
.build();
JmxSession session = adapter.connect();
Long memoryUsed = adapter.readMemoryUsed(session);
System.out.println("Used memory is : " + memoryUsed);
Передаем
параметры
Контроль над
ресурсами
Простой АПИ
Оригинальный
JMX АПИ - ужасен!
Page Object* это тоже адаптер
* наверное самый популярный шаблон проектирования тестов на Selenium
Как и клиентская
библиотека REST API
Test Execution Layer
Test Execution
Test Logging
Test Reporting
“Test Execution” Слой
Отвечает за:
• Нахождение тестов
• Запуск тестов
• Сбор отчетности и логов
• Интеграцию с внешними тулами
На примере архитектуры JUnit 5
Test Runner
Test Engine
Может быть
много
реализаций
Ответственность Test Engine
• Предоставляет API для описания тестов
• Находит и запускает тесты
• Определяет точки расширения
Ответственность Test Runner
• Интеграция с IDE, Build и другими тулами
• Интеграция с тестовыми движками
• Запуск тестов в движках согласно процедуре
исполнения
Если эти две компонента независимые,
значит-ли что можно запускать тесты
на удаленной машине?
Зачем Запускать Удаленно?
• Запуск из IDE в другом процессе, чтобы не
убить редактор
• Платформо-зависимые тесты
• Распределенные тестовые сценарии
На примере STAF
http://staf.sourceforge.net/
• Тестовый фреймворк от IBM
• Открытый код
• Кросс-платформенный
• Много-языковой
• Распределенный
Тест “из жизни”
Распределенный
тест основанный
на эвентах
Похоже Source Forge не
выключают именно из-за
этого тестового фреймворка
Test Logging
• Оставляем историю тестов для дальнейшего
анализа
• Предоставляем связку логов с действиями теста
• Хорошее логирование экономит время, деньги и
здоровье!
Не самый лучший вариант…
System.out.println(
“HTTP Result for ” +
req.getUrl() +
“ is ” +
resp.getStatus()
);
• Конкатенация строк :(
• Нет уровней детализации
• Медленное исполнение
• Нет форматирования
Стандартный Подход
private static final Logger logger =
LoggerFactory.getLogger(“NAME”);
logger.info(“Hello, logger!”);
logger.error(“Error!”);
logger.debug(“…”);
https://logback.qos.ch/
Самая популярная
библиотека логов в Java
Пример использования меток MDC
try {
MDC.put(“test-id“, “TMS-1234”);
logger.info(“Starting test”);
logger.debug(“Stopping test”);
} finally {
MDC.clear();
}
2017-12-06 13:03:15.198 INFO [TMS-1234] : Starting test
2017-12-06 13:03:17.245 DEBUG [TMS-1234] : Stopping test
Выведет
Можно добавлять
• Название теста
• Название сьюта
• Идентификатор запуска
Будет
легко найти
Log Management Tools
http://www.elastic.co/products/kibana
https://www.graylog.org/
Зачем Туда?
• Логи не будут утеряны (никто не сотрет)
• Легко доступны
• Мгновенный поиск по логам (ElasticSearch)
Test Reporting
• Результаты тестов хотят видеть разные люди
• Как люди отвечающие за продукт, так и технари
• Хорошая отчетность должна помогать обоим
категориям специалистов!
Allure Framework 2.0
Хочешь отчеты?
Спроси меня как!
Архитектура Allure
HTML Отчет
База
Данных
Результатов
1) Запуск Тестов 2) Генерация Отчета
Allure
Формат
Тула
Allure XML
Формат
Свобода выбора и расширяемость в действии!
Allure
Расширение
Тестовый
Фреймворк
Test Definition Layer
Test Library
Test Procedures
Test Cases
Test Conditions
Test Data
Test Library
• Тестовая Библиотека - набор переиспользуемых
средств для тестирования
• Дает АПИ к тестируемым функциям системы
Test Step
@Step
public void login(String username, String password) {
// performs login
}
@Step
public void navigateToPage(String page) {
// navigates browser to specified page
}
Тестовая Библиотека состоит из Тестовых Шагов
Правильные Шаги
• Тестовый шаг - одно целостное действие с
точки зрения пользователя
• Шаги не зависят друг от друга
• Имеют входные параметры и результат
Test Conditions
Тестовые утверждения должны быть
• Простыми и читаемыми
• Выдавать понятные сообщения об ошибке
• Расширяемыми
Test Conditions == Assertions
AssertJ Fluent Assertions
http://joel-costigliola.github.io/assertj/
assertThat(list).contains("element");
assertThat(list).hasSize(9);
assertThat(list).containsExactlyInAnyOrder("one", "two", "three");
Одна из лучших библиотек утверждений для Java
assertThat(list)
.contains("element")
.hasSize(9)
.containsExactlyInAnyOrder("one", "two", “three");
Эквивалентно
Custom Assertions
class CustomTaskAssert extends AbstractAssert<CustomTaskAssert, Task> {
public static CustomTaskAssert assertThat(Task actual) {
return new CustomTaskAssert(actual);
}
public CustomTaskAssert hasValidDuration() {
if (actual.startTime > actual.endTime) {
failWithMessage("Task %s can not finish (%s) before started (%s)",
actual.name, actual.startTime, actual.endTime);
}
return this;
}
}
assertThat(task).hasValidDuration();Пишем свои
Test Case
• Тестирует конкретный набор требований
• Содержит в себе
• Условия исполнения (Preconditions)
• Условия окончания исполнения (Postconditions)
• Утверждения (Assertions)
• Тестовые данные
• Запуск тестовых шагов
Описание Тестов в Ручном Тестировании
No Test Step Expectation Data
1 User logs in Navigated to home page username=“joe”
2 User selects item Navigated to item page item=“123”
3 User clicks “Add to Cart” Shopping cart updated
4 User clicks “Go To Cart” Navigated to shopping cart
5 User clicks “Checkout” Checkout screen opens
Легко читать

Можно дать коллегам, они разберутся
Некоторые Автоматические Тесты
А где же структура и все такое???
Нормальный Test Case
@Test
public void checkoutTest() {
login(“joe”, “password”);
assertOnPage(“/home”);
viewItem(123);
assertOnPage(“/item.123”);
addToCart();
assertCartItems(1);
goToCart();
…
}
Test Case содержит:
• Тестовые шаги
• Утверждения
• Тестовые данные
Test Procedures
Тестовая Процедура описывает какие тесты и в каком порядке запускать
Также может задавать дополнительные свойства:
• Уровень параллелизма исполнения
• Тестовые данные
• Настройки окружения
Test Procedure == Test Suite
TestNG Test Suite
Рассмотрим на примере
Тот Самый Класс
class UserSettingTest {
Browser browser;
@Test
public void launchSiteAndLogin() {
this.browser = openBrowser(“http://site.com”)
}
@Test
public void openUserSettingPage() {
this.browser.click(“#settings”);
}
@Test
public void changeUserSettings() {
this.browser.input(“#option”);
}
}
Каждый “тест” оставляет
после себя состояние
Последующий “тест“
ожидает, что броузер уже
будет находится на
нужной странице
В Чем Проблема?
• Шаги завязаны друг на друга
• Что если тестовая логика усложнится,
будем программировать на XML?
• Как это поддерживать?
Подрыв Устоев
TestNG Test Suite
TestNG Test Case
Test Suites
Test Cases
Test Steps
Нецелевое использование фреймворка!
Почему так Произошло?
• TestNG слишком мягок с тобой
• TestNG не предоставляет API для шагов
• Тестер не знал теории
От порядка тестов, или количества
потоков в тестовой процедуре
результат должен оставаться
неизменным!
Одно из самых главных правил!
Абстрактные и Конкретные Тесты
• Абстрактные тесты определяют шаблон сценария
• Конкретные совмещают шаблон с тестовыми данными
• Комбинация - шаблон + данные это независимый тест
Пример Тестового Шаблона
Фреймворк должен поддерживать тестовые шаблоны!
@TestTemplate
public void abstractTest(Data data) {
}
Если у всех запусков теста с данными один идентификатор - это неправильно!

Передаем привет TestNG!
Test Data
• Тестовые данные определяют входные
параметры для шаблонов тестовых сценариев
• Тестовые данные могут приходить в разных
форматах и из разных источников
JUnit 5 Загрузка из CSV Файла
@ParameterizedTest
@CsvFileSource(resources = "/data/users.csv")
public void simpleTest(String user, String password, Integer id) {
logger.info("{}:{}:{}", user, password, id);
}
В CSV Решении JUnit 5 не хватает
• Подгрузки значений по заголовку колонок
• Комбинации многих файлов данных (перемножения)
• Достаточного количества конверторов
• Работы с типизированными классами данных
• Шаблонизирования значений ячеек
JUnit 5 Custom Data Provider
@ParameterizedTest
@MethodSource("custom")
public void simpleTest(String username, String password, Integer id) {
logger.info("{}:{}:{}", user, password, id);
}
static Object[][] custom() {
return new Object[][]{{"user", "password", 1}};
}
Можно легко реализовать свой провайдер данных и нехватающие функции
И это не единственный АПИ
“Другие" Данные
• Генерация данных на ходу в случае долгоиграющего, либо
комбинаторного теста
• Получение данных из внешней системы
• Синхронизация с эмулятором
• Распределение данных между параллельными тестами
• Нет хорошей отчетности
• Отсутствует нормальная работа с данными
• Но это не значит, что он плохой…
• Он дает вам возможность написать свои расширения!
• И не мешает жить так, как хочется, как делают другие
популярные фреймворки
Он просто написан правильно с
точки зрения структуры!
Блоки Построения Тестов
Test Procedure / Test Suites
Test Cases
Test Steps
Test Adapters
Assertions
Test Data
Годится для
большинства
фреймворков
Пример
@Test
public void saveAccountLedger() {
AccountLedger ac = new AccountLedger(“1234391”, …);
String accountLedgerId = myTestSteps.saveAccountLedger(ac);
assertThat(accountLedgerId).IsNotNull();
myTestSteps.validateAccountLedgerExists(accountLedgerId);
}
class MyTestSteps {
@Step
public String saveAccountLedger(AccountLedger al) {
LedgerPageObject page = navigator.goToPage(“/ledgers”)
page.saveNewRecord(al);
String notification = page.checkNotification();
return extractAcountLedgerIdFromMessage(notification);
}
}
Тестовый шаг
это посредник
между тестом и
Page Object
Есть еще кое-что в тестовом
фреймворке!
Язык Тестов
Можно писать тесты на
•Gherkin
•Java/Groovy/Kotlin
•Excel
•HTML
•Markdown
А разве фреймворк не тянет за
собой язык?
Тест на JUnit 5
@Test
public void ensureAllFieldsAreDisabledForUser() {
goToPage(“/login“);
login(“janedoe”, “password”);
assertPage(“/home”);
logout();
}
Язык Тестов Gherkin
Test
Step
Test Conditions
Test
Step
Test
Case
Эквивалентен предыдущему
Описание Шага в Cucumber-Java
@Then(“^I login with user (.*) and password (.*)$")
public void login(String username, String password) {
myTestSteps.login(username, password);
}
Переиспользуем те-же тестовые шаги и адаптеры
Многоязычный Фреймворк
Gherkin Test Cases
Plain Java Test Steps
Test Adapters
JUnit 5 Test Cases
Cucumber Step Defs
А что, нельзя определиться?
“Огурец” - не диагноз!
Плюсы Минусы
Наглядно читаем
Стабилизация языка
занимает время
Прост в освоении Сложности с рефакторингом
Легко составлять новые
тесты по примеру
Нетривиальные сценарии не
ложатся на BDD модель
Если ядро фреймворка
независимое от языка,
мы не ставим все на “красное”
Простая Стратегия
Не думаю!Тест
Структурно
Сложный?
Да!
Cucumber
Java
Что Такое “Сложный” Тест?
• Многопоточность
• Обработка событий
• Сложные манипуляции с данными
Переходим к
Выводам
Какие бывают фреймворки?
Это все просто компоненты,
которые могут быть совмещены в
рамках архитектуры
Собираем все вместе
Configuration
Test Reporting Test Engine Assertions
Logging Dependency
Injection
Test Language Test Adapters
Test Runner
Test Data
Успешные фреймворки всегда
собираются из готовых
ингредиентов
Мой Последний Java Рецепт
Компонент Технология
Test Engine JUnit 5 + extensions
Test Reporting Allure 2 + extensions
Assertions AssertJ + extensions
Configurations OWNER
Test Language Cucumber-JVM, Java
Logging Logback + ELK
Test Adapters HttpClient, Selenide, Wiremock
Dependency Injection Guice
Data-Driven JUnit 5 + extensions
Именно правильная структура
определяет “долголетие” и
“крутость” фреймворка
Хоть раз в жизни соберите свой
фреймворк из готовых кусочков!
Придерживайтесь Стандартов
• Язык Gherkin
• Протокол WebDriver
• Платформа JUnit 5
• Формат отчетов Allure
https://www.w3.org/TR/webdriver/
https://cucumber.io/docs/reference#gherkin
http://junit.org/junit5/
https://docs.qameta.io/allure/latest/
Отдавайте предпочтение легко
расширяемым инструментам!
Посмотрите как делают другие
• Посмотрите на нишевые фреймворки
• Статьи за 2005 год не потеряли актуальность!
Как показывает практика -
практика все-же
базируется на теории!
https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html
«Все успешные фреймворки похожи
друг на друга, каждый неудачный
фреймворк несчастлив по-своему.»
Перефразируя классика
Подключаем Адаптер к Фреймворку
Адаптеры более
долговечны чем
сами
фреймворки
Крутой
Фреймворк
Адаптер
Протокола Х
Более Крутой
Фреймворк
Модуль Связка Модуль Связка
Тут находятся
плугины
такие как
EventListeners

More Related Content

What's hot

Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイド
Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイドOracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイド
Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイドオラクルエンジニア通信
 
Terraform in production - experiences, best practices and deep dive- Piotr Ki...
Terraform in production - experiences, best practices and deep dive- Piotr Ki...Terraform in production - experiences, best practices and deep dive- Piotr Ki...
Terraform in production - experiences, best practices and deep dive- Piotr Ki...PROIDEA
 
Application Modernization: Migrating Mainframe Apps to the Cloud Using Spring
Application Modernization: Migrating Mainframe Apps to the Cloud Using SpringApplication Modernization: Migrating Mainframe Apps to the Cloud Using Spring
Application Modernization: Migrating Mainframe Apps to the Cloud Using SpringVMware Tanzu
 
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)オラクルエンジニア通信
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0オラクルエンジニア通信
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例gree_tech
 
How to Build a Telegraf Plugin by Noah Crowley
How to Build a Telegraf Plugin by Noah CrowleyHow to Build a Telegraf Plugin by Noah Crowley
How to Build a Telegraf Plugin by Noah CrowleyInfluxData
 
Azure vm の可用性を見直そう
Azure vm の可用性を見直そうAzure vm の可用性を見直そう
Azure vm の可用性を見直そうShuheiUda
 
Infrastructure & System Monitoring using Prometheus
Infrastructure & System Monitoring using PrometheusInfrastructure & System Monitoring using Prometheus
Infrastructure & System Monitoring using PrometheusMarco Pas
 
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!株式会社クライム
 
Rac rac one_node説明資料
Rac rac one_node説明資料Rac rac one_node説明資料
Rac rac one_node説明資料Hiroki Morita
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Masayuki Ozawa
 
Share UIカスタマイズ Widget編
Share UIカスタマイズ Widget編Share UIカスタマイズ Widget編
Share UIカスタマイズ Widget編MoritakaSoma
 
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)NTT DATA Technology & Innovation
 
SRE Conference 2022 - How to Build a Healthy On-Call Culture
SRE Conference 2022 - How to Build a Healthy On-Call CultureSRE Conference 2022 - How to Build a Healthy On-Call Culture
SRE Conference 2022 - How to Build a Healthy On-Call Culturesmalltown
 

What's hot (20)

Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイド
Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイドOracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイド
Oracle Cloud Platform:IDCSを使ったアイデンティティ・ドメイン管理者ガイド
 
Terraform in production - experiences, best practices and deep dive- Piotr Ki...
Terraform in production - experiences, best practices and deep dive- Piotr Ki...Terraform in production - experiences, best practices and deep dive- Piotr Ki...
Terraform in production - experiences, best practices and deep dive- Piotr Ki...
 
Application Modernization: Migrating Mainframe Apps to the Cloud Using Spring
Application Modernization: Migrating Mainframe Apps to the Cloud Using SpringApplication Modernization: Migrating Mainframe Apps to the Cloud Using Spring
Application Modernization: Migrating Mainframe Apps to the Cloud Using Spring
 
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
Oracle GoldenGate EM Plugin 13c セットアップガイド
Oracle GoldenGate EM Plugin 13c セットアップガイドOracle GoldenGate EM Plugin 13c セットアップガイド
Oracle GoldenGate EM Plugin 13c セットアップガイド
 
How to Build a Telegraf Plugin by Noah Crowley
How to Build a Telegraf Plugin by Noah CrowleyHow to Build a Telegraf Plugin by Noah Crowley
How to Build a Telegraf Plugin by Noah Crowley
 
Oracle GoldenGate導入Tips
Oracle GoldenGate導入TipsOracle GoldenGate導入Tips
Oracle GoldenGate導入Tips
 
Azure vm の可用性を見直そう
Azure vm の可用性を見直そうAzure vm の可用性を見直そう
Azure vm の可用性を見直そう
 
Infrastructure & System Monitoring using Prometheus
Infrastructure & System Monitoring using PrometheusInfrastructure & System Monitoring using Prometheus
Infrastructure & System Monitoring using Prometheus
 
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!
Nutanix AHV環境もVeeamでがっちりバックアップ! 進化を遂げた新機能をご紹介!
 
Rac rac one_node説明資料
Rac rac one_node説明資料Rac rac one_node説明資料
Rac rac one_node説明資料
 
Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果Sql server よく聞く設定とその効果
Sql server よく聞く設定とその効果
 
Share UIカスタマイズ Widget編
Share UIカスタマイズ Widget編Share UIカスタマイズ Widget編
Share UIカスタマイズ Widget編
 
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
 
SRE Conference 2022 - How to Build a Healthy On-Call Culture
SRE Conference 2022 - How to Build a Healthy On-Call CultureSRE Conference 2022 - How to Build a Healthy On-Call Culture
SRE Conference 2022 - How to Build a Healthy On-Call Culture
 
Storage and Alfresco
Storage and AlfrescoStorage and Alfresco
Storage and Alfresco
 
OCI GoldenGate Overview 2021年4月版
OCI GoldenGate Overview 2021年4月版OCI GoldenGate Overview 2021年4月版
OCI GoldenGate Overview 2021年4月版
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
 

Similar to Как построить свой фреймворк для автотестов?

Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGДмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGDataArt
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Mail.ru Group
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...jazzteam
 
Solit 2013, Эволюция тестирования на Selenium, Мычко Алексей
Solit 2013, Эволюция тестирования на Selenium, Мычко АлексейSolit 2013, Эволюция тестирования на Selenium, Мычко Алексей
Solit 2013, Эволюция тестирования на Selenium, Мычко Алексейsolit
 
Jubula – TDD UI QA Automation Tool
Jubula – TDD UI QA Automation ToolJubula – TDD UI QA Automation Tool
Jubula – TDD UI QA Automation ToolCOMAQA.BY
 
Эволюция автотестирования на Selenium
Эволюция автотестирования на SeleniumЭволюция автотестирования на Selenium
Эволюция автотестирования на SeleniumSQALab
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?Mikalai Alimenkou
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?SQALab
 
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest
 
Решения для автоматизации тестирования Web-приложений на базе Selenium
Решения для автоматизации тестирования Web-приложений на базе SeleniumРешения для автоматизации тестирования Web-приложений на базе Selenium
Решения для автоматизации тестирования Web-приложений на базе SeleniumSQALab
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
 
Simonova CSEDays
Simonova CSEDaysSimonova CSEDays
Simonova CSEDaysLiloSEA
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDaysLiloSEA
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDaysLiloSEA
 
Automation from the trenches
Automation from the trenchesAutomation from the trenches
Automation from the trenchesGleb Rybalko
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQAFest
 

Similar to Как построить свой фреймворк для автотестов? (20)

Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNGДмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...
 
Solit 2013, Эволюция тестирования на Selenium, Мычко Алексей
Solit 2013, Эволюция тестирования на Selenium, Мычко АлексейSolit 2013, Эволюция тестирования на Selenium, Мычко Алексей
Solit 2013, Эволюция тестирования на Selenium, Мычко Алексей
 
Jubula – TDD UI QA Automation Tool
Jubula – TDD UI QA Automation ToolJubula – TDD UI QA Automation Tool
Jubula – TDD UI QA Automation Tool
 
Jmeter
JmeterJmeter
Jmeter
 
Эволюция автотестирования на Selenium
Эволюция автотестирования на SeleniumЭволюция автотестирования на Selenium
Эволюция автотестирования на Selenium
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?
 
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
 
Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
 
Решения для автоматизации тестирования Web-приложений на базе Selenium
Решения для автоматизации тестирования Web-приложений на базе SeleniumРешения для автоматизации тестирования Web-приложений на базе Selenium
Решения для автоматизации тестирования Web-приложений на базе Selenium
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
Simonova CSEDays
Simonova CSEDaysSimonova CSEDays
Simonova CSEDays
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
 
Automation from the trenches
Automation from the trenchesAutomation from the trenches
Automation from the trenches
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
 

More from Dmitry Buzdin

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?Dmitry Buzdin
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?Dmitry Buzdin
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?Dmitry Buzdin
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDmitry Buzdin
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureDmitry Buzdin
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIsDmitry Buzdin
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахDmitry Buzdin
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fmDmitry Buzdin
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIDmitry Buzdin
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsDmitry Buzdin
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional ProgrammingDmitry Buzdin
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contestDmitry Buzdin
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery Dmitry Buzdin
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOpsDmitry Buzdin
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump AnalysisDmitry Buzdin
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test AutomationDmitry Buzdin
 

More from Dmitry Buzdin (20)

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows Machines
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
 
JOOQ and Flyway
JOOQ and FlywayJOOQ and Flyway
JOOQ and Flyway
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
 
Whats New in Java 8
Whats New in Java 8Whats New in Java 8
Whats New in Java 8
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на Одноклассниках
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fm
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part II
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contest
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test Automation
 

Как построить свой фреймворк для автотестов?

  • 1. How to Build Your Own Test Automation Framework? Dmitry Buzdin 08.12.2017 Moscow
  • 2. @buzdin Пару Слов о Докладчике http://rigadevdays.lv http://jug.lv https://www.meetup.com/Riga-Test-Automation-Club/ dmitry@buzdin.lv Из Юрмалы
  • 4. Самый первый фреймворк, который я написал в 2005 году до сих пор используют…
  • 5. С годами я понял, что ничего не меняется Технологии приходят и уходят, но базовые принципы остаются
  • 6. О чем это я… • Что-же такое тестовый фреймворк? • Из каких компонентов он состоит? • Что следует принять во внимание при построении фреймворка? • Как сделать большой и долгоиграющий фреймворк?
  • 7. Мы не будем сегодня говорить о коммерческих тулах* * но тема тоже к ним относится
  • 8. Большинство примеров будет на языке Java* * не потому что он самый-самый, но и поэтому тоже
  • 12. ISTQB Generic Test Automation Architecture https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html По крайней мере один нашелся
  • 13. “В теории нет разницы между практикой и теорией. На практике разница есть.” Давайте посмотрим, что-же нам впаривают…
  • 14. Опустим детали типа ДевОпс, тестового и проектного менеджмента Нам интересно само построение фреймворка
  • 16. “Test Adaptation” Слой • Взаимодействие с тестируемой системой • Абстракция над GUI технологиями: 
 Web, Mobile, Desktop, Image Recognition • Абстракция над протоколами общения: HTTP, AMQP, SSH, JDBC и т.д.
  • 17. Тестовые Адаптеры • Просты в использовании • Конфигурабельные • Независимые • Можно заменить
  • 18. Пример Адаптера JmxAdapter adapter = JmxAdapter.builder() .withHost("http://localhost") .withPort(5000) .withContext("context") .build(); JmxSession session = adapter.connect(); Long memoryUsed = adapter.readMemoryUsed(session); System.out.println("Used memory is : " + memoryUsed); Передаем параметры Контроль над ресурсами Простой АПИ Оригинальный JMX АПИ - ужасен!
  • 19. Page Object* это тоже адаптер * наверное самый популярный шаблон проектирования тестов на Selenium Как и клиентская библиотека REST API
  • 20. Test Execution Layer Test Execution Test Logging Test Reporting
  • 21. “Test Execution” Слой Отвечает за: • Нахождение тестов • Запуск тестов • Сбор отчетности и логов • Интеграцию с внешними тулами
  • 22. На примере архитектуры JUnit 5 Test Runner Test Engine Может быть много реализаций
  • 23. Ответственность Test Engine • Предоставляет API для описания тестов • Находит и запускает тесты • Определяет точки расширения
  • 24. Ответственность Test Runner • Интеграция с IDE, Build и другими тулами • Интеграция с тестовыми движками • Запуск тестов в движках согласно процедуре исполнения
  • 25. Если эти две компонента независимые, значит-ли что можно запускать тесты на удаленной машине?
  • 26. Зачем Запускать Удаленно? • Запуск из IDE в другом процессе, чтобы не убить редактор • Платформо-зависимые тесты • Распределенные тестовые сценарии
  • 27. На примере STAF http://staf.sourceforge.net/ • Тестовый фреймворк от IBM • Открытый код • Кросс-платформенный • Много-языковой • Распределенный
  • 29. Похоже Source Forge не выключают именно из-за этого тестового фреймворка
  • 30. Test Logging • Оставляем историю тестов для дальнейшего анализа • Предоставляем связку логов с действиями теста • Хорошее логирование экономит время, деньги и здоровье!
  • 31. Не самый лучший вариант… System.out.println( “HTTP Result for ” + req.getUrl() + “ is ” + resp.getStatus() ); • Конкатенация строк :( • Нет уровней детализации • Медленное исполнение • Нет форматирования
  • 32. Стандартный Подход private static final Logger logger = LoggerFactory.getLogger(“NAME”); logger.info(“Hello, logger!”); logger.error(“Error!”); logger.debug(“…”); https://logback.qos.ch/ Самая популярная библиотека логов в Java
  • 33. Пример использования меток MDC try { MDC.put(“test-id“, “TMS-1234”); logger.info(“Starting test”); logger.debug(“Stopping test”); } finally { MDC.clear(); } 2017-12-06 13:03:15.198 INFO [TMS-1234] : Starting test 2017-12-06 13:03:17.245 DEBUG [TMS-1234] : Stopping test Выведет Можно добавлять • Название теста • Название сьюта • Идентификатор запуска Будет легко найти
  • 35. Зачем Туда? • Логи не будут утеряны (никто не сотрет) • Легко доступны • Мгновенный поиск по логам (ElasticSearch)
  • 36. Test Reporting • Результаты тестов хотят видеть разные люди • Как люди отвечающие за продукт, так и технари • Хорошая отчетность должна помогать обоим категориям специалистов!
  • 37. Allure Framework 2.0 Хочешь отчеты? Спроси меня как!
  • 38. Архитектура Allure HTML Отчет База Данных Результатов 1) Запуск Тестов 2) Генерация Отчета Allure Формат Тула Allure XML Формат Свобода выбора и расширяемость в действии! Allure Расширение Тестовый Фреймворк
  • 39. Test Definition Layer Test Library Test Procedures Test Cases Test Conditions Test Data
  • 40. Test Library • Тестовая Библиотека - набор переиспользуемых средств для тестирования • Дает АПИ к тестируемым функциям системы
  • 41. Test Step @Step public void login(String username, String password) { // performs login } @Step public void navigateToPage(String page) { // navigates browser to specified page } Тестовая Библиотека состоит из Тестовых Шагов
  • 42. Правильные Шаги • Тестовый шаг - одно целостное действие с точки зрения пользователя • Шаги не зависят друг от друга • Имеют входные параметры и результат
  • 43. Test Conditions Тестовые утверждения должны быть • Простыми и читаемыми • Выдавать понятные сообщения об ошибке • Расширяемыми Test Conditions == Assertions
  • 44. AssertJ Fluent Assertions http://joel-costigliola.github.io/assertj/ assertThat(list).contains("element"); assertThat(list).hasSize(9); assertThat(list).containsExactlyInAnyOrder("one", "two", "three"); Одна из лучших библиотек утверждений для Java assertThat(list) .contains("element") .hasSize(9) .containsExactlyInAnyOrder("one", "two", “three"); Эквивалентно
  • 45. Custom Assertions class CustomTaskAssert extends AbstractAssert<CustomTaskAssert, Task> { public static CustomTaskAssert assertThat(Task actual) { return new CustomTaskAssert(actual); } public CustomTaskAssert hasValidDuration() { if (actual.startTime > actual.endTime) { failWithMessage("Task %s can not finish (%s) before started (%s)", actual.name, actual.startTime, actual.endTime); } return this; } } assertThat(task).hasValidDuration();Пишем свои
  • 46. Test Case • Тестирует конкретный набор требований • Содержит в себе • Условия исполнения (Preconditions) • Условия окончания исполнения (Postconditions) • Утверждения (Assertions) • Тестовые данные • Запуск тестовых шагов
  • 47. Описание Тестов в Ручном Тестировании No Test Step Expectation Data 1 User logs in Navigated to home page username=“joe” 2 User selects item Navigated to item page item=“123” 3 User clicks “Add to Cart” Shopping cart updated 4 User clicks “Go To Cart” Navigated to shopping cart 5 User clicks “Checkout” Checkout screen opens Легко читать
 Можно дать коллегам, они разберутся
  • 48. Некоторые Автоматические Тесты А где же структура и все такое???
  • 49. Нормальный Test Case @Test public void checkoutTest() { login(“joe”, “password”); assertOnPage(“/home”); viewItem(123); assertOnPage(“/item.123”); addToCart(); assertCartItems(1); goToCart(); … } Test Case содержит: • Тестовые шаги • Утверждения • Тестовые данные
  • 50. Test Procedures Тестовая Процедура описывает какие тесты и в каком порядке запускать Также может задавать дополнительные свойства: • Уровень параллелизма исполнения • Тестовые данные • Настройки окружения Test Procedure == Test Suite
  • 52. Тот Самый Класс class UserSettingTest { Browser browser; @Test public void launchSiteAndLogin() { this.browser = openBrowser(“http://site.com”) } @Test public void openUserSettingPage() { this.browser.click(“#settings”); } @Test public void changeUserSettings() { this.browser.input(“#option”); } } Каждый “тест” оставляет после себя состояние Последующий “тест“ ожидает, что броузер уже будет находится на нужной странице
  • 53. В Чем Проблема? • Шаги завязаны друг на друга • Что если тестовая логика усложнится, будем программировать на XML? • Как это поддерживать?
  • 54. Подрыв Устоев TestNG Test Suite TestNG Test Case Test Suites Test Cases Test Steps Нецелевое использование фреймворка!
  • 55. Почему так Произошло? • TestNG слишком мягок с тобой • TestNG не предоставляет API для шагов • Тестер не знал теории
  • 56. От порядка тестов, или количества потоков в тестовой процедуре результат должен оставаться неизменным! Одно из самых главных правил!
  • 57. Абстрактные и Конкретные Тесты • Абстрактные тесты определяют шаблон сценария • Конкретные совмещают шаблон с тестовыми данными • Комбинация - шаблон + данные это независимый тест
  • 58. Пример Тестового Шаблона Фреймворк должен поддерживать тестовые шаблоны! @TestTemplate public void abstractTest(Data data) { } Если у всех запусков теста с данными один идентификатор - это неправильно!
 Передаем привет TestNG!
  • 59. Test Data • Тестовые данные определяют входные параметры для шаблонов тестовых сценариев • Тестовые данные могут приходить в разных форматах и из разных источников
  • 60. JUnit 5 Загрузка из CSV Файла @ParameterizedTest @CsvFileSource(resources = "/data/users.csv") public void simpleTest(String user, String password, Integer id) { logger.info("{}:{}:{}", user, password, id); }
  • 61. В CSV Решении JUnit 5 не хватает • Подгрузки значений по заголовку колонок • Комбинации многих файлов данных (перемножения) • Достаточного количества конверторов • Работы с типизированными классами данных • Шаблонизирования значений ячеек
  • 62. JUnit 5 Custom Data Provider @ParameterizedTest @MethodSource("custom") public void simpleTest(String username, String password, Integer id) { logger.info("{}:{}:{}", user, password, id); } static Object[][] custom() { return new Object[][]{{"user", "password", 1}}; } Можно легко реализовать свой провайдер данных и нехватающие функции И это не единственный АПИ
  • 63. “Другие" Данные • Генерация данных на ходу в случае долгоиграющего, либо комбинаторного теста • Получение данных из внешней системы • Синхронизация с эмулятором • Распределение данных между параллельными тестами
  • 64. • Нет хорошей отчетности • Отсутствует нормальная работа с данными • Но это не значит, что он плохой… • Он дает вам возможность написать свои расширения! • И не мешает жить так, как хочется, как делают другие популярные фреймворки
  • 65. Он просто написан правильно с точки зрения структуры!
  • 66. Блоки Построения Тестов Test Procedure / Test Suites Test Cases Test Steps Test Adapters Assertions Test Data Годится для большинства фреймворков
  • 67. Пример @Test public void saveAccountLedger() { AccountLedger ac = new AccountLedger(“1234391”, …); String accountLedgerId = myTestSteps.saveAccountLedger(ac); assertThat(accountLedgerId).IsNotNull(); myTestSteps.validateAccountLedgerExists(accountLedgerId); } class MyTestSteps { @Step public String saveAccountLedger(AccountLedger al) { LedgerPageObject page = navigator.goToPage(“/ledgers”) page.saveNewRecord(al); String notification = page.checkNotification(); return extractAcountLedgerIdFromMessage(notification); } } Тестовый шаг это посредник между тестом и Page Object
  • 68. Есть еще кое-что в тестовом фреймворке!
  • 69. Язык Тестов Можно писать тесты на •Gherkin •Java/Groovy/Kotlin •Excel •HTML •Markdown
  • 70. А разве фреймворк не тянет за собой язык?
  • 71. Тест на JUnit 5 @Test public void ensureAllFieldsAreDisabledForUser() { goToPage(“/login“); login(“janedoe”, “password”); assertPage(“/home”); logout(); }
  • 72. Язык Тестов Gherkin Test Step Test Conditions Test Step Test Case Эквивалентен предыдущему
  • 73. Описание Шага в Cucumber-Java @Then(“^I login with user (.*) and password (.*)$") public void login(String username, String password) { myTestSteps.login(username, password); } Переиспользуем те-же тестовые шаги и адаптеры
  • 74. Многоязычный Фреймворк Gherkin Test Cases Plain Java Test Steps Test Adapters JUnit 5 Test Cases Cucumber Step Defs
  • 75. А что, нельзя определиться?
  • 76. “Огурец” - не диагноз! Плюсы Минусы Наглядно читаем Стабилизация языка занимает время Прост в освоении Сложности с рефакторингом Легко составлять новые тесты по примеру Нетривиальные сценарии не ложатся на BDD модель
  • 77. Если ядро фреймворка независимое от языка, мы не ставим все на “красное”
  • 79. Что Такое “Сложный” Тест? • Многопоточность • Обработка событий • Сложные манипуляции с данными
  • 81. Какие бывают фреймворки? Это все просто компоненты, которые могут быть совмещены в рамках архитектуры
  • 82. Собираем все вместе Configuration Test Reporting Test Engine Assertions Logging Dependency Injection Test Language Test Adapters Test Runner Test Data
  • 83. Успешные фреймворки всегда собираются из готовых ингредиентов
  • 84. Мой Последний Java Рецепт Компонент Технология Test Engine JUnit 5 + extensions Test Reporting Allure 2 + extensions Assertions AssertJ + extensions Configurations OWNER Test Language Cucumber-JVM, Java Logging Logback + ELK Test Adapters HttpClient, Selenide, Wiremock Dependency Injection Guice Data-Driven JUnit 5 + extensions
  • 85. Именно правильная структура определяет “долголетие” и “крутость” фреймворка
  • 86. Хоть раз в жизни соберите свой фреймворк из готовых кусочков!
  • 87. Придерживайтесь Стандартов • Язык Gherkin • Протокол WebDriver • Платформа JUnit 5 • Формат отчетов Allure https://www.w3.org/TR/webdriver/ https://cucumber.io/docs/reference#gherkin http://junit.org/junit5/ https://docs.qameta.io/allure/latest/
  • 89. Посмотрите как делают другие • Посмотрите на нишевые фреймворки • Статьи за 2005 год не потеряли актуальность!
  • 90. Как показывает практика - практика все-же базируется на теории! https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html
  • 91. «Все успешные фреймворки похожи друг на друга, каждый неудачный фреймворк несчастлив по-своему.» Перефразируя классика
  • 92.
  • 93. Подключаем Адаптер к Фреймворку Адаптеры более долговечны чем сами фреймворки Крутой Фреймворк Адаптер Протокола Х Более Крутой Фреймворк Модуль Связка Модуль Связка Тут находятся плугины такие как EventListeners