Вы прокачаете знания в автоматизации на Java до уровня Senior+ и разнообразите портфолио впечатляющими кейсами.
- Архитектура и дизайн. Глубокому пониманию JUnit extension. И использованию паттернов разработки, таких как decorator, singleton, factory, IOC.
- Покроем всё. Тестированию нестандартных протоколов взаимодействия: gRPC, GraphQL, SOAP. А также работе с базами данных и Kafka, и с такими инструментами как docker и docker-compose.
- Кроме того. Создадим весь код с нуля, исследуем, как тестируемые технологии работают в Spring Boot под капотом.
Востребованность профессии:
- 100 000 ₽ — Средняя заработная плата тестировщика.
- Одна из самых перспективных профессий на рынке.
- Возможность удалённой работы и гибкого графика.
- Быстрый карьерный рост от джуна до тимлида.
- Постоянное развитие и изучение новых технологий.
- Возможность работы в различных сферах.
- Высокий спрос на специалистов во всех IT-компаниях.
Программа курса
1. Niffler и его тестирование Advanced Как меняется проект
- Тестируем полностью самописное приложение в суперсовременном стеке (Java 21, Spring Boot 3, Spring Security 6, Spring Data, OAuth2, gRPC, GraphQL, Microservices, Docker, Postgres, React)
- Научим не просто понимать, как написать автотест на GraphQL, но и разберемся в том, как это работает под капотом
- Вы узнаете, как сделать запрос в БД из теста и зачем это может быть нужно в микросервисной архитектуре
- Будем подменять настоящие микросервисы на Wiremock на практике
2. Знакомство с Niffler NG. Локальный запуск, введение в учебный процесс, QA сессия
- Обзор проекта Niffler
- Необходимые предусловия для работы с проектом
- Запуск локально: настройка в Idea Ultimate, Community
- Необходимые предусловия для запуска проекта в docker, отличия для Windows и Nix
- Запуск проекта в докере
- Выполнение домашних заданий
3.1. Введение в JUnit Extensions. Callbacks, жизненный цикл теста, разбор первого теста
- Интерфейсы BeforeEachCallback, AfterEachCallback и другие callback
- Подключение Extension декларативно — аннотация @ExtendWith
- Разбор теста, написанного на вводном занятии
- Написание Extension для создания скриншотов на упавший тест
3.2. Погружение в JUnit Extensions: ExtensionContext, интерфейс ParameterResolver. Создание Extension «очередь тестовых пользователей»
- Интерфейсы ExtensionContext и Store
- Концепция шэринга данных через Store + Namespace
- Создаем threadsafe очередь пользователей – UsersQueueExtension
3.3. Интеграция JUnit Extensions. Метааннотации, 3 способа подключения Extension. Создаем TestMethodContextExtension, QA сессия
- Работа с аннотациями в Extensions, класс AnnotationSupport
- Метааннотации
- ServiceLoader и глобальное подключение Extensions
- Аннотация @RegisterExtension
- Q&A сессия
4.1. Работаем с RDBMS из тестов. Введение в JDBC базовые интерфейсы и архитектура. Пишем INSERT и SELECT запросы
- Краткая теория JDBC
- Интерфейсы DataSource, Connection, Statement, PreparedStatement, ResultSet
- Реализация SpendRepositryJdbc
- Вставка данных в БД (sql INSERT) через JDBC
- Возврат ID созданной записи
4.2. Работаем с RDBMS из тестов. JDBC Транзакции, JTA. Определение границ транзакций
- Понятие Repository, создание UserRepository
- Транзакции в JDBC
- Реализация UserRepositoryJDBC
- Модификация данных в БД
5.1. Работаем с RDBMS из тестов. Spring-JDBC базовая функциональность и архитектура библиотеки
- JDBC-Template: теория и применимость
- Реализация простых запросов (CRUD) c помощью библиотеки Spring-JDBC
5.2. Работаем с RDBMS из тестов. Spring-JDBC транзакции
- Класс TransactionTemplate
- Интерфейс PreparedStatementCreator
- Реализация UserRepositorySpringJdbc
6.1. Работаем с RDBMS из тестов. Спецификация JPA
- Hibernate и JPA краткая теория
- Интерфейсы EntityManagerFactory и EntityManager
- Декораторы для EntityManager: интерфейс EntityTransaction и использование ThreadLocal EntityManager
6.2. Работаем с RDBMS из тестов. Hibernate + JNDI + JTA
- Конфигурационный файл persistence.xml
- Реализация UserRepositoryHibernate
- Особенности использования Hibernate работа с коллекциями, ленивая инициализация
6.3. Используем Repository. Подключаем созданные классы Repository к Extension. QA сессия
- Создание аннотации @TestUser и Extension AbstractTestUserExtension
- Наследование Extension: создание класса DbTestUserExtension
- Реализация логики создание тестового пользователя: хэширование пароля, создание в БД нескольких микросервисов
- Передача пользователя в тест через ParameterResolver
- Q&A сессия
7.1. Автоматизация «с нуля» минималистичный фреймворк
- Build.gradle best practices
- Конфигурации запуска
- Абстракции для работы с REST api
- PageObject
- Утилитные классы
7.2. Автоматизация «с нуля». Базовые классы. Dependency Injection + QA сессия
- Классы BaseRestTest, BaseGraphQL
- Подготовка к написанию REST тестов пишем простые тесты на internal api (без авторизации)
- Концепция Dependency Injection и ее реализация с помощью интерфейса TestInstancePostProcessor в JUnit 5
- Q&A сессия
8.1. Параллелизация тестов в JUnit5: Теория
- Теория параллельного программирования и ее применимость к тестам
- Shared mutable state: что такое и чем вредит
- Конфигурация и стратегии параллелизации в JUnit 5
8.2. Параллелизация тестов в JUnit5: инструменты управление параллельным запуском. QA сессия по параллелизации
- Аннотация @ResourceLock
- Аннотация @Execution
- Особенности работы с JUnit Extensions при многопоточном выполнении тестов
- Еще раз про важность использования ThreadLocal переменных на примере EntityManager
- Q&A сессия
9.1. Allure Lifecycle. Добавляем в отчет логи тестируемых сервисов
- Класс AllureLifecycle
- Создаем ServerLogExtension, добавляющий логи бэкенда в Allure
- Дорабатываем UsersQueueExtension
- Создаем Extension для удаления вложений к тестам
9.2. Allure Lifecycle. Кастомные html-вложения на примере логгирования SQL
- Принцип работа внешних интеграций Allure на примере класса AllureSelenide
- Реализация интеграции для работы с SQL: библиотека P6Spy
10.1 Selenide Conditions. Создаем кастомные проверки для веб-элементов и коллекций
- Классы Condition / CollectionCondition
- Пишем свои кастомные ожидания для проекта Niffler: FriendsCondition, PhotoCondition
10.2. Selenide: нестатическая кинфигурация, библиотека selenide-core
- Класс SelenideConfiguration
- Реализация поднятия 2 браузеров в тесте
- Параллельное выполнение тестов в разных браузерах
- Использование PageObject для бибилотеки selenide-core
10.3. QA сессия по Allure и Selenide
- Реализация поднятия 2 браузеров в тесте
- Параллельное выполнение тестов в разных браузерах
- Использование PageObject для бибилотеки selenide-core
- QA сессия по кастомизации Allure и Selenide
11.1. OAUTH 2.0 + OIDC. Базовые концепции. PKCE
- Краткая теория Oauth 2.0 code flow
- Смотрим http-запросы в консоли браузера и подготавливаем инфраструктуру для автоматизации логина
11.2. OAUTH 2.0 + OIDC. Реализация через Retrofit + JUnit Extension
- Создаем интерфес ContextHolderExtension
- Создаем класс CodeInterceptor для okhttp клиента
- Создаем ApiLoginExtension
11.3. OAUTH 2.0 + OIDC. Расширяем тестовое покрытие. QA сессия
- Пишем WEB и API тесты с созданием всех тестовых данных через JUnit Extensions.
- Q&A сессия по авторизации через Retrofit
12.1. Spring core + Spring Boot. Создаем простой REST сервис
- Базовые компоненты Spring (context, DI, сервисы)
- Использование Spring Web (создаем REST сервис)
- Использование Spring Data JPA (работа с базой)
12.2. Spring core + Spring Boot. Работа с исключениями
- Концепция Controller Advice, возврат на фронт унифицированных ошибок
- Docker краткая теория
- Докеризация Spring-приложения через плагин google jib
13.1. GraphQL: Реализация в Spring Boot
- GraphQL в Spring Boot
- Аннотации @QueryMappig, @chemaMapping
- Интерфейс DataFetchingEnvironment
- Утилита graphiql
13.2. GraphQL. Пишем автотесты с использованием Apollo Client
- Подготовка тестовых данных
- Создаем Extension GqlRequestExtension для работы со статическими данными
- Пишем тесты на проверку вложенных подзапросов
- Пишем тесты на проверку работы с Apollo Cache
14. Установочное занятие по диплому
- Знакомство с дипломными проектами: Rococo, Rangiffler
- Обзор успешной дипломной работы
15.1. gRPC: Реализация в Spring Boot
- gRPC в Spring Boot
- Protobuf и Protoc компиллятор
- Интерфейс StreamObserver
- Конфигурация, работа с исключениями и информирование об ошибках
15.2. gRPC. Пишем автотесты с использованием нативных библиотек
- Подготовка тестовых данных
- Особенности работы с proto-файлами тестируемых сервисов в тестах
- Пишем тесты на gRPC сервис niffler-currency
- Сложные кейсы: gRPC Streaming
16.1. SOAP: Реализация в Spring Boot
- SOAP в Spring Boot
- XSD и WSDL схемы
- Аннотации @Endpoint, @PayloadRoot, @ResponsePayload
16.2. SOAP: Пишем тесты с помощью Retrofit
- Подготовка тестовых данных
- Особенности работы с wsdl тестируемых сервисов в тестах
- Пишем тесты на SOAP сервис niffler-userdata
16.3. GraphQL, gRPC, SOAP: Q&A сессия
17. Unit тесты – пишем тестируемый код и тесты для него
- Краткая теория юнит-тестирования
- Библиотека Mockito
- Покрываем тестами код сервисов Niffler
18.1. Пишем первые тесты, разбираемся с селекторами
- Что такое селекторы, как по них находить элементы
- Как посмотреть дерево элементов через консоль
- Как работать с брейкпойнтами во время написания теста
- Как добавить первые тесты в проект
- Как запускать тесты
- Пишем первый тест на экране регистрации
18.2. Переиспользуем код между разными тестами
- Пишем второй тест и переиспользуем код между ними
- Стабилизируем тесты: сбросив данные о регистрации
- Как деталилазия шагов упрощает чтение тест-репорта
- Выносим общий код в сетап и тирдаун
18.3. Погружение: пишем тесты для сложных сценариев
- Добавляем accessibilityIdentifier для тестов
- Пишем сложный тест на три экрана — проходим авторизацию, добавляем новые траты и проверяем, что они появились в общем списке.
- Упрощаем тест, чтобы его легко было прочитать.
18.4. Page Object паттерн в IOS тестах
- Делим тесткейсы на разные файлы
- Зачем нужны пейджобжекты и как они помогают писать новые тесты
- Описываем структуру пейдж-обжекта и переносим все прошлые тесты на них
18.5. Особенности XCUITests
- Приводим тесты к нужной структуре, обсуждаем название тестов
- Обсуждаем разные способы получения селекторов
- Способы ускорения тестов
18.6. Финальная лекция блока
- Как максимально быстро настроить автоматический запуск тестов и оповещения в мессенджер
19.1. Docker-compose. Запуск тестов локально в изолированном окружении
- Поднимаем микросервисы в docker compose
- Selenoid & Selenoid UI
- Доработка конфигурации тестов для запуска в docker
- Упаковка проекта с тестами в docker контейнер, написание Dockerfile
19.2. Докеризация Niffler Тонкости инфраструктуры
- Рассмотрим bash-скрипты в проекте niffler
- Докеризация фронтеда с использованием nginx
- Особенности работы с docker-окружением
19.3. Docker-compose QA сессия
- Обзор Allure docker service
- Написание интерфейса SuiteExtension, AllureSendresultExtension
- Q&A сессия
20.1. Wiremock. Мок REST API in-memory
- Сравнение с библиотекой Mockito
- Используем in-memory Wiremock прямо в тестах
20.2. Wiremock. Standalone mock for RESTgRPC API
- Используем http и gRPC Wiremock в docker-compose
21.1. Apache Kafkа. Реализация producer consumer в Spring Boot
- Kafka в проекте на Spring Boot
- Конфигурации consumer и producer
21.2. Apache Kafkа. Реализация consumer в тестах
- Пишем свой Consumer и JUnit Extension для его использования в тестах
21.3. Q&A сессия по Wiremock и Kafka
22. Конференции – готовим доклад и себя к выступлению
- Как попасть на конференцию спикером
- Как готовиться
- Презентация – хорошая и плохая
- Дискуссия до и после доклада
- Ради чего? Плюсы и минусы
23. CI/CD — pipeline, к которому мы шли
- Рассматриваем вопросы сборки проекта и деплоя на прод с использованием GHA
24. Q&A по дипломному проекту
- Отвечаем на вопросы, возникшие при работе над дипломным проектом
Преподаватели:
- Дмитрий Тучс (преподаёт основную программу Java на курсе Java Advanced 2.0)
- В IT больше 12 лет.
- Начинал в аналитике, управлял проектами.
- Сейчас — Head of QA at Dodo Brands.
- Занимается менторством, пишет и автоматизирует на Java.
- Автор учебной программы QA.GURU Java Advanced.
- Михаил Рубанов (преподаёт iOS-программу на курсе Java Advanced 2.0)
- Head of mobile в Dodo Engineering.
- В разработке любит интерфейсы, тесты и доступность.
- Купил 10 эргономичных клавиатур.
- Написал книгу «Про доступность iOS».
- Пишет статьи на Хабр, ведет Telegram-канал о мобильной разработке в Dodo.




