Фреймворк построен на принципах модульности, расширяемости и поддержки многопоточности. Архитектура следует best practices тестирования REST API и использует проверенные паттерны проектирования.
┌─────────────────────────────────────────────────┐
│ Test Layer (JUnit 5) │
│ - Test Classes (examples/users, products) │
│ - Annotations (@Tag, @Epic, @Feature) │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Client Layer (REST Clients) │
│ - ReqResClient │
│ - BeeceptorClient │
│ - BaseRestClient (abstract) │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Communication Layer (REST Assured) │
│ - RequestSpecification (thread-local) │
│ - HTTP Methods (GET, POST, PUT, DELETE) │
│ - Allure Reporting Integration │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Data Layer (DTOs + Jackson) │
│ - UserDto, ProductDto, etc. │
│ - Serialization/Deserialization │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Infrastructure Layer (Config, Utils, Logs) │
│ - Configuration Management (Owner) │
│ - Utilities (DateUtils, UuidUtils) │
│ - Logging (Logback) │
└─────────────────────────────────────────────────┘
Цель: Организация и выполнение тестов
Компоненты:
BaseTest- базовый класс для всех тестов- Test Classes - конкретные тестовые классы
- JUnit 5 Annotations - метаданные тестов
Особенности:
@Execution(ExecutionMode.CONCURRENT) // Параллельное выполнение
public abstract class BaseTest {
protected ReqResClient reqResClient;
protected BeeceptorClient beeceptorClient;
}Цель: Инкапсуляция взаимодействия с API
Паттерн: REST Client Pattern (адаптация Page Object для API)
Компоненты:
BaseRestClient- абстрактный базовый клиентReqResClient- клиент для ReqRes APIBeeceptorClient- клиент для Beeceptor API
Преимущества:
- Переиспользование кода
- Легкость поддержки
- Абстракция HTTP деталей
- Интеграция с Allure через @Step
Пример:
public class ReqResClient extends BaseRestClient {
@Step("Get users list")
public Response getUsersList() {
return get(API_USERS);
}
}Цель: HTTP коммуникация с API
Библиотека: REST Assured
Thread-Safety:
private static final ThreadLocal<RequestSpecification> requestSpec = new ThreadLocal<>();
protected RequestSpecification getRequestSpec() {
if (requestSpec.get() == null) {
requestSpec.set(createRequestSpec());
}
return requestSpec.get();
}Особенности:
- Thread-local RequestSpecification
- Автоматическое логирование запросов/ответов
- Интеграция с Allure
- Конфигурируемые таймауты и retry
Цель: Представление данных API
Паттерн: Data Transfer Object (DTO)
Библиотеки:
- Jackson - JSON сериализация/десериализация
- Lombok - генерация boilerplate кода
Пример DTO:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {
@JsonProperty("id")
private Integer id;
@JsonProperty("email")
private String email;
// ...
}Преимущества:
- Типобезопасность
- Автоматическая валидация
- Удобство работы с данными
- Immutability через Builder
Цель: Поддержка инфраструктуры фреймворка
Компоненты:
@Config.Sources({
"system:properties",
"system:env",
"classpath:config/${env}.properties"
})
public interface TestConfig extends Config {
String reqresBaseUrl();
String reqresApiKey();
// ...
}Особенности:
- Многоуровневая конфигурация
- Environment-specific настройки
- Override через system properties/env vars
DateUtils- работа с датами (ISO 8601)UuidUtils- валидация и работа с UUID
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<!-- Отдельный лог файл для каждого потока -->
</appender>Особенности:
- Асинхронная запись (AsyncAppender)
- Thread-safe (prudent mode)
- Логи по потокам отдельно
- Thread ID в каждой записи
Фреймворк использует параллелизм на уровне методов:
<parallel>methods</parallel>
<threadCount>${thread.count}</threadCount>- RequestSpecification - ThreadLocal
- Configuration - Immutable + Cached
- Logging - Asynchronous + Prudent mode
- DTOs - Immutable через Builder
- Clients - создаются в @BeforeEach для каждого теста
Maven:
mvn test -Dthread.count=4JUnit Platform:
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.config.strategy = fixed
junit.jupiter.execution.parallel.config.fixed.parallelism = 4Все версии зависимостей определены в properties:
<properties>
<junit.version>5.10.1</junit.version>
<rest-assured.version>5.4.0</rest-assured.version>
<!-- ... -->
</properties>compile- основные зависимости (REST Assured, Jackson)provided- Lomboktest- JUnit, AssertJ (не используется, т.к. тесты в src/test)
Уровни интеграции:
- Test Level:
@Epic("Users API")
@Feature("User Login")
@Story("Authentication")
void testLogin() { }- Step Level:
@Step("Login user with email: {userDto.email}")
public Response login(UserDto userDto) { }- REST Assured Level:
.addFilter(new AllureRestAssured())- Allure Results -
target/allure-results - Allure Report -
target/site/allure-maven-plugin - Logs -
target/logs/ - JUnit XML -
target/surefire-reports
┌──────────────┐
│ Trigger │ (push, PR, schedule, manual)
└──────┬───────┘
↓
┌──────────────┐
│ Checkout │
└──────┬───────┘
↓
┌──────────────┐
│ Setup Java │
└──────┬───────┘
↓
┌──────────────┐
│ Run Tests │ (with env vars from secrets)
└──────┬───────┘
↓
┌──────────────┐
│Generate Report│
└──────┬───────┘
↓
┌──────────────┐
│Upload Artifacts│ (always)
└──────────────┘
Local:
env=local
reqres.base.url=https://reqres.inCI/CD:
env=ci
reqres.base.url=${REQRES_BASE_URL}- Создать DTOs в
qa.autotest.app.dto - Создать Client в
qa.autotest.framework.client - Расширить
BaseRestClient - Добавить конфигурацию в
TestConfig - Создать тесты в
examples/
- Создать
{env}.propertiesвsrc/main/resources/config/ - Определить специфичные настройки
- Использовать:
mvn test -Denv={env}
Создать класс в qa.autotest.framework.utils:
public final class MyUtils {
private MyUtils() {
throw new UnsupportedOperationException("Utility class");
}
public static ReturnType utilityMethod(params) {
// implementation
}
}- DTOs через Builder pattern
- Final для utility классов
- Неизменяемая конфигурация
- ThreadLocal для изменяемого состояния
- Stateless где возможно
- Prudent logging
- Слоистая архитектура
- Каждый компонент - одна ответственность
- Минимальные зависимости между слоями
- Группировка по функциональности
- Понятные названия (@DisplayName)
- Метаданные через аннотации
- Explicit assertions
- Meaningful error messages
- Always() blocks для cleanup
- Параллельное выполнение - до 8 потоков
- Connection pooling - REST Assured по умолчанию
- Async logging - не блокирует тесты
- Maven caching - в CI/CD
- Dependency caching - Docker layers
Типичное время выполнения:
- 1 тест: ~2-5 секунд
- 30 тестов (sequential): ~90-150 секунд
- 30 тестов (parallel, 4 threads): ~25-40 секунд
-
ConcurrentModificationException
- Решение: проверить thread-safety
- Использовать ThreadLocal
-
Connection timeout
- Решение: увеличить
request.timeout - Проверить network connectivity
- Решение: увеличить
-
Flaky tests
- Решение: добавить retry logic
- Проверить race conditions
Архитектура фреймворка обеспечивает:
- ✅ Масштабируемость
- ✅ Поддерживаемость
- ✅ Расширяемость
- ✅ Thread-safety
- ✅ CI/CD готовность
- ✅ Полную отчетность
Фреймворк готов к промышленному использованию и может быть легко адаптирован под специфические требования проекта.