Testing Files Generator
Português (Brasil)

Para que as pessoas usam

Cinco tarefas que aparecem em quase todo projeto que aceita arquivos de pessoas, e o comando que faz cada uma. Todo exemplo abaixo roda como está escrito.

Limites de upload

Testar se um limite de tamanho de arquivo é aplicado onde diz que é

Um limite são três casos de teste, não um: logo abaixo, exatamente nele e logo acima. Conseguir esses à mão significa calcular contagens de bytes e torcer para não ter errado por um. Peça o conjunto no lugar:

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

Você recebe três PDFs reais com 1048575, 1048576 e 1048577 bytes, e um manifesto dizendo que os dois primeiros devem ser aceitos e o terceiro rejeitado por size_limit. Seu teste lê a expectativa em vez de você escrever três asserções à mão - e quando o limite muda, você muda um número e roda de novo.

O mesmo funciona sem preset quando você quer um único conjunto de limites embutido:

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

Integração contínua

Manter fixtures fora do repositório sem perdê-las

Fixtures binárias grandes deixam um repositório lento de clonar e chato de revisar, e ninguém sabe dizer o que mudou quando uma é substituída. Uma receita são algumas centenas de caracteres de YAML que reconstroem os arquivos idênticos - byte a byte, em qualquer máquina - porque cada arquivo é derivado do seed da execução.

- 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

Cada término tem seu próprio código de saída, então um pipeline consegue distinguir uma receita ruim de um disco cheio e de uma divergência de verificação. Uma execução com falha não imprime nada na saída padrão, o que impede um parser de logs de ler um erro como dado.

Escala

Descobrir o que acontece quando a pasta é grande

Rotinas de importação, jobs noturnos e listagens de diretório se comportam diferente com dez mil arquivos do que com dez. Tamanhos sorteados de um intervalo fazem o conjunto parecer tráfego real em vez de dez mil arquivos idênticos, e o sorteio vem do seed, então o conjunto é o mesmo amanhã.

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

Confira quanto uma execução custaria antes de ela escrever qualquer coisa, o que importa quando o total é medido em gigabytes:

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

Uma execução maior que o espaço livre no disco é recusada antes de o primeiro byte ser escrito, em vez de encher o disco e falhar no meio.

Arquivos compactados

Testar um descompactador com um arquivo compactado que realmente contém arquivos

Um arquivo compactado vazio com a extensão certa não prova nada sobre o código que o abre e percorre o que há dentro. Declare o conteúdo e o arquivo compactado realmente o contém:

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

Profundidade de aninhamento, contagem de entradas e tamanho do que há dentro são coisas sobre as quais uma rotina de importação tem opinião, e é assim que você descobre quais são.

Parsers e visualizadores

Conferir se o seu próprio código lê um formato como o software real

Todo formato aqui é verificado com um leitor independente antes de ser liberado - um PNG é aberto e seus pixels comparados, um DOCX é relido por bibliotecas separadas, um arquivo compactado é extraído. Isso significa que um arquivo que o seu parser recusa é uma descoberta sobre o seu parser, não sobre o gerador.

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

A página de formatos lista as configurações que cada um aceita e o menor arquivo que cada um pode ser.

Guias

Dois deles em detalhe

Para quem é

Engenheiros de QA, automação de testes e qualquer pessoa cujo código tenha atrás um formulário de upload, uma rotina de importação, um parser ou uma cota de armazenamento. Roda em uma máquina sem rede nenhuma, o que importa em um ambiente corporativo fechado onde um gerador baseado em navegador não é opção.

Gratuito e de código aberto, GPL-3.0. Sem cadastro. Os downloads de Windows e macOS são assinados e iniciam sem aviso.