Регулярно обновляем программу, учим только актуальному
1
Intro to QA.GURU Java Advanced v.2.0
Тестируем полностью самописное приложение в суперсовременном стеке (Java 21, Spring Boot 3, Spring Security 6, Spring Data, OAuth2, gRPC, GraphQL, Microservices, Docker, Postgres, React)
Научим не просто понимать, как написать автотест на GraphQL, но и разберемся в том, как это работает под капотом
Вы узнаете, как сделать запрос в БД из теста и зачем это может быть нужно в микросервисной архитектуре
Будем подменять настоящие микросервисы на Wiremock на практике
2
Знакомство с проектом, локальный запуск, введение в учебный процесс
Обзор проекта Niffler
Необходимые предусловия для работы с проектом
Запуск локально: настройка в Idea Ultimate, Community
Необходимые предусловия для запуска проекта в docker, отличия для Windows и Nix
Запуск проекта в докере
Выполнение домашних заданий
3
Введение в JUnit Extensions: Callbacks, место Extension в жизненном цикле теста JUnit 5
Интерфейсы BeforeEachCallback, AfterEachCallback и другие callback
Погружение в JUnit Extensions: ExtensionContext, интерфейс ParameterResolver. Создание Extension "очередь тестовых пользователей"
Интерфейсы ExtensionContext и Store
Концепция шэринга данных через Store + Namespace
Создаем threadsafe очередь пользователей – UsersQueueExtension
5
Интеграция JUnit Extensions в проект с тестами: Метааннотации, 3 способа подключения, QA сессия по введению в JUnit Extensions
- Работа с аннотациями в Extensions, класс AnnotationSupport - Метааннотации - ServiceLoader и глобальное подключение Extensions - Аннотация @RegisterExtension - Q&A сессия
6
Работаем с реляционными базами данных из тестов: Погружение в JDBC
- Краткая теория JDBC - Интерфейсы DataSource, Connection, Statement, PreparedStatement, ResultSet - Реализация SpendRepositryJdbc - Вставка данных в БД (sql INSERT) через JDBC - Возврат ID созданной записи
7
JDBC: Репозитории и транзакции. Модификация данных в БД
- Понятие Repository, создание UserRepository - Транзакции в JDBC - Реализация UserRepositoryJDBC - Модификация данных в БД
8
Библиотека Spring-JDBC для работы с БД: базовые концепции
- JDBC-Template: теория и применимость - Реализация простых запросов (CRUD) c помощью библиотеки Spring-JDBC
9
Библиотека Spring-JDBC - работа с ключами, транзакции, адаптеры
- Класс TransactionTemplate - Интерфейс PreparedStatementCreator - Реализация UserRepositorySpringJdbc
10
Библиотека Hibernate и введение в спецификацию JPA
- Hibernate и JPA - краткая теория - Интерфейсы EntityManagerFactory и EntityManager - Декораторы для EntityManager: интерфейс EntityTransaction и использование ThreadLocal EntityManager
11
Библиотека Hibernate: интеграция с тестовым проектом
- Конфигурационный файл persistence.xml - Реализация UserRepositoryHibernate - Особенности использования Hibernate - работа с коллекциями, ленивая инициализация
12
Использование созданных UserRepository и SpendRepository внутри JUnitExtensions. QA сессия по работе с БД
- Создание аннотации @TestUser и Extension AbstractTestUserExtension - Наследование Extension: создание класса DbTestUserExtension - Реализация логики создание тестового пользователя: хэширование пароля, создание в БД нескольких микросервисов - Передача пользователя в тест через ParameterResolver - Q&A сессия
13
Автоматизация на проекте «с нуля» – строим минимальный фреймворк
- Build.gradle - best practices - Конфигурации запуска - Абстракции для работы с REST api - PageObject - Утилитные классы
14
Автоматизация на проекте «с нуля» – базовые абстрактные классы, Dependency Injection. QA сессия по структуре проекта с тестами
- Классы BaseRestTest, BaseGraphQL - Подготовка на написанию REST тестов - пишем простые тесты на internal api (без авторизации) - Концепция Dependency Injection и ее реализация с помощью интерфейса TestInstancePostProcessor в JUnit 5 - Q&A сессия
15
Параллелизация тестов в JUnit5: Теория
- Теория параллельного программирования и ее применимость к тестам - Shared mutable state: что такое и чем вредит - Конфигурация и стратегии параллелизации в JUnit 5
16
Параллелизация тестов в JUnit5: инструменты управление параллельным запуском. QA сессия по параллелизации
- Аннотация @ResourceLock - Аннотация @Execution - Особенности работы с JUnit Extensions при многопоточным выполнении тестов - Еще раз про важность использования ThreadLocal переменных на примере EntityManager - Q&A сессия
17
Allure Lyfecycle
- Класс AllureLifecycle - Создаем ServerLogExtension, добавляющий логи бэкенда в Allure - Дорабатываем UsersQueueExtension - Создаем Extension для удаления вложений к тестам
18
Allure: пишем интеграции для работы с SQL
- Принцип работа внешних интеграций Allure на примере класса AllureSelenide - Реализация интеграции для работы с SQL: библиотека P6Spy
19
Selenide: кастомные Condition
- Классы Condition / CollectionCondition - Пишем свои кастомные ожидания для проекта Niffler: FriendsCondition, PhotoCondition
20
Selenide: нестатическая кинфигурация, библиотека selenide-core
- Класс SelenideConfiguration - Реализация поднятия 2 браузеров в тесте - Параллельное выполнение тестов в разных браузерах - Использование PageObject для бибилотеки selenide-core
21
Selenide: нестатическая кинфигурация, библиотека selenide-core
- Класс SelenideConfiguration - Реализация поднятия 2 браузеров в тесте - Параллельное выполнение тестов в разных браузерах - Использование PageObject для бибилотеки selenide-core - QA сессия по кастомизации Allure и Selenide
22
Реализуем Oauth авторизацию с помощью Retrofit: Базовые концепции и подготовка инфраструктуры
- Краткая теория Oauth 2.0 code flow - Смотрим http-запросы в консоли браузера и подготавливаем инфраструктуру для автоматизации логина
23
Реализуем Oauth авторизацию с помощью Retrofit: Используем ExtensionContext и http Interceptors
- Создаем интерфес ContextHolderExtension - Создаем класс CodeInterceptor для okhttp клиента - Создаем ApiLoginExtension
- Пишем WEB и API тесты с созданием всех тестовых данных через JUnit Extensions. - Q&A сессия по авторизации через Retrofit
25
Установочное занятие по диплому
- Знакомство с дипломными проектами: Rococo, Rangiffler - Обзор успешной дипломной работы
26
Создаем WEB-сервис на Java с использованием Spring boot
- Базовые компоненты Spring (context, DI, сервисы) - Использование Spring Web (создаем REST сервис) - Использование Spring Data JPA (работа с базой)
27
Работа с исключениями, запуск Spring boot приложения в docker: плагин google jib
- Концепция Controller Advice, возврат на фронт унифицированных ошибок - Docker - краткая теория - Докеризация Spring-приложения через плагин google jib
28
Пишем первые тесты, разбираемся с селекторами
- Что такое селекторы, как по них находить элементы - Как посмотреть дерево элементов через консоль - Как работать с брейкпойнтами во время написания теста - Как добавить первые тесты в проект - Как запускать тесты - Пишем первый тест на экране регистрации
29
Переиспользуем код между разными тестами
- Пишем второй тест и переиспользуем код между ними - Стабилизируем тесты: сбросив данные о регистрации - Как деталилазия шагов упрощает чтение тест-репорта - Выносим общий код в сетап и тирдаун
30
Погружение: пишем тесты для сложных сценариев
- Добавляем accessibilityIdentifier для тестов - Пишем сложный тест на три экрана — проходим авторизацию, добавляем новые траты и проверяем, что они появились в общем списке. - Упрощаем тест, чтобы его легко было прочитать.
31
Page Object паттерн в IOS тестах
- Делим тесткейсы на разные файлы - Зачем нужны пейджобжекты и как они помогают писать новые тесты - Описываем структуру пейдж-обжекта и переносим все прошлые тесты на них
32
Особенности XCUITests
- Приводим тесты к нужной структуре, обсуждаем название тестов - Обсуждаем разные способы получения селекторов - Способы ускорения тестов
33
Финальная лекция блока
Как максимально быстро настроить автоматический запуск тестов и оповещения в мессенджер
34
Unit тесты – пишем тестируемый код и тесты для него
- Краткая теория юнит-тестирования - Библиотека Mockito - Покрываем тестами код сервисов Niffler
35
GraphQL: Реализация в Spring Boot
- GraphQL в Spring Boot - Аннотации @QueryMappig, @chemaMapping - Интерфейс DataFetchingEnvironment - Утилита graphiql
36
GraphQL: Пишем тесты с помощью Retrofit
- Подготовка тестовых данных - Создаем Extension GqlRequestExtension для работы со статическими данными - Пишем тесты на проверку вложенных подзапросов - Пишем тесты на проверку работы с Apollo Cache
37
gRPC: Реализация в Spring Boot
- gRPC в Spring Boot - Protobuf и Protoc компиллятор - Интерфейс StreamObserver - Конфигурация, работа с исключениями и информирование об ошибках
38
Тестируем gRPC сервисы с помощью нативных библиотек
- Подготовка тестовых данных - Особенности работы с proto-файлами тестируемых сервисов в тестах - Пишем тесты на gRPC сервис niffler-currency - Сложные кейсы: gRPC Streaming
39
SOAP: Реализация в Spring Boot
- SOAP в Spring Boot - XSD и WSDL схемыАннотации @Endpoint, @PayloadRoot, @ResponsePayload
40
SOAP: Пишем тесты с помощью Retrofit
- Подготовка тестовых данных - Особенности работы с wsdl тестируемых сервисов в тестах - Пишем тесты на SOAP сервис niffler-userdata
41
GraphQL, gRPC, SOAP: Q&A сессия
42
Тестирование микросервисов в docker-compose: запуск тестов локально
- Поднимаем микросервисы в docker compose - Selenoid & Selenoid UI - Доработка конфигурации тестов для запуска в docker - Упаковка проекта с тестами в docker контейнер, написание Dockerfile