savetest-cli
savetest-cli - CLI-утилита для загрузки результатов автотестов из CI/CD в SaveTest.
Утилита:
- упаковывает каталог
allure-resultsв ZIP; - загружает архив в SaveTest;
- создает новый тест-ран или дозагружает результаты в существующий.
Требование: Python 3.8+.
Установка
pip install savetest-cli
Быстрый старт
- Сформируйте
allure-resultsпосле прогона тестов. - Упакуйте результаты.
- Передайте параметры подключения через переменные окружения.
- Выполните загрузку.
savetest zip_report ./allure-results
export SAVETEST_HOST=https://savetest.example.com
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
export SAVETEST_PROJECT_ID=42
export SAVETEST_BRANCH=main
savetest upload --test-run-name "Smoke $(date +%Y-%m-%d)"
После успешного импорта CLI выводит ссылку на тест-ран.
Примечание
Для импорта нужен ZIP с allure-results, а не готовый HTML-отчет allure-report.
Разметка автотестов (@allure.testcase, @allure.tms, @allure.id) описана в разделе Автотесты.
Команды
savetest zip_report <PATH>
Упаковывает директорию с Allure-результатами в ZIP.
По умолчанию вложения (скриншоты, видео, *-attachment.*) не включаются - архив получается меньше и загружается быстрее.
| Опция | По умолчанию | Описание |
|---|---|---|
PATH | — | Путь к allure-results |
--output, -o | allure-results.zip | Выходной ZIP |
--include-attachments | выкл. | Включить вложения |
savetest zip_report ./allure-results
savetest zip_report ./allure-results --output report.zip
savetest zip_report ./allure-results --include-attachments
Совет
Отключайте вложения для регулярных nightly/регрессионных прогонов, если важнее скорость загрузки.
savetest upload
Загружает ZIP в SaveTest по частям и по умолчанию ожидает завершения импорта.
Переменные окружения
| Переменная | Обязательна | Назначение |
|---|---|---|
SAVETEST_HOST | да | URL SaveTest, например https://savetest.example.com |
SAVETEST_TOKEN | да | API-токен пользователя |
SAVETEST_PROJECT_ID | да | ID проекта |
SAVETEST_BRANCH | нет | Ветка Git |
SAVETEST_TEST_RUN_ID | нет | ID существующего тест-рана |
SAVETEST_TEST_RUN_NAME | нет | Имя нового тест-рана |
SAVETEST_INCLUDE_ATTACHMENTS | нет | true - включить вложения |
Остальные поля тест-рана (description, version, revision, test-object, epic, configuration) можно передавать флагами savetest upload или соответствующими переменными окружения.
Основные опции
| Опция | По умолчанию | Описание |
|---|---|---|
--zip-file, -z | allure-results.zip | Путь к ZIP |
--include-attachments | false | Включить вложения в ZIP |
--chunk-size | 50 | Размер чанка в МБ |
--wait / --no-wait | --wait | Ждать завершения импорта |
--timeout | 3600 | Таймаут ожидания в секундах |
--poll-interval | 1.5 | Интервал опроса в секундах |
Параметры подключения (host, token, project-id, branch) и поля тест-рана (test-run-name, test-run-id, description, version, revision, test-object, epic, configuration) можно передавать как флагами, так и через переменные окружения.
Примеры
savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
# Новый тест-ран с метаданными
savetest upload \
--branch main \
--test-run-name "Smoke $(date +%Y-%m-%d)" \
--epic-name "Release 2.4"
# Добавить описание и версию
savetest upload \
--branch main \
--test-run-name "Nightly $(date +%Y-%m-%d)" \
--version "2.4.0" \
--description "Nightly smoke on staging"
# Дозагрузка в существующий тест-ран
savetest upload --branch main --test-run-id 17
# Другой ZIP с вложениями, без ожидания импорта
savetest upload --zip-file full-report.zip --include-attachments --no-wait
Инфо
--no-wait полезен в CI, если не нужно ждать финальный статус импорта в рамках текущего job.
Получение API-токена
- Войдите в SaveTest и откройте Профиль -> API-токены.
- Создайте токен и скопируйте значение (
sat_...). - Сохраните токен в секретах CI (Jenkins Credentials, GitLab CI/CD Variables, GitHub Secrets).
Подробнее о токенах - в разделе Профиль пользователя.
Настройка в Jenkins
Добавьте токен в Jenkins -> Manage Jenkins -> Credentials (тип: Secret text, ID: savetest-token).
pipeline {
agent any
parameters {
string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта')
string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
string(name: 'SAVETEST_TEST_RUN_ID', defaultValue: '', description: 'ID тест-рана (пусто = новый)')
booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Вложения в ZIP')
}
stages {
stage('Upload to SaveTest') {
steps {
withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
sh '''
pip install savetest-cli
savetest zip_report "${WORKSPACE}/allure-results" \
$([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
savetest upload \
--host "${SAVETEST_HOST}" \
--project-id "${SAVETEST_PROJECT_ID}" \
--branch "${SAVETEST_BRANCH}" \
--test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
$( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
$( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
'''
}
}
}
}
}
SAVETEST_TOKEN передается через withCredentials и не выводится в лог сборки.
Подробнее о логике импорта и сопоставления - в разделе Автотесты.