Pular para o conteúdo

Testes e o oráculo do git

Pitmaster usa o binário canônico do git como oráculo: se git aceita o que Pitmaster grava, e Pitmaster lê o que git grava, o comportamento está correto. A infraestrutura de testes fica no repositório Pitmaster. O pacote Composer inclui apenas src/ e bin/pitmaster, então execute tudo abaixo a partir de um clone após composer install.

Suítes de testes

Comando O que executa Precisa de git
composer test:unit Suíte PHPUnit unit: testes isolados de componentes Não
composer test:integration Suíte PHPUnit integration: Pitmaster e git trabalhando nos mesmos repositórios Sim
composer test:oracle bin/test-regression: todos os cenários do oráculo Sim
composer test PHPUnit (ambas as suítes) mais a regressão do oráculo Sim
./bin/verify-all composer verify: evidências de suporte, divergências upstream, artefato de prova, teste rápido de mutação, composer audit, PHPStan, padrões de código e composer test Sim

O CI executa a suíte de unidade em várias versões de PHP, a suíte de integração, a regressão do oráculo (PITMASTER_TEST_JOBS=4) e as verificações de evidências de suporte e divergências upstream.

Cenários do oráculo

Cada cenário é um diretório dentro de scenarios/<category>/ (761 no total; 156 escritos para Pitmaster e 605 importados de outras implementações de Git):

Código
scenarios/diff/diff-add-lines/
  scenario.json   # commands and expectations
  setup.sh        # builds the starting repository
  oracle/         # outputs captured from git

scenario.json especifica o comando a executar com git e o comando equivalente de Pitmaster, além do que deve coincidir:

JSON
{
    "name": "diff-add-lines",
    "category": "diff",
    "operations": ["diff"],
    "oracle_commands": { "diff": "git -c color.ui=never diff" },
    "actual_commands": { "diff": "php \"{{ROOT}}/bin/pitmaster\" diff | perl -pe 's/\\e\\[[0-9;]*m//g'" },
    "expectations": { "exact_match": ["diff"], "fsck_clean": true }
}

Uma execução copia o repositório criado por setup.sh, executa o oráculo e os comandos Pitmaster em cópias separadas e compara saídas, objetos, referências e log. fsck_clean também exige que git fsck aceite o repositório gravado por Pitmaster. A saída do oráculo é capturada de git quando está ausente ou é atualizada; caso contrário, são usados os arquivos oracle/ incluídos no repositório.

Um cenário abrange exatamente os casos criados pela sua configuração. Os cenários de diff, por exemplo, comparam arquivos modificados, por isso não detectam as diferenças na saída de diff para arquivos novos, excluídos e binários listadas em Diff.

Trabalhar com cenários

Shell
./bin/test-scenario <name>                 # oracle, actual, compare for one scenario
./bin/test-regression                      # all scenarios
./bin/test-regression --jobs 4             # in parallel (or PITMASTER_TEST_JOBS=4)
./bin/test-regression --category diff      # one category
./bin/test-regression --fast               # pass/fail only, no reports

./bin/oracle <name>                        # capture git output for a scenario
./bin/oracle --refresh <name>              # re-capture, for example after a git upgrade
./bin/actual <name>                        # run Pitmaster and capture its output
./bin/compare <name>                       # compare oracle and actual output

Para verificar várias versões de git, liste-as em PITMASTER_TEST_GIT_BINARIES e execute o teste rápido:

Shell
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
  vendor/bin/phpunit --filter MultiGitVersionSmokeTest

Conjuntos de testes upstream

Os cenários em scenarios/upstream/ são importados das suítes de teste de outras implementações: a suíte de testes do próprio git (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) e dulwich (6). As árvores de fixtures necessárias estão incluídas em fixtures/upstream/, então o conjunto completo pode ser executado a partir de um clone novo sem acesso à rede nem caminhos locais da máquina. Os scripts de configuração as encontram pela variável de ambiente PITMASTER_ROOT.

composer verify:drift (bin/audit-upstream-drift) verifica se cada caso upstream incluído está associado a um cenário.

Matriz de suporte

SUPPORT_MATRIX.md no repositório lista cada recurso de git dentro do escopo e seu status:

Status Significado
DONE Implementado e verificado pelo oráculo dentro do escopo de paridade declarado
PART Parcialmente implementado
TODO Dentro do escopo, ainda não implementado
DEFER Ainda não planejado
N/A Fora do escopo

O arquivo é gerado por bin/support-matrix a partir de config/support-matrix.json. config/support-evidence.json associa cada linha de DONE e PART a testes concretos e cenários do oráculo, e composer verify:evidence falha quando uma linha não tem evidências. O CI regenera a matriz e falha se o arquivo no repositório for diferente.

Uma linha DONE significa que os cenários registrados para ela correspondem a git. O comportamento ainda pode divergir fora desses cenários; as diferenças conhecidas são acompanhadas no rastreador de problemas.

Benchmarks

O trabalho de desempenho usa o harness em bench/:

Shell
composer bench -- --suite=smoke --runs=1 --warmups=0   # quick check
composer bench:baseline                                # full report
composer bench:compare -- <before.json> <after.json>   # compare two reports
composer bench:verify -- <report.json> bench/reports/smoke-thresholds.json

O CI verifica o relatório do teste rápido em relação aos limites registrados.