Testing Files Generator
Русский

Для чего это используют

Пять задач, которые возникают почти в каждом проекте, принимающем файлы от людей, и команда, решающая каждую. Каждый пример ниже запускается как написано.

Лимиты загрузки

Проверка того, что лимит размера файла применяется там, где заявлено

Лимит - это три тестовых случая, а не один: чуть ниже, ровно по лимиту и чуть выше. Получить их вручную значит считать числа байт и надеяться, что вы не ошиблись на единицу. Запросите вместо этого набор:

tfg generate --preset size-boundaries --limit 1mb --spread 1B --format pdf --out ./edges

Вы получите три настоящих PDF по 1048575, 1048576 и 1048577 байт и манифест, который говорит, что первые два нужно принять, а третий отклонить по size_limit. Ваш тест читает ожидание, вместо того чтобы вы писали три проверки вручную, а когда лимит меняется, вы меняете одно число и запускаете заново.

То же работает и без пресета, когда нужен один набор границ прямо в команде:

tfg generate --format png --boundary 5mb --out ./png-edges

Непрерывная интеграция

Держать фикстуры вне репозитория, не теряя их

Большие бинарные фикстуры замедляют клонирование репозитория и мешают ревью, а при замене никто не может сказать, что изменилось. Рецепт - это несколько сотен символов YAML, которые пересоздают те же файлы - байт в байт, на любой машине - потому что каждый файл выводится из seed запуска.

- 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

У каждого исхода свой код завершения, поэтому конвейер отличает плохой рецепт от полного диска и от расхождения при проверке. Неудачный запуск ничего не печатает в стандартный вывод, и разборщик журналов не принимает ошибку за данные.

Масштаб

Выяснить, что происходит, когда папка велика

Процедуры импорта, ночные задания и списки каталогов ведут себя иначе при десяти тысячах файлов, чем при десяти. Размеры, выбранные из диапазона, делают набор похожим на настоящий трафик, а не на десять тысяч одинаковых файлов, и выбор идёт от seed, так что завтра набор будет тем же.

tfg generate --format log --size-range 1kb-8kb --count 10000 --out ./fixtures

Проверьте, чего стоил бы запуск, до того как он что-либо запишет, это важно, когда итог измеряется гигабайтами:

tfg generate --format log --size-range 1kb-8kb --count 10000 --dry-run

Запуск больше свободного места на диске отклоняется до записи первого байта, а не заполняет диск и не падает на полпути.

Архивы

Проверка распаковщика на архиве, который действительно содержит файлы

Пустой архив с правильным расширением ничего не доказывает о коде, который его открывает и обходит содержимое. Объявите содержимое, и архив действительно его содержит:

targets:
  - id: bundle
    format: zip
    contains:
      - format: txt
        count: 200
        size: 4kb

Глубина вложенности, число записей и размер содержимого - это то, о чём у процедуры импорта есть своё мнение, и так вы узнаёте, каково оно.

Парсеры и просмотрщики

Проверка того, что ваш собственный код читает формат так же, как настоящее ПО

Каждый формат здесь проверяется независимым читателем до выпуска: PNG открывается и сравниваются его пиксели, DOCX перечитывается отдельными библиотеками, архив распаковывается. Это значит, что файл, который отклоняет ваш парсер, - находка о вашем парсере, а не о генераторе.

tfg generate --format docx --size 300kb --set paragraphs=120 --out ./documents
tfg generate --format xlsx --size 2mb --set rows=400 --set columns=6 --out ./sheets

Страница форматов перечисляет настройки каждого формата и наименьший файл, каким он может быть.

Руководства

Два из них подробнее

Для кого это

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

Бесплатно, открытый код, GPL-3.0. Без регистрации. Сборки для Windows и macOS подписаны и запускаются без предупреждений.