Как генерировать тестовые файлы в конвейере CI
Двоичная фикстура в репозитории остаётся в его истории навсегда, её нельзя проверить в диффе, и она перестаёт быть возможной, когда файл велик. Генерируйте файлы внутри конвейера из рецепта. Рецепт - это текст, байты каждый раз выходят одинаковыми, а последний шаг доказывает, что ничего не сдвинулось.
Короткий ответ
Установите tfg, запустите tfg generate fixtures.yaml --out ./fixtures
перед тестами и tfg verify ./fixtures/manifest.json после них. Оба шага сами роняют
сборку, с кодом завершения, который говорит почему.
Почему не коммитить
Почему фикстуре не место в репозитории
- Она остаётся в истории. Удаление двоичного файла позже не делает клон меньше, потому что каждая его версия всё ещё там.
- Дифф не показывает, что изменилось. Рецензент видит, что PDF другой, и ничего больше. Рецепт меняется на одну строку.
- Большие файлы не помещаются. GitHub отклоняет push, в котором есть файл больше 100 МБ, поэтому тесту лимита загрузки в 500 МБ нечего коммитить.
Коммитить нужно рецепт. Один и тот же рецепт с тем же зерном записывает одни и те же байты на любой машине, поэтому файл, созданный в конвейере, - это файл, который был у вас на ноутбуке.
Рецепт
Рецепт, который лежит рядом с тестами
Этот записывает двадцать пять счетов, которые должны быть приняты, и два изображения сверх лимита, которые должны быть отклонены, а манифест фиксирует оба ожидания:
version: 1
seed: 7741
targets:
- id: invoices
format: pdf
count: 25
size: 300kb
expected: accept
- id: over_the_limit
format: png
count: 2
size: 12mb
expected:
outcome: reject
reason: size_limit
tfg validate fixtures.yaml проверяет его, ничего не записывая, и называет сразу все
проблемы.
GitHub Actions
Workflow, который устанавливает инструмент и собирает фикстуры
jobs:
test:
runs-on: ubuntu-latest
env:
TFG_VERSION: "0.4.0"
steps:
- uses: actions/checkout@v4
- name: install tfg
run: |
base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
curl -fsSLO "$base/verify-SHA256SUMS.txt"
sha256sum --check --ignore-missing verify-SHA256SUMS.txt
tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
sudo mv tfg /usr/local/bin/
- name: build the fixtures
run: tfg generate fixtures.yaml --out ./fixtures
- name: run the tests
run: pytest tests/
- name: nothing moved
run: tfg verify ./fixtures/manifest.json
Строка с контрольной суммой сверяет архив с verify-SHA256SUMS.txt из того же выпуска.
Версия зафиксирована, так что новый выпуск никогда не изменит сборку, которой вы не касались.
GitLab CI
То же самое как задание GitLab
fixtures:
image: ubuntu:24.04
variables:
TFG_VERSION: "0.4.0"
script:
- apt-get update -qq && apt-get install -y -qq curl ca-certificates
- base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
- curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
- curl -fsSLO "$base/verify-SHA256SUMS.txt"
- sha256sum --check --ignore-missing verify-SHA256SUMS.txt
- tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
- ./tfg generate fixtures.yaml --out ./fixtures
- pytest tests/
- ./tfg verify ./fixtures/manifest.json
Когда становится красно
Что роняет шаг и почему
У каждого завершения свой код, так что шаг падает сам, а журнал говорит, какой именно. Те, что встречает конвейер:
3- рецепт недопустим. Ничего не записано, и названа каждая проблема4- формат не умеет того, что попросили, например размера меньше своего минимума6- не хватает места на диске7-tfg verifyнашёл файл, не совпадающий со своим манифестом8- запуск закончился, но создано не всё
Неудачный запуск ничего не печатает в стандартный вывод, поэтому разборщик журналов никогда не примет ошибку за данные. Вся таблица на странице документации.
PowerShell
Скрипту PowerShell нужна ещё одна строка
PowerShell не выносит код завершения программы из файла .ps1. Запустите такой файл с
-File, и скрипт ответит 0, даже когда инструмент внутри отказался
работать, так что сборка, которая должна быть красной, становится зелёной. Последняя строка -
это всё исправление:
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
Так ведёт себя PowerShell, а не этот инструмент. cmd, bash и
zsh ничего лишнего не требуют.
Несколько заданий
Как делиться фикстурами между заданиями
Обычно загружать их не нужно. Поскольку один и тот же рецепт записывает одни и те же байты, каждое
задание может запустить собственный tfg generate, что быстрее загрузки и
скачивания. Когда задание должно получить файлы от другого, запустите после передачи tfg
verify на манифесте, и он скажет, совпадает ли полученное с записанным.
Дальше
Куда идти отсюда
- Повреждённые тестовые файлы добавляют в тот же рецепт файлы, намеренно испорченные.
- Сценарии использования показывают, что ещё может проверить запуск в конвейере.
- Документация содержит каждую команду, каждый ключ рецепта и каждый код завершения.