Як генерувати тестові файли в конвеєрі 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 на
маніфесті, і він скаже, чи збігається отримане із записаним.
Далі
Куди йти звідси
- Пошкоджені тестові файли додають до того самого рецепта файли, навмисно зіпсовані.
- Сценарії використання показують, що ще може перевірити запуск у конвеєрі.
- Документація містить кожну команду, кожен ключ рецепта і кожен код завершення.