Tesztelés és a git Oracle
A Pitmaster a kanonikus git binárist tekinti orákulumának: ha a git elfogadja, amit a Pitmaster ír, és a Pitmaster beolvassa, amit a git ír, akkor a viselkedés helyes. A tesztinfrastruktúra a Pitmaster tárolóban található. A Composer csomag csak src/ és bin/pitmaster fájlokat tartalmaz, ezért az alábbiak futtatásához klónozd a tárolót az composer install után.
Tesztcsomagok
| Parancs | Mit futtat | Szükséges a git |
|---|---|---|
composer test:unit |
PHPUnit unit tesztcsomag: elszigetelt komponens-tesztek |
Nem |
composer test:integration |
PHPUnit integration tesztcsomag: Pitmaster és git ugyanazokon a tárolókon dolgozik |
Igen |
composer test:oracle |
bin/test-regression: minden oracle-forgatókönyv |
Igen |
composer test |
PHPUnit (mindkét tesztcsomag), valamint az oracle-regresszió | Igen |
./bin/verify-all |
composer verify: támogatási bizonyítékok, upstream eltérések, bizonyító artefaktum, mutációs próba, composer audit, PHPStan, kódolási szabványok és composer test |
Igen |
A CI több PHP-verzión futtatja az egységteszteket, továbbá az integrációs teszteket, az oracle-regressziót (PITMASTER_TEST_JOBS=4), valamint a támogatási bizonyítékok és az upstream eltérések ellenőrzését.
Oracle-forgatókönyvek
Minden forgatókönyv egy könyvtár az scenarios/<category>/ alatt (összesen 761, ebből 156 a Pitmaster számára készült, 605 pedig más Git implementációkból származik):
scenarios/diff/diff-add-lines/
scenario.json # commands and expectations
setup.sh # builds the starting repository
oracle/ # outputs captured from git
A scenario.json megadja a futtatandó parancsot a git használatával és a vele egyenértékű Pitmaster paranccsal, valamint azt is, minek kell egyeznie:
{
"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 }
}
A futtatás másolatot készít a setup.sh által felépített tárolóról, az oracle-t és a Pitmaster parancsokat külön másolatokon futtatja, majd összehasonlítja a kimeneteket, objektumokat, hivatkozásokat és naplót. Az fsck_clean azt is megköveteli, hogy a git fsck elfogadja a Pitmaster által írt tárolót. Az oracle kimenetét a rendszer az git alapján rögzíti, ha hiányzik vagy frissíteni kell; egyébként a tárolóban lévő oracle/ fájlokat használja.
Egy forgatókönyv pontosan azokat az eseteket fedi le, amelyeket a beállítása létrehoz. A diff-forgatókönyvek például módosított fájlokat hasonlítanak össze, ezért a Diff oldalon felsorolt, új, törölt és bináris fájlokkal kapcsolatos diff-kimeneti eltéréseket nem észlelik.
Forgatókönyvek használata
./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
Több git-verzió ellenőrzéséhez sorold fel őket a PITMASTER_TEST_GIT_BINARIES fájlban, majd futtasd a füsttesztet:
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
vendor/bin/phpunit --filter MultiGitVersionSmokeTest
Upstream tesztkészletek
Az scenarios/upstream/ alatti forgatókönyvek más implementációk tesztcsomagjaiból származnak: a git saját tesztcsomagjából (412), az isomorphic-gitből (71), a libgit2-ből (63), a go-gitből (46), az JGit-ből (7) és a dulwichből (6). A szükséges tesztfa-fájlok az fixtures/upstream/ alatt találhatók a tárolóban, ezért a teljes tesztkészlet friss klónozás után is futtatható hálózati hozzáférés és helyi gépre mutató útvonalak nélkül. A beállító szkriptek az PITMASTER_ROOT környezeti változóval találják meg őket.
A composer verify:drift (bin/audit-upstream-drift) ellenőrzi, hogy minden tárolóban lévő upstream esethez tartozik-e forgatókönyv.
Támogatási mátrix
A tárolóban lévő SUPPORT_MATRIX.md felsorolja az összes hatókörbe tartozó git-funkciót és az állapotát:
| Állapot | Jelentés |
|---|---|
DONE |
Megvalósítva, és a megadott kompatibilitási körön belül oracle-lel ellenőrizve |
PART |
Részben megvalósítva |
TODO |
Hatókörön belül van, de még nincs megvalósítva |
DEFER |
Egyelőre nincs tervben |
N/A |
Hatókörön kívül van |
A fájlt a bin/support-matrix állítja elő a config/support-matrix.json alapján. A config/support-evidence.json minden DONE és PART sort konkrét tesztekhez és oracle-forgatókönyvekhez kapcsol, a composer verify:evidence pedig hibát jelez, ha egy sorhoz nincs bizonyíték. A CI újragenerálja a mátrixot, és hibát jelez, ha az eltér a tárolóban lévő fájltól.
Egy DONE sor azt jelenti, hogy a hozzá rögzített forgatókönyvek eredménye megegyezik a git-ével. Az ezeken kívüli viselkedés továbbra is eltérhet; az ismert eltéréseket a hibakövető tartja nyilván.
Teljesítménymérések
A teljesítménnyel kapcsolatos munkához a bench/ alatti tesztkeret használható:
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
A CI a füstteszt jelentését a tárolóban rögzített küszöbértékekkel veti össze.