| Компонент | Минимальная версия | Проверка |
|---|---|---|
| Java (JDK) | 17 | java -version |
| Maven | 3.8 | mvn -version |
| Aiven Cloud Kafka | Free tier | Доступ к консоли |
| SSL-сертификаты | — | Скачать из консоли Aiven |
| Docker (опционально) | 20.10 | docker -v |
- Откройте console.aiven.io
- Выберите ваш Kafka-сервис
- Во вкладке Overview → Connection information скачайте:
kafka.truststore.jks— CA-сертификат брокераkafka.keystore.p12— клиентский сертификат + ключ- Запомните или скопируйте SSL Password (один для всех)
Windows:
C:\AUTO\kafka_key\kafka.truststore.jks
C:\AUTO\kafka_key\kafka.keystore.p12
Linux/macOS:
~/kafka_key/kafka.truststore.jks
~/kafka_key/kafka.keystore.p12
Произвольный путь — укажите в конфигурации явно (см. Шаг 2).
# Обязательные
export KAFKA_BOOTSTRAP_SERVERS=kafka-xxxx.j.aivencloud.com:28330
export KAFKA_SSL_TRUSTSTORE_PASSWORD=ваш_ssl_пароль
export KAFKA_SSL_KEYSTORE_PASSWORD=ваш_ssl_пароль
export KAFKA_SSL_KEY_PASSWORD=ваш_ssl_пароль
# Для Aiven API (удаление топиков, листинг)
export AIVEN_API_TOKEN=ваш_токен_aiven
export AIVEN_PROJECT_NAME=название-проекта
export AIVEN_SERVICE_NAME=название-сервиса
# Опционально: кастомные пути к сертификатам
export KAFKA_SSL_TRUSTSTORE_LOCATION=/path/to/kafka.truststore.jks
export KAFKA_SSL_KEYSTORE_LOCATION=/path/to/kafka.keystore.p12Для постоянного использования добавьте в ~/.bashrc или ~/.zshrc.
Windows (PowerShell):
$env:KAFKA_BOOTSTRAP_SERVERS = "kafka-xxxx.j.aivencloud.com:28330"
$env:KAFKA_SSL_TRUSTSTORE_PASSWORD = "ваш_пароль"
$env:KAFKA_SSL_KEYSTORE_PASSWORD = "ваш_пароль"
$env:KAFKA_SSL_KEY_PASSWORD = "ваш_пароль"
$env:AIVEN_API_TOKEN = "ваш_токен"Создайте или отредактируйте src/main/resources/config/local.properties:
# Подключение к Kafka
kafka.bootstrap.servers=kafka-xxxx.j.aivencloud.com:28330
kafka.security.protocol=SSL
# SSL-сертификаты (Windows-пути — двойные обратные слэши)
kafka.ssl.truststore.location=C:\\AUTO\\kafka_key\\kafka.truststore.jks
kafka.ssl.truststore.password=ваш_пароль
kafka.ssl.truststore.type=JKS
kafka.ssl.keystore.location=C:\\AUTO\\kafka_key\\kafka.keystore.p12
kafka.ssl.keystore.password=ваш_пароль
kafka.ssl.keystore.type=PKCS12
kafka.ssl.key.password=ваш_пароль
# Aiven API
aiven.api.token=ваш_токен
aiven.project.name=название-проекта
aiven.service.name=название-сервиса
# Опционально: REST API (если используется)
kafka.rest.api.url=https://kafka-xxxx.j.aivencloud.com:28332
kafka.rest.api.username=avnadmin
kafka.rest.api.password=ваш_парольВнимание: не коммитьте local.properties с реальными паролями. Файл добавлен в .gitignore.
mvn test \
-Dkafka.bootstrap.servers=kafka-xxxx.j.aivencloud.com:28330 \
-Dkafka.ssl.truststore.password=ваш_пароль \
-Dkafka.ssl.keystore.password=ваш_пароль \
-Dkafka.ssl.key.password=ваш_пароль \
-Daiven.api.token=ваш_токенcd qa-kafka-framework
# Только компиляция (без тестов)
mvn compile
# Компиляция + компиляция тестов (без запуска)
mvn test-compile
# Полная сборка без тестов
mvn package -DskipTestsmvn testmvn test -Dtest.groups=smoke
# или через профиль
mvn test -P smokemvn test -P producer # 12 тестов: отправка сообщений
mvn test -P consumer # 12 тестов: чтение сообщений
mvn test -P transactions # 9 тестов: транзакции, exactly-once
mvn test -P idempotence # 7 тестов: идемпотентность
mvn test -P offset # 5 тестов: управление offset
mvn test -P partitioning # 5 тестов: партиционирование
mvn test -P performance # 4 теста: производительность
mvn test -P ordering # 3 теста: порядок сообщений
mvn test -P dlq # 3 теста: Dead Letter Queue
mvn test -P error-handling # 5 тестов: обработка ошибок
mvn test -P consumer-group # 1 тест: rebalance группы
mvn test -P critical # все критические тесты (тег critical)# Группа + среда
mvn test -P producer,ci
# Несколько групп через теги
mvn test -Dtest.groups="producer | consumer"
mvn test -Dtest.groups="smoke | critical"# 4 потока (рекомендуется для Aiven free tier)
mvn test -P parallel -Dthread.count=4
# 2 потока (минимальный параллелизм)
mvn test -P parallel -Dthread.count=2
# Параллельно + только smoke
mvn test -P parallel,smoke -Dthread.count=4Важно при параллельном запуске:
- Каждый тест создаёт уникальный топик (UUID-суффикс)
- Consumer group ID уникален для каждого теста (UUID-суффикс)
@AfterAll globalCleanup()закрывает все ресурсы из всех потоков
chmod +x run-tests.sh
# Все тесты последовательно
./run-tests.sh
# Только smoke
./run-tests.sh --groups smoke
# Параллельно с 4 потоками
./run-tests.sh --parallel 4
# Конкретная группа + окружение
./run-tests.sh --groups consumer --env ci
# Помощь
./run-tests.sh --help# Генерация статического отчёта
mvn allure:report
# Запуск встроенного HTTP-сервера (откроет браузер автоматически)
mvn allure:serveОтчёт доступен по адресу: http://localhost:PORT/
target/allure-results/ # raw JSON-результаты
target/allure-report/ # сгенерированный HTML-отчёт
target/surefire-reports/ # JUnit XML (для CI-систем)
После успешного CI: https://sherlock0731.github.io/qa-kafka-framework/
# Сертификаты должны быть доступны при сборке
ls docker/
# Dockerfile docker-compose.yml docker-run.sh README.mdcd docker
# Запуск с переменными окружения
KAFKA_BOOTSTRAP_SERVERS=kafka-xxxx.j.aivencloud.com:28330 \
KAFKA_SSL_TRUSTSTORE_PASSWORD=ваш_пароль \
KAFKA_SSL_KEYSTORE_PASSWORD=ваш_пароль \
KAFKA_SSL_KEY_PASSWORD=ваш_пароль \
AIVEN_API_TOKEN=ваш_токен \
docker-compose up --build
# С .env файлом
cp .env.example .env # заполните .env своими значениями
docker-compose up --buildcd docker
./docker-run.shПодробнее: docker/README.md
В репозитории → Settings → Secrets and variables → Actions добавьте:
| Secret | Описание |
|---|---|
KAFKA_BOOTSTRAP_SERVERS |
Адрес брокера (host:port) |
KAFKA_SSL_TRUSTSTORE_PASSWORD |
Пароль truststore |
KAFKA_SSL_KEYSTORE_PASSWORD |
Пароль keystore |
KAFKA_SSL_KEY_PASSWORD |
Пароль ключа |
AIVEN_API_TOKEN |
Bearer-токен Aiven API |
AIVEN_PROJECT_NAME |
Название проекта Aiven |
AIVEN_SERVICE_NAME |
Название Kafka-сервиса |
Также загрузите сертификаты как зашифрованные secrets (base64) или настройте их монтирование. Подробнее: docs/GITHUB_SECRETS_SETUP.md
В GitHub → Actions → Run workflow → выберите ветку и нажмите Run workflow.
javax.net.ssl.SSLHandshakeException: PKIX path building failed
Причины и решения:
- Неверный путь к
truststore.jks→ проверьтеkafka.ssl.truststore.location - Устаревший сертификат → скачайте новые сертификаты из Aiven
- Неверный тип truststore → должен быть
JKS, keystore —PKCS12 - Неверный пароль → все три пароля (truststore, keystore, key) должны совпадать
WARN - Timeout reached. Polled 0 records, expected min: 10
Причины и решения:
- Rebalance не завершился → добавьте
AsyncTestHelper.waitFor(5)послеinitConsumer()и pre-warm poll - Consumer инициализирован после отправки → следуйте паттерну consumer-first initialization
- Недостаточный таймаут → увеличьте в
AsyncTestHelper.pollWithRetry(consumer, 60, count)(до 60–90с для Aiven) - Неверная переменная
kafka.consumer.auto.offset.reset→ должно бытьearliestдля новых групп
ERROR - Failed to create topic after 5 attempts
Причины и решения:
- Rate limiting Aiven free tier → уменьшите параллелизм, добавьте
waitFor()между тестами - AdminClient SSL проблема → проверьте SSL-настройки в
KafkaTopicManager.createAdminClient() - Брокер недоступен → проверьте
KAFKA_BOOTSTRAP_SERVERS
- Убедитесь, что в
BaseTestприсутствует@AfterAll globalCleanup()с вызовомmanager.closeAll() - Не используйте
@Disabledтесты без закрытия ресурсов вfinally - Проверьте счётчик:
consumerManager.getTrackedConsumerCount()
# Проверьте наличие результатов
ls target/allure-results/
# Убедитесь, что aspectjweaver в classpath
mvn dependency:get -Dartifact=org.aspectj:aspectjweaver:1.9.21
# Принудительная регенерация
mvn allure:report -Dallure.results.directory=target/allure-results# Проверка зависимостей на уязвимости (OWASP)
mvn verify -P security-check -DnvdApiKey=ВАШ_КЛЮЧ
# Очистка артефактов сборки
mvn clean
# Запуск конкретного тест-класса
mvn test -Dtest=ProducerTests
# Запуск конкретного метода
mvn test -Dtest=ProducerTests#testSendSingleMessage
# Запуск с подробным выводом Surefire
mvn test -P smoke -Dsurefire.useFile=false
# Параллельно только smoke с подробным логом
mvn test -P parallel,smoke -Dthread.count=2 -Dsurefire.useFile=false