• 1. «Intro to QA.GURU Java Advanced v. 2.0». Дмитрий Тучс
    1. Мы будем тестировать полностью самописное приложение в суперсовременном стеке (Java 21, Spring Boot 3, Spring Security 6, Spring Data, OAuth2, gRPC, GraphQL, Microservices, Docker, Postgres, React). Да, все это будет полностью самописное и обо всем этом мы будем говорить на курсе
    2. Вы будете не просто понимать, как написать автотест на GraphQL, а разберетесь, как это вообще работает под капотом
    3. Вы узнаете, как сделать запрос в БД из теста и зачем это вообще может быть нужно в микросервисной архитектуре
    4. Мы будем подменять настоящие микросервисы Wiremock-ом, а не абстрактно рассуждать, что это такое
  • 2. Знакомство с проектом, локальный запуск, введение в учебный процесс + QA по учебному проекту Niffler. Дмитрий Тучс
    1. Обзор проекта niffler
    2. Необходимые предусловия для работы с проектом
    3. Запуск локально: настройка в idea ultimate, community
    4. Необходимые предусловия для запуска проекта в docker, отличия для windows и nix
    5. Запуск проекта в докере
    6. Выполнение домашних заданий
  • 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 по дипломному проекту. Дмитрий Тучс
    Отвечаем на вопросы, возникшие при работе над дипломным проектом
  • 25. Выпускной! Дмитрий Тучс