Testing Files Generator
Українська

Як генерувати тестові файли в конвеєрі CI

Двійкова фікстура в репозиторії лишається в його історії назавжди, її не можна перевірити в діфі, і вона перестає бути можливою, коли файл великий. Генеруйте файли всередині конвеєра з рецепта. Рецепт - це текст, байти щоразу виходять однакові, а останній крок доводить, що нічого не зсунулося.

Коротка відповідь

Установіть tfg, запустіть tfg generate fixtures.yaml --out ./fixtures перед тестами і tfg verify ./fixtures/manifest.json після них. Обидва кроки самі валять збірку, з кодом завершення, який каже чому.

Чому не комітити

Чому фікстурі не місце в репозиторії

Комітити потрібно рецепт. Той самий рецепт із тим самим зерном записує ті самі байти на будь-якій машині, тож файл, створений у конвеєрі, - це файл, який був у вас на ноутбуці.

Рецепт

Рецепт, що лежить поруч із тестами

Цей записує двадцять п'ять рахунків, які мають бути прийняті, і два зображення понад ліміт, які мають бути відхилені, а маніфест фіксує обидва очікування:

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

Коли стає червоно

Що валить крок і чому

У кожного завершення свій код, тож крок падає сам, а журнал каже, який саме. Ті, що трапляються конвеєру:

Невдалий запуск нічого не друкує у стандартний вивід, тож розбирач журналів ніколи не сприйме помилку за дані. Уся таблиця на сторінці документації.

PowerShell

Скрипту PowerShell потрібен ще один рядок

PowerShell не виносить код завершення програми з файлу .ps1. Запустіть такий файл із -File, і скрипт відповість 0, навіть коли інструмент усередині відмовився працювати, тож збірка, яка мала б бути червоною, стає зеленою. Останній рядок - це все виправлення:

tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE

Так поводиться PowerShell, а не цей інструмент. cmd, bash і zsh нічого зайвого не потребують.

Кілька завдань

Як ділитися фікстурами між завданнями

Зазвичай завантажувати їх не треба. Оскільки той самий рецепт записує ті самі байти, кожне завдання може запустити власний tfg generate, що швидше за завантаження й скачування. Коли завдання має отримати файли від іншого, запустіть після передачі tfg verify на маніфесті, і він скаже, чи збігається отримане із записаним.

Далі

Куди йти звідси