Testovanie a oracle nástroja git
Pitmaster považuje kanonický binárny súbor git za oracle: ak git prijme to, čo Pitmaster zapíše, a Pitmaster načíta to, čo git zapíše, správanie je správne. Infraštruktúra testov sa nachádza v repozitári Pitmaster. Balík Composer obsahuje iba src/ a bin/pitmaster, preto všetko uvedené nižšie spúšťajte z klonu po composer install.
Testovacie sady
| Príkaz | Čo spúšťa | Vyžaduje git |
|---|---|---|
composer test:unit |
sada PHPUnit unit: izolované testy komponentov |
Nie |
composer test:integration |
sada PHPUnit integration: Pitmaster a git pracujúce s rovnakými repozitármi |
Áno |
composer test:oracle |
bin/test-regression: všetky scenáre oracle |
Áno |
composer test |
PHPUnit (obe sady) a regresné testy oracle | Áno |
./bin/verify-all |
composer verify: dôkazy o podpore, odchýlky od upstreamu, artefakt dôkazu, smoke test mutácií, composer audit, PHPStan, štandardy kódovania a composer test |
Áno |
CI spúšťa jednotkovú sadu na viacerých verziách PHP, integračnú sadu, regresné testy oracle (PITMASTER_TEST_JOBS=4) a kontroly dôkazov o podpore a odchýlok od upstreamu.
Scenáre oracle
Každý scenár je adresárom v scenarios/<category>/ (spolu ich je 761: 156 bolo vytvorených pre Pitmaster a 605 importovaných z iných implementácií Git):
scenarios/diff/diff-add-lines/
scenario.json # commands and expectations
setup.sh # builds the starting repository
oracle/ # outputs captured from git
scenario.json uvádza príkaz, ktorý sa má spustiť pomocou git, jeho ekvivalentný príkaz Pitmaster a požiadavky na zhodu:
{
"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 }
}
Spustenie skopíruje repozitár vytvorený pomocou setup.sh, spustí referenčnú implementáciu a príkazy Pitmaster v samostatných kópiách a porovná výstupy, objekty, odkazy a záznam. fsck_clean tiež vyžaduje, aby git fsck dokázal spracovať repozitár vytvorený pomocou Pitmaster. Výstup referenčnej implementácie sa zachytí z git, ak chýba alebo sa obnovuje; inak sa použijú potvrdené súbory oracle/.
Scenár pokrýva presne tie prípady, ktoré pripraví jeho nastavenie. Napríklad scenáre diff porovnávajú upravené súbory, preto v nich nie sú zachytené rozdiely vo výstupe diff pre nové, odstránené a binárne súbory uvedené v Diff.
Práca so scenármi
./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
Ak chcete skontrolovať niekoľko verzií git, uveďte ich v PITMASTER_TEST_GIT_BINARIES a spustite smoke test:
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
vendor/bin/phpunit --filter MultiGitVersionSmokeTest
Korpusy z upstreamu
Scenáre v scenarios/upstream/ sa importujú z testovacích sád iných implementácií: vlastná testovacia sada nástroja git (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) a dulwich (6). Potrebné stromy testovacích súborov sú uložené v fixtures/upstream/, takže celý korpus možno spustiť z čerstvého checkoutu bez prístupu k sieti a ciest lokálnych pre konkrétny počítač. Nastavovacie skripty ich nájdu pomocou premennej prostredia PITMASTER_ROOT.
composer verify:drift (bin/audit-upstream-drift) kontroluje, či je každý uložený upstreamový prípad priradený k scenáru.
Matica podpory
SUPPORT_MATRIX.md v repozitári uvádza všetky funkcie git v rozsahu spolu s ich stavom:
| Stav | Význam |
|---|---|
DONE |
Implementované a overené pomocou oracle v rámci deklarovaného rozsahu zhody |
PART |
Čiastočne implementované |
TODO |
V rozsahu, zatiaľ neimplementované |
DEFER |
Zatiaľ sa neplánuje |
N/A |
Mimo rozsahu |
Súbor generuje bin/support-matrix z config/support-matrix.json. config/support-evidence.json prepája každý riadok DONE a PART s konkrétnymi testami a scenármi oracle a composer verify:evidence zlyhá, ak riadok nemá žiadny dôkaz. CI maticu znova vygeneruje a zlyhá, ak sa vygenerovaný súbor líši od potvrdeného súboru.
Riadok DONE znamená, že zaznamenané scenáre sa zhodujú s git. Správanie sa môže líšiť mimo týchto scenárov; známe rozdiely sa sledujú v sledovači problémov.
Výkonnostné testy
Práca na výkonnosti využíva testovací rámec v bench/:
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 overuje smoke report podľa potvrdených prahových hodnôt.