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 на манифесте, и он скажет, совпадает ли полученное с записанным.

Дальше

Куда идти отсюда