Многопоточный фреймворк для автоматизации тестирования REST API с использованием современного стека технологий.
- Java 17 - язык программирования
- Maven - система сборки и управления зависимостями
- JUnit 5 - фреймворк для тестирования
- REST Assured - библиотека для тестирования REST API
- AssertJ - fluent assertions библиотека
- Allure Report - система отчетности
- Lombok - уменьшение boilerplate кода
- SLF4J/Logback - логирование с поддержкой многопоточности
- Owner - управление конфигурациями
- Docker - контейнеризация
- GitHub Actions - CI/CD pipeline
qa-api-framework/
├── src/
│ ├── main/
│ │ ├── java/qa/autotest/
│ │ │ ├── app/dto/ # Data Transfer Objects
│ │ │ └── framework/ # Core framework
│ │ │ ├── client/ # REST clients
│ │ │ ├── config/ # Configuration
│ │ │ └── utils/ # Utilities
│ │ └── resources/
│ │ ├── config/ # Environment configs
│ │ └── logback.xml # Logging config
│ └── test/
│ ├── java/examples/ # Test cases
│ │ ├── users/ # Users API tests
│ │ └── products/ # Products API tests
│ └── resources/
├── docker/ # Docker configs
│ ├── Dockerfile
│ └── docker-compose.yml
├── .github/workflows/ # CI/CD pipelines
│ ├── test-all.yml
│ ├── test-users.yml
│ ├── test-products.yml
│ └── test-smoke.yml
├── docs/ # Documentation
└── pom.xml # Maven config
- Java 17 или выше
- Maven 3.8+
- Docker (опционально)
# Клонировать репозиторий
git clone <repository-url>
cd qa-api-framework
# Запустить все тесты
mvn clean test
# Запустить тесты с 4 потоками
mvn clean test -Dthread.count=4
# Запустить только users тесты
mvn clean test -Pusers
# Запустить только products тесты
mvn clean test -Pproducts
# Запустить smoke тесты
mvn clean test -Psmoke
# Сгенерировать Allure отчет
mvn allure:serve# Запустить все тесты
docker-compose -f docker/docker-compose.yml up
# Запустить с параметрами
THREAD_COUNT=4 TEST_GROUPS=users docker-compose -f docker/docker-compose.yml up
# Запустить в фоне
docker-compose -f docker/docker-compose.yml up -dФреймворк включает 27 критичных тест-кейсов:
- GET /api/users - получение списка пользователей (TC-001 - TC-003)
- POST /api/login - аутентификация (TC-006 - TC-011)
- POST /api/users - создание пользователя (TC-012 - TC-017)
- GET /products - получение списка продуктов (TC-018 - TC-021)
- GET /product/{id} - получение продукта по ID (TC-022 - TC-024)
- POST /products - создание продукта (TC-026 - TC-030)
Конфигурационные файлы находятся в src/main/resources/config/:
default.properties- дефолтные настройкиlocal.properties- настройки для локального запускаci.properties- настройки для CI/CD
Для CI/CD настройте следующие переменные в GitHub Secrets:
REQRES_BASE_URL # Base URL для ReqRes API
REQRES_API_KEY # API ключ для ReqRes
BEECEPTOR_BASE_URL # Base URL для Beeceptor API
TEST_USER_EMAIL # Email тестового пользователя
TEST_USER_PASSWORD # Пароль тестового пользователя
TEST_USER_FIRSTNAME # Имя тестового пользователя
TEST_USER_LASTNAME # Фамилия тестового пользователя
TEST_USER_ID # ID тестового пользователя
# Количество потоков (default: 1)
-Dthread.count=4
# Окружение (local, ci)
-Denv=local
# Группа тестов
-Dtest.groups=users
# Или через Maven профили
-Pusers
-Pproducts
-Psmoke# Сгенерировать и открыть отчет
mvn allure:serve
# Только сгенерировать
mvn allure:reportОтчет содержит:
- Детальную информацию о прохождении тестов
- HTTP запросы и ответы
- Скриншоты (если применимо)
- История выполнения
- Графики и статистику
Логи сохраняются в директории target/logs/:
test-execution.log- общий лог выполненияthread-{name}.log- логи по каждому потоку отдельно
-
test-all.yml - запуск всех тестов
- Триггеры: push в main/develop, pull request, manual
- Параллельность: настраиваемая (1-8 потоков)
-
test-users.yml - запуск users тестов
- Триггеры: manual, schedule (daily at 2 AM UTC)
- Профиль:
-Pusers
-
test-products.yml - запуск products тестов
- Триггеры: manual, schedule (daily at 3 AM UTC)
- Профиль:
-Pproducts
-
test-smoke.yml - запуск smoke тестов
- Триггеры: push, pull request
- Профиль:
-Psmoke
После выполнения доступны артефакты:
- Allure результаты
- Allure отчет
- Логи выполнения
- JUnit XML отчеты
- Page Object Model - для REST API адаптирован как REST Client Pattern
- Builder Pattern - для создания DTO объектов
- Thread-local - для изоляции данных между потоками
- Configuration Management - централизованное управление настройками
- Dependency Injection - через конструкторы
- Fluent Assertions - читаемые проверки через AssertJ
Фреймворк полностью поддерживает параллельное выполнение:
- Thread-safe RequestSpecification
- Thread-safe логирование
- Изолированные логи по потокам
- Конфигурируемое количество потоков
@Execution(ExecutionMode.CONCURRENT)
public abstract class BaseTest {
// Thread-safe implementation
}Logback настроен на многопоточную работу:
- Асинхронная запись
- Отдельные файлы по потокам
- Thread ID в каждой записи
- Prudent mode для безопасной записи
@Epic("API Name")
@Feature("Feature Name")
@Tag("group-name")
public class MyNewTests extends BaseTest {
@Test
@DisplayName("TC-XXX: Test description")
@Description("Detailed description")
@Severity(SeverityLevel.CRITICAL)
@Story("Story name")
void testSomething() {
// Arrange
UserDto request = UserDto.builder()
.email("test@test.com")
.password("pass123")
.build();
// Act
Response response = reqResClient.login(request);
// Assert
assertThat(response.getStatusCode())
.as("Status code should be 200")
.isEqualTo(200);
}
}@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDto {
@JsonProperty("field_name")
private String fieldName;
}@Slf4j
public class MyApiClient extends BaseRestClient {
public MyApiClient() {
setBaseUri(CONFIG.myApiBaseUrl());
}
@Step("Get something")
public Response getSomething() {
return get("/endpoint");
}
}- Fork репозиторий
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Создайте Pull Request
Подробная документация доступна в папке docs/:
- Vitaliy Popravka - QA Automation Engineer
Для вопросов и предложений создавайте Issue в репозитории.