Ugrás a tartalomhoz

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):

Kód
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:

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

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

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

Több git-verzió ellenőrzéséhez sorold fel őket a PITMASTER_TEST_GIT_BINARIES fájlban, majd futtasd a füsttesztet:

Shell
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ó:

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

A CI a füstteszt jelentését a tárolóban rögzített küszöbértékekkel veti össze.