15 часов.
Рассмотрим основные концепции и ограничения Spring в разработке приложений и автотестов. Это актуально и разработчикам автотестов, т.к. Spring поможет снизить трудоемкость их разработки, так и ручным тестировщикам, т.к. им необходимо конфигурировать Spring-приложения перед прогоном тестового набора.
Reading List
- ручные QA Spring-приложений
- разработчики (любых) автотестов Spring-приложений
- участники поймут структуру Spring-приложений и Spring-based тестов
- смогут ускорить разработку автотестов за счет возможностей Spring и компонентов в его составе
- Git local workflow
- Git remote workflow
- Fork and clone main repo
- Pull Requests
- Внутренние атрибуты качества
- Пример процедурного legacy-кода и вопросы сопровождаемости
- Инкапсуляция
- Полиморфизм и абстракции
- Повторное использование и наследование/делегирование
- Зависимости компонентов: порождающие шаблоны
- Слои
- Рефакторинг процедурного legacy-кода
- Layered Design
- DI
- Структура теста
- Именования
- Проверки
- Тест-дублеры
- Покрытие
- Допокрытие системы до ≥80%
- Понятие фреймворка и контейнеров
- Spring Core как DI Framework
- Концепция AOP и реализация ключевых задач фреймворка с помощью proxies
- Обзор модулей Spring
- Понятие конфигурации и контекста
- Обзор зависимостей и структуры типового Spring Application
- Компоненты/бины, неявный аспект их именования
- Сборка и запуск приложения
- Сборка и запуск приложения
- Локализация и решение проблем
- Способы конфигурирования: java, xml, groovy
- Структура конфигурации
- Декларация компонентов
- Инициализация компонентов
- Внедрение зависимостей
- Жизненный цикл компонентов и Scopes
- SpEL
- Валидация данных модели
- Профили
- Обзор модульных и интеграционных тестов в Spring
- Нужный junit4 runner
- Тесты как компоненты Spring: аннотации для тестов, для junit4 и стандартные аннотации
- Вспомогательный фреймворк TestContext
- Кеширование контекста
- Тест-дублеры: графы стабов
- Тестовые и production профили
- Утилиты работы с JDBC
- Управление транзакциями
- Обзор тестовой кодовой базы
- Сборка приложения и тестов и запуск тестов
- Покрытие модульными и интеграционными тестами
- Тестовые конфигурации
- Сборка и запуск тестовых наборов
- Обзор AOP
- Lazy-инициализация компонентов
- События жизненного цикла компонента и их обработчики @PostConstruct и @PreDestroy
- Управление безопасностью
- Управление транзакциями
- Управление повторами операций
- Управление асинхронностью
- Управление кешированием
- Ресурсы как частный случай компонентов
- @Primary
- @Qualifier("id")
- Два бина с одинаковым id в одной секции beans – ошибка инициалиазации контекста
- Два бина с одинаковым id в разных секциях beans (два xml или профили в одном xml): последний заданный overrides первый
- Бин, заданный в xml без id, ищется только по типу
- Бин, заданный в xml без id, не инъектируется @Autowired. Надо ref в xml
- Бин, заданный как @Component, автоматом получает id. @Component("newId") переопределяет дефолтный id
- Бин с дублирующимся id, определенный в xml, overrides бин, заданный как @Component
- Бин с дублирующимся id, определенный в @Configuration, overrides бин, заданный как @Component
- Бин с дублирующимся id, определенный в @Configuration и xml – берется из xml, skipping определение из @Configuration
- Бин с дублирующимся id, определенный в @Configuration, xml и как @Component – берется из xml, skipping определение из @Configuration
- Eager service1 depending on eager service2
23:25:10.331 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service1'
23:25:10.346 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
......context loaded and prepared......
Getting service1
Got service1
Result of service1's operation call: 84
- Lazy service1 depending on eager service2
23:26:00.941 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
......context loaded and prepared......
Getting service1
23:26:00.966 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service1'
Got service1
Result of service1's operation call: 84
- Eager service1 depending on lazy service2
23:26:51.508 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service1'
23:26:51.524 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
......context loaded and prepared......
Getting service1
Got service1
Result of service1's operation call: 84
- Lazy service1 depending on lazy service2
......context loaded and prepared......
Getting service1
23:27:41.133 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service1'
23:27:41.146 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
Got service1
Result of service1's operation call: 84
- Singleton service1 depending on singleton service2
23:45:54.740 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service1'
S1 object constructor
23:45:54.773 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
S2 object constructor
......context loaded and prepared......
Getting service1
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
Getting service1
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
- Singleton service1 depending on prototype service2
S1 object constructor
S2 object constructor
......context loaded and prepared......
Getting service1
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
Getting service1
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
- Prototype service1 depending on singleton service2
23:47:43.826 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'service2'
S2 object constructor
......context loaded and prepared......
Getting service1
S1 object constructor
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
Getting service1
S1 object constructor
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
- Prototype service1 depending on Prototype service2
......context loaded and prepared......
Getting service1
S1 object constructor
S2 object constructor
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
Getting service1
S1 object constructor
S2 object constructor
Got service1
Result of service1's operation call: 84
Result of service1's operation call: 84
- Допокрытие модульными и интеграционными тестами бизнес-логики
- Собственная логика жизненного цикла
- Конфигурация безопасности, транзакций и retrying
- Сборка и запуск тестовых наборов
- Простейший способ тестировать JPA на Spring Boot
- Тестовые и production конфигурации РСУБД источников данных
- Понятие Connection Pool
- Spring Data ORM
- Обзор JPA Entities и Persistence Contexts
- Провиженинг схемы БД при изменениях структур данных
- CRUD App with JPA Repositories
- Реализация CRUD-логики
- Покрытие модульными и интеграционными тестами CRUD-логики
- Сборка и запуск тестовых наборов
- Задачи Spring Boot
- Рефакторинг Spring CRUD web-приложения на Boot
- Сборка и запуск тестов