Treci la conținut

Testarea și oracle-ul git

Pitmaster folosește binarul canonic git ca oracle: dacă git acceptă ce scrie Pitmaster și Pitmaster citește ce scrie git, comportamentul este corect. Infrastructura de testare se află în depozitul Pitmaster. Pachetul Composer include doar src/ și bin/pitmaster, așa că rulați tot ce urmează dintr-o clonă după composer install.

Suite de teste

Comandă Ce rulează Necesită git
composer test:unit PHPUnit unit: teste izolate ale componentelor Nu
composer test:integration PHPUnit integration: Pitmaster și git lucrează pe aceleași depozite Da
composer test:oracle bin/test-regression: fiecare scenariu oracle Da
composer test PHPUnit (ambele suite) plus testul de regresie oracle Da
./bin/verify-all composer verify: dovezi de compatibilitate, diferențe față de versiunile din amonte, artefact de probă, test rapid de mutații, composer audit, PHPStan, standarde de cod și composer test Da

CI rulează suita unitară pe mai multe versiuni PHP, suita de integrare, testul de regresie oracle (PITMASTER_TEST_JOBS=4) și verificările dovezilor de compatibilitate și ale diferențelor față de versiunile din amonte.

Scenarii oracle

Fiecare scenariu este un director în scenarios/<category>/ (761 în total, dintre care 156 create pentru Pitmaster și 605 importate din alte implementări Git):

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

scenario.json indică comanda de rulat cu git și comanda echivalentă Pitmaster, precum și ce trebuie să corespundă:

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 }
}

O rulare copiază depozitul creat de setup.sh, rulează oracle-ul și comenzile Pitmaster pe copii separate și compară ieșirile, obiectele, referințele și jurnalul. fsck_clean impune, de asemenea, ca git fsck să accepte depozitul scris de Pitmaster. Ieșirea oracle este capturată din git când lipsește sau este reîmprospătată; în caz contrar, sunt folosite fișierele oracle/ comise.

Un scenariu acoperă exact cazurile create de configurarea sa. De exemplu, scenariile diff compară fișiere modificate, motiv pentru care diferențele de ieșire diff pentru fișiere noi, șterse și binare, listate în Diff, nu sunt detectate de acestea.

Lucrul cu scenariile

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

Pentru a verifica mai multe versiuni git, listați-le în PITMASTER_TEST_GIT_BINARIES și rulați testul rapid:

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

Corpusuri din amonte

Scenariile din scenarios/upstream/ sunt importate din suitele de teste ale altor implementări: suita proprie de teste a git (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) și dulwich (6). Arborii cu datele de test necesari sunt incluși în fixtures/upstream/, astfel încât întregul corpus poate fi rulat după o clonare nouă, fără acces la rețea sau căi locale ale mașinii. Scripturile de configurare îi găsesc prin variabila de mediu PITMASTER_ROOT.

composer verify:drift (bin/audit-upstream-drift) verifică dacă fiecare caz din amonte inclus este asociat unui scenariu.

Matricea de compatibilitate

SUPPORT_MATRIX.md din depozit listează fiecare funcție git inclusă în domeniul de aplicare, împreună cu starea sa:

Stare Semnificație
DONE Implementată și verificată cu oracle-ul în limitele de compatibilitate declarate
PART Implementată parțial
TODO Inclusă în domeniul de aplicare, dar încă neimplementată
DEFER Nu este încă planificată
N/A În afara domeniului de aplicare

Fișierul este generat de bin/support-matrix din config/support-matrix.json. config/support-evidence.json leagă fiecare rând DONE și PART de teste concrete și scenarii oracle, iar composer verify:evidence eșuează dacă un rând nu are dovezi. CI regenerează matricea și eșuează dacă fișierul comis diferă.

Un rând DONE înseamnă că scenariile înregistrate pentru acesta corespund cu git. Comportamentul poate diferi în continuare în afara acestor scenarii; diferențele cunoscute sunt urmărite în trackerul de probleme.

Teste de performanță

Activitățile de optimizare a performanței folosesc instrumentul de testare din 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

CI verifică raportul testului rapid în raport cu pragurile comise.