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. Знакомство с проектом, локальный запуск, введение в учебный процесс + QA по учебному проекту Niffler. Дмитрий Тучс
Обзор проекта niffler
Необходимые предусловия для работы с проектом
Запуск локально: настройка в idea ultimate, community
Необходимые предусловия для запуска проекта в docker, отличия для windows и nix
Запуск проекта в докере
Выполнение домашних заданий
3.1 Введение в JUnit Extensions: Callbacks, место Extension в жизненном цикле теста JUnit 5. Дмитрий Тучс. В записи
Введение в JUnit Extensions: 1. Интерфейсы BeforeEachCallback, AfterEachCallback и другик callback-и 2. Подключение Extension декларативно - аннотация @ExtendWith 3. Разбор теста, написанного на вводном занятии "Intro to QA.GURU Java Advanced" 4. Написание Extension для создания скриншотов на упавший тест
3.2 ExtensionContext, интерфейс ParameterResolver. Создание Extension "очередь тестовых пользователей". Дмитрий Тучс. В записи
1. Интерфейсы ExtensionContext и Store 2. Концепция шэринга данных через Store + Namespace 3. Создаем threadsafe очередь пользователей - UsersQueueExtension
3.3 Интеграция JUnit Extensions в проект с тестами + QA сессия по введению в JUnit Extensions. Дмитрий Тучс
Метааннотации, 3 способа подключения 1. Работа с аннотациями в Extensions, класс AnnotationSupport 2. Метааннотации 3. ServiceLoader и глобальное подключение Extensions 4. Аннотация @RegisterExtension 5. Q&A сессия
4.1 Работаем с реляционными базами данных из тестов: Погружение в JDBC. Дмитрий Тучс. В записи
1. краткая теория JDBC 2. Интерфейсы DataSource, Connection, Statement, PreparedStatement, ResultSet 3. Реализация SpendRepositryJdbc 4. Вставка данных в БД (sql INSERT) через JDBC 5. Возврат ID созданной записи
4.2 JDBC: Репозитории и транзакции. Модификация данных в БД. Дмитрий Тучс. В записи
1. Понятие Repository, создание UserRepository 2. Транзакции в JDBC 3. Реализация UserRepositoryJdbc 4. Модификация данных в БД
5.1 Библиотека Spring-JDBC для работы с БД: базовые концепции. Дмитрий Тучс. В записи
1. JDBC-Template: теория и применимость 2. реализация простых запросов (CRUD) c помощью библиотеки Spring-JDBC
5.2 Библиотека Spring-JDBC - работа с ключами, транзакции, адаптеры. Дмитрий Тучс. В записи
1. Класс TransactionTemplate 2. Интерфейс PreparedStatementCreator 3. Реализация UserRepositorySpringJdbc
6.1 Библиотека Hibernate и введение в спецификацию JPA. Дмитрий Тучс. В записи
1. Hibernate и JPA - краткая теория 2. Интерфейсы EntityManagerFactory и EntityManager 3. Декораторы для EntityManager: интерфейс EntityTransaction и использование ThreadLocal EntityManager
6.2 Библиотека Hibernate: интеграция с тестовым проектом. Дмитрий Тучс. В записи
1. Конфигурационный файл persistence.xml 2. Реализация UserRepositoryHibernate 3. Особенности использования Hibernate - работа с коллекциями, ленивая инициализация
6.3 Использование созданных UserRepository и SpendRrepository внутри JUnitExtensions + QA по работе с БД. Дмитрий Тучс
1. Создание аннотации @TestUser и Extension AbstractTestUserExtension 2. Наследование Extension: создание класса DbTestUserExtension 3. Реализация логики создание тестового пользователя: хэширование пароля, создание в БД нескольких микросервисов 4. Передача пользователя в тест через ParameterResolver 5. Q&A сессия
7.1 Автоматизация на проекте «с нуля» – строим минимальный фреймворк. Дмитрий Тучс. В записи
1. build.gradle - best practices 2. Конфигурации запуска 3. Абстракции для работы с REST api 4. PageObject 5. Утилитные классы
7.2 Автоматизация на проекте «с нуля» – базовые абстрактные классы, Dependency Injection + QA по структуре проекта. Дмитрий Тучс
1. классы BaseRestTest, BaseGraphQL 2. Подготовка на написанию REST тестов - пишем простые тесты на internal api (без авторизации) 3. Концепция Dependency Injection и ее реализация с помощью интерфейса TestInstancePostProcessor в JUnit 5 4. Q&A сессия
8.1 Параллелизация тестов в JUnit5: Теория. Дмитрий Тучс. В записи
1. Теория параллельного программирования и ее применимость к тестам 2. Shared mutable state: что такое и чем вредит 3. Конфигурация и стратегии параллелизации в JUnit 5
8.2 Параллелизация тестов в JUnit5: инструменты управление параллельным запуском + QA по параллелизации. Дмитрий Тучс
1. Аннотация @ResourceLock 2. Аннотация @Execution 3. Особенности работы с JUnit Extensions при многопоточным выполнении тестов 4. Еще раз про важность использования ThreadLocal переменных на примере EntityManager 5. Q&A сессия
9.1 Allure Lyfecycle. Дмитрий Тучс. В записи
1. Класс AllureLifecycle 2. Создаем ServerLogExtension, добавляющий логи бэкенда в Allure 3. Дорабатываем UsersQueueExtension 4. Создаем Extension для удаления вложений к тестам
9.2 Allure: пишем интеграции для работы с SQL. Дмитрий Тучс. В записи
1. Принцип работа внешних интеграций Allure на примере класса AllureSelenide 2. Реализация интеграции для работы с SQL: библиотека P6Spy
10.1 Selenide: кастомные Condition. Дмитрий Тучс. В записи
1. Классы Condition / CollectionCondition 2. Пишем свои кастомные ожидания для проекта Niffler: FriendsCondition, PhotoCondition
10.2 Selenide: нестатическая кинфигурация, библиотека selenide-core. Дмитрий Тучс. В записи
1. Принцип работа внешних интеграций Allure на примере класса AllureSelenide 2. Реализация интеграции для работы с SQL: библиотека P6Spy
10.3 QA сессия по кастомизации Allure и Selenide. Дмитрий Тучс
11.1 Реализуем Oauth авторизацию с помощью Retrofit: Базовые концепции и подготовка инфраструктуры. Дмитрий Тучс. В записи
1. Краткая теория Oauth 2.0 code flow 2. Смотрим http-запросы в консоли браузера и подготавливаем инфраструктуру для автоматизации логина
11.2 Реализуем Oauth авторизацию с помощью Retrofit: Используем ExtensionContext и Http Interceptors. Дмитрий Тучс. В записи
1. Создаем интерфес CotextHolderExtension 2. Создаем класс CodeInterceptor для okhttp клиента 3. Создаем ApiLoginExtension
11.3 Расширяем тестовое покрытие + Q&A. Дмитрий Тучс
Применяем ApiLoginExtension, DbTestUserExtension для построения полноценного фреймворка 1. Пишем WEB и API тесты с созданием всех тестовых данных через JUnit Extensions. 2. Q&A сессия по авторизации через Retrofit
12.1 Создаем WEB-сервис на Java с использованием Spring boot. Дмитрий Тучс. В записи
1. Базовые компоненты Spring (context, DI, сервисы) 2. Использование Spring Web (создаем REST сервис) 3. Использование Spring Data JPA (работа с базой)
12.2 Работа с исключениями, запуск Spring boot приложения в docker: плагин google jib. Дмитрий Тучс. В записи
1. Базовые компоненты Spring (context, DI, сервисы) 2. Использование Spring Web (создаем REST сервис) 3. Использование Spring Data JPA (работа с базой)
13. Unit тесты – пишем тестируемый код и тесты для него. Дмитрий Тучс. В записи
1. Краткая теория юнит-тестирования 2. Библиотека Mockito 3.Покрываем тестами код сервисов Niffler
14. Установочное занятие по диплому. Дмитрий Тучс
1. Знакомство с дипломными проектами: Rococo, Rangiffler 2. Обзор успешной дипломной работы
15.1 GraphQL: Реализация в Spring Boot. Дмитрий Тучс. В записи
1. GraphQL в Spring Boot 2. Аннотации @QueryMappig, @chemaMapping 3. Интерфейс DataFetchingEnvironment 4. Утилита graphiql
15.2 GraphQL: Пишем тесты с помощью Retrofit. Дмитрий Тучс. В записи
1. Подготовка тестовых данных 2. Создаем Extension GqlRequestExtension для работы со статическими данными 3. Пишем тесты на проверку вложенных подзапросов 4. Пишем тесты на проверку работы с Apollo Cache
17.1 gRPC: Реализация в Spring Boot. Дмитрий Тучс. В записи
1. gRPC в Spring Boot 2. Protobuf и Protoc компиллятор 3. Интерфейс StreamObserver 4. Конфигурация, работа с исключениями и информирование об ошибках
16.1 Пишем первые тесты, разбираемся с селекторами. Михаил Рубанов. В записи
1. Что такое селекторы, как по них находить элементы 2. Как посмотреть дерево элементов через консоль 3. Как работать с брейкпойнтами во время написания теста 4. Как добавить первые тесты в проект 5. Как запускать тесты 6. Пишем первый тест на экране регистрации
16.2 Переиспользуем код между разными тестами. Михаил Рубанов. В записи
1. Пишем второй тест и переиспользуем код между ними 2. Стабилизируем тесты: сбросив данные о регистрации 3. Как деталилазия шагов упрощает чтение тест-репорта 4. Выносим общий код в сетап и тирдаун
16.3 Погружение: пишем тесты для сложных сценариев. Михаил Рубанов. В записи
1. Добавляем accessibilityIdentifier для тестов 2. Пишем сложный тест на три экрана — проходим авторизацию, добавляем новые траты и проверяем, что они появились в общем списке. 3. Упрощаем тест, чтобы его легко было прочитать.
16.4 Page Object паттерн в IOS тестах. Михаил Рубанов. В записи
1. Делим тесткейсы на разные файлы 2. Зачем нужны пейджобжекты и как они помогают писать новые тесты 3. Описываем структуру пейдж-обжекта и переносим все прошлые тесты на них
16.5 Особенности XCUITests. Михаил Рубанов. В записи
1. Приводим тесты к нужной структуре, обсуждаем название тестов 2. Обсуждаем разные способы получения селекторов 3. Способы ускорения тестов
16.6 Финальная лекция блока. Михаил Рубанов. В записи
Как максимально быстро настроить автоматический запуск тестов и оповещения в мессенджер
17.2 Тестируем gRPC сервисы с помощью нативных библиотек. Дмитрий Тучс. В записи
1. Подготовка тестовых данных 2. Особенности работы с proto-файлами тестируемых сервисов в тестах 3. Пишем тесты на gRPC сервис niffler-currency 4. Сложные кейсы: gRPC Streaming
18.1 SOAP: Реализация в Spring Boot. Дмитрий Тучс. В записи
1. SOAP в Spring Boot 2. XSD и WSDL схемы 3. Аннотации @Endpoint, @PayloadRoot, @ResponsePayload
18.2 SOAP: Пишем тесты с помощью Retrofit. Дмитрий Тучс. В записи
1. Подготовка тестовых данных 2. Особенности работы с wsdl тестируемых сервисов в тестах 3. Пишем тесты на SOAP сервис niffler-userdata
18.3 Q&A сессия: GraphQL, gRPC, SOAP. Дмитрий Тучс
19.1 Тестирование микросервисов в docker-compose: запуск тестов локально. Дмитрий Тучс. В записи
1. Поднимаем микросервисы в docker compose 2. Selenoid & Selenoid UI 3. Доработка конфигурации тестов для запуска в docker 4. Упаковка проекта с тестами в docker контейнер, написание Dockerfile
19.2 Тонкости инфраструктуры: Докеризация фронтенда, bash-скрипты. Дмитрий Тучс. В записи
1. Рассмотрим bash-скрипты в проекте niffler 2. Докеризация фронтеда с использованием nginx 3. Особеннности работы с docker-окружением
19.3 Тестирование микросервисов в docker-compose + Q&A по работе с с docker. Дмитрий Тучс
Тестирование микросервисов в docker-compose: работа с артефактами тестов (Allure) 1. Обзор Allure docker service 2. Написание интерфейса SuiteExtension, AllureSendresultExtension 3. Q&A сессия
20.1 Wiremock в тестах: in-memmory подход. Дмитрий Тучс. В записи
1. Сравнение с библиотекой Mockito 2. Используем in-memory Wiremock прямо в тестах
20.2 Wiremock в тестах: standalone подход, мокаем REST API и gRPC. Дмитрий Тучс. В записи
Используем http и gRPC Wiremock в docker-compose
21.1 Apache Kafka: Использование в Spring Boot. Дмитрий Тучс. В записи
1. Kafka в проекте на Spring Boot 2. Конфигурации consumer и producer
21.2 Apache Kafka: взаимодействие из тестов. Дмитрий Тучс. В записи
Пишем свой Consumer и JUnit Extension для его использования в тестах
21.3 Q&A сессия по Wiremock и Kafka. Дмитрий Тучс
22. Конференции – готовим доклад и себя к выступлению. Дмитрий Тучс. В записи
1. Как попасть на конференцию спикером 2. Как готовиться 3. Презентация – хорошая и плохая 4. Дискуссия до и после доклада 5. Ради чего? Плюсы и минусы
23. CI/CD - pipeline, к которому мы шли. Дмитрий Тучс
Рассматриваем вопросы сборки проекта и деплоя на прод с использованием GHA
24. Q&A по дипломному проекту. Дмитрий Тучс
Отвечаем на вопросы, возникшие при работе над дипломным проектом