Tesztelés
A Greph validálása három tesztréteggel történik:
- Egységtesztek az elkülönített komponensekhez (elemzők, bejárók, kodekek, beállítások).
- Oracle-regressziós korpusz, amely rögzített forgatókönyvkészleten összeveti a Greph kimenetét a kanonikus
grep,ripgrepésast-grepbinárisokéval. - Próbavezérelt funkciómátrix, amely ellenőrzi a
rgéssgburkolók igazolt felületét.
A CI minden, a main ágra irányuló push és minden pull request (.github/workflows/ci.yml) esetén lefut. Ellenőrzi a kódolási szabványokat (composer cs), a statikus elemzést (composer analyse), a PHPUnit egység- és integrációs tesztcsomagjait (composer test), valamint a composer audit futtatását a PHP 8.4 verzióján. Az oracle-korpusz (composer test:oracle) nem része a CI-nak, a funkciómátrixot pedig kézzel kell újragenerálni a php bin/feature-matrix segítségével. A PHPUnit tesztcsomag tartalmaz egy tesztet, amely a mátrixot úgy generálja, hogy a felfelé irányuló rg és sg nem érhető el, majd ellenőrzi a jelentés szerkezetét, így nem bukik el attól, ha egyetlen próba visszafejlődik.
Munka klónozott tárhelyből
Az ezen az oldalon leírtakhoz a tárház klónjára van szükség. Mivel a Composer csomag már csak a src/ elemet és a négy futtatható futtatókörnyezetet tartalmazza; a 0.2.3, a tests/, a scenarios/, a benchmarks/ és a bin/ fejlesztői szkriptek kimaradnak belőle.
git clone https://github.com/inline0/greph
cd greph
composer install
A tesztek futtatása
# PHPUnit unit and integration suites
composer test
# Oracle regression corpus
composer test:oracle
# Static analysis
composer analyse
# Coding standards
composer cs
composer cs:fix
# Full release-grade verification (analyse + cs + test + test:oracle)
composer verify
A composer verify minden kiadás alapkövetelménye. Ha nem megy át, a módosítás nincs kész.
Az oracle-modell
A Greph oracle-vezérelt ellenőrzési modellt követ. Minden forgatókönyvhöz három parancs fut le:
- Oracle:
grep,ripgrepvagyast-grep, a forgatókönyv-korpuszon rögzítve. - Tényleges eredmény: Greph, ugyanazon a korpuszon rögzítve.
- Összehasonlító: strukturált különbségvizsgálat, amely soronként vagy szemantikailag ellenőrzi az egyenértékűséget.
Ha a Greph eltér az oracle-től, akkor a Greph hibás. Ha a grep és a rg eltér egymástól, a forgatókönyv a oracle_disagreement alatt rögzíti az eltérést, megnevezi azt az eszközt, amelyet a Greph követ a greph_follows esetén, és a másik eszközzel való összehasonlítás állapotát skip értékre állítja. Mindkét irány előfordul a korpuszban.
A szöveges forgatókönyvek összehasonlítása a grep és a rg ellen történik, az AST- és átírási forgatókönyveké pedig a sg ellen. Az oracle-kimenet egyszer kerül rögzítésre, és minden forgatókönyv oracle/ könyvtárába kerül, ezért egy szokásos futtatáshoz csak a PHP szükséges; külső eszközök csak az oracle-kimenet rögzítéséhez vagy frissítéséhez kellenek.
A megvalósítás helye: tests/Oracle/; a forgatókönyvek helye: scenarios/text/, scenarios/ast/, scenarios/rewrite/ és scenarios/edge/.
A forgatókönyvek felépítése
Minden forgatókönyv önálló könyvtár:
scenarios/text/literal-simple/
├── scenario.json # name, category, pattern, flags, path
├── setup/ # corpus to search through
├── oracle/ # captured oracle output (grep.txt, rg.txt, rg.json, ...)
├── actual/ # captured greph output (generated, git-ignored)
└── reports/ # comparison results (generated, git-ignored)
A scenario.json határozza meg a mintát, a jelzőket és a keresési útvonalat. Egy opcionális expectations objektum oracle-onként (exact, semantic vagy skip) állítja be az összehasonlítási módot; ennek hiányában a szöveges forgatókönyvek pontosan hasonlítják össze a grep és a rg értékét, a rg JSON értékét pedig szemantikailag, az AST- és átírási forgatókönyvek pedig a sg ellen hasonlítanak.
Egyetlen forgatókönyv futtatása
A tárház néhány CLI-eszközt kínál az egyes forgatókönyvekkel való munkához. Ezek fejlesztői eszközök, nem futtatókörnyezeti belépési pontok: a futtatókörnyezet bináris fájljai mellett találhatók a bin/ könyvtárban, de nem részei a Composer csomagnak. Mindegyik a forgatókönyv nevét kéri, a scenarios/ könyvtárhoz viszonyítva.
# Capture oracle output for a scenario (needs grep and rg, or sg)
./bin/oracle text/literal-simple
# Run greph against a scenario, capture its output
./bin/actual text/literal-simple
# Diff oracle vs actual
./bin/compare text/literal-simple
# Full pipeline: oracle (only if missing) -> actual -> compare
./bin/test-scenario text/literal-simple
# Recapture the oracle output first
./bin/test-scenario text/literal-simple --refresh
A teljes regressziós tesztcsomag futtatása
# All scenarios (the same as composer test:oracle)
./bin/test-regression
# Filter by category
./bin/test-regression --category text
./bin/test-regression --category ast
./bin/test-regression --category rewrite
./bin/test-regression --category edge
# Print only failures and the summary
./bin/test-regression --fast
# Recapture every oracle before comparing
./bin/test-regression --refresh
A forgatókönyvek mindig egyenként futnak le. A --jobs N elfogadott, és megjelenik az összefoglaló sorban, de nem futtat párhuzamosan semmit (#7). Friss klónban a text/no-ignore és a text/explicit-file-input hibát jelez, mert a setup/vendor/ alatti tesztadatfájlok nincsenek a tárházban (#6).
A regressziós tesztcsomag az új viselkedés elfogadási feltétele. Új jelzőhöz, új peremesethez vagy hibajavításhoz olyan forgatókönyv szükséges, amely oracle alapján rögzíti az elvárt viselkedést.
Megfelelőségi jelentések
./bin/verify-compliance
A verify-compliance önmagában nem futtat semmit. Beolvassa az oracle-, a tényleges és a jelentésfájlokat, amelyeket az utolsó forgatókönyv-futtatás hagyott hátra, majd kiírja, mely forgatókönyvek mentek át, melyek buktak el, és melyekhez nem készült még jelentés. Először futtassa a ./bin/test-regression eszközt. A --output report.json a jelentést JSON formátumban is elmenti. Ezt a parancsot érdemes futtatni, ha arra kíváncsi, hogy „készen áll-e az aktuális ág a kiadásra”.
Tesztvezérelt fejlesztési munkafolyamat
Funkció hozzáadásakor:
- Hozzon létre egy forgatókönyv-könyvtárat a korpusszal és az új viselkedést kipróbáló jelzőkkel.
- Futtassa a
./bin/oracle <scenario>parancsot a kanonikus eszköz kimenetének rögzítéséhez. - Valósítsa meg a funkciót a
src/helyen. - Futtassa a
./bin/test-scenario <scenario>parancsot annak ellenőrzéséhez, hogy a Greph egyezik-e az oracle-lel. - Futtassa a
./bin/test-regression --fastparancsot, hogy ellenőrizze, nem romlott-e el más működés. - Commit előtt futtassa a
composer verifyparancsot.
Hiba javításakor:
- Rögzítse a hibás bemenetet forgatókönyvként.
- Ellenőrizze, hogy az oracle az elvárt kimenetet adja-e.
- Ellenőrizze, hogy a Greph nem adja-e azt.
- Javítsa ki a hibát.
- Ellenőrizze, hogy a Greph most már egyezik-e az oracle-lel.
- Futtassa a
composer verifyparancsot.
A forgatókönyv végleg a korpuszban marad, így a hiba nem térhet vissza anélkül, hogy a composer test:oracle (és a composer verify) el ne bukna.