Testēšana
Greph validē ar trim testu slāņiem:
- Vienību testi izolētiem komponentiem (parsētājiem, staigātājiem, kodētājiem, opcijām).
- Orākula regresijas korpuss, kas salīdzina Greph izvadi ar kanonisko
grep,ripgrepunast-grepbināro failu izvadi fiksētā scenāriju kopā. - Zondēs balstīta funkciju matrica, kas pārbauda
rgunsgapvalku verificēto funkcionalitāti.
CI darbojas katrā koda nosūtīšanas reizē uz main un katrā izmaiņu pieprasījumā (.github/workflows/ci.yml). Tā pārbauda kodēšanas standartus (composer cs), statisko analīzi (composer analyse), PHPUnit vienību un integrācijas testu kopas (composer test), kā arī composer audit vidē PHP 8.4. Orākula korpuss (composer test:oracle) nav iekļauts CI, un funkciju matrica tiek ģenerēta manuāli ar php bin/feature-matrix. PHPUnit kopā ir tests, kas ģenerē matricu, atzīmējot augšupējā līmeņa rg un sg kā nepieejamus, un pārbauda pārskata struktūru, tāpēc tas neizgāžas, ja kāda atsevišķa zonde regresē.
Darbs ar klonētu repozitoriju
Visam šajā lapā aprakstītajam nepieciešams repozitorija klons. Tā kā 0.2.3 Composer pakotnē ir tikai src/ un četri izpildāmie izpildlaika faili, tajā nav iekļauts tests/, scenarios/, benchmarks/ un izstrādes skripti no bin/.
git clone https://github.com/inline0/greph
cd greph
composer install
Testu palaišana
# 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
composer verify ir obligāts katram laidienam. Ja tas neizdodas, izmaiņas nav pabeigtas.
Orākula modelis
Greph izmanto orākulā balstītu verifikācijas modeli. Katram scenārijam tiek izpildītas trīs komandas:
- Orākuls:
grep,ripgrepvaiast-grep, kas tiek palaists scenāriju korpusā. - Faktiskais rezultāts: Greph, kas tiek palaists tajā pašā korpusā.
- Salīdzinātājs: strukturēta salīdzināšana pa rindām vai pēc semantiskas ekvivalences.
Ja Greph rezultāts nesakrīt ar orākulu, Greph ir kļūdains. Ja grep un rg rezultāti nesakrīt, scenārijā šī atšķirība tiek reģistrēta sadaļā oracle_disagreement, tiek norādīts rīks, kuram Greph seko sadaļā greph_follows, un salīdzinājums ar otru rīku tiek iestatīts uz skip. Korpusā ir sastopami abi varianti.
Teksta scenāriji tiek salīdzināti ar grep un rg, AST un pārrakstīšanas scenāriji — ar sg. Orākula izvade tiek iegūta vienreiz un saglabāta katra scenārija oracle/ direktorijā, tāpēc parastai palaišanai vajadzīgs tikai PHP; ārējie rīki nepieciešami vienīgi orākula izvades iegūšanai vai atjaunošanai.
Implementācija atrodas tests/Oracle/, bet scenāriji — scenarios/text/, scenarios/ast/, scenarios/rewrite/ un scenarios/edge/.
Scenārija struktūra
Katrs scenārijs ir pašpietiekams direktorijs:
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)
scenario.json norāda paraugu, karogus un meklēšanas ceļu. Neobligāts objekts expectations nosaka salīdzināšanas režīmu katram orākulam (exact, semantic vai skip); ja tāda nav, teksta scenārijos grep un rg tiek salīdzināti precīzi, bet rg JSON — semantiski, savukārt AST un pārrakstīšanas scenāriji tiek salīdzināti ar sg.
Atsevišķa scenārija palaišana
Repozitorijā ir neliels CLI rīku komplekts darbam ar atsevišķiem scenārijiem. Tie ir izstrādes rīki, nevis izpildlaika ieejas punkti: tie atrodas blakus izpildlaika binārajiem failiem mapē bin/, taču nav iekļauti Composer pakotnē. Katrs no tiem pieņem scenārija nosaukumu attiecībā pret scenarios/.
# 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
Pilnas regresijas testu kopas palaišana
# 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
Scenāriji vienmēr tiek izpildīti pa vienam. --jobs N tiek pieņemts un atspoguļots kopsavilkuma rindā, taču tas neko neizpilda paralēli (#7). Tīrā klonā text/no-ignore un text/explicit-file-input neizdodas, jo to testa faili mapē setup/vendor/ nav iekļauti repozitorijā (#6).
Regresijas testu kopa ir vārtu pārbaude jaunai funkcionalitātei. Jauns karogs, jauns robežgadījums vai kļūdas labojums prasa scenāriju, kas fiksē gaidāmo uzvedību, salīdzinot ar orākulu.
Atbilstības pārskatu veidošana
./bin/verify-compliance
verify-compliance pats neko neizpilda. Tas nolasa orākula, faktiskos rezultātus un pārskatu failus, ko atstājusi pēdējā palaistā scenārija komanda, un izvada, kuri scenāriji ir sekmīgi, kuri neizdodas un kuriem vēl nav pārskata. Vispirms palaidiet ./bin/test-regression. --output report.json arī saglabā pārskatu kā JSON. Šī komanda jāpalaiž, ja vēlaties noskaidrot: “Vai pašreizējā zara izmaiņas ir gatavas laidienam?”
Testos balstītas izstrādes darbplūsma
Pievienojot funkciju:
- Izveidojiet scenārija direktoriju ar korpusu un karogiem, kas pārbauda jauno uzvedību.
- Palaidiet
./bin/oracle <scenario>, lai iegūtu kanoniskā rīka izvadi. - Ieviesiet funkciju mapē
src/. - Palaidiet
./bin/test-scenario <scenario>, lai pārbaudītu, vai Greph atbilst orākulam. - Palaidiet
./bin/test-regression --fast, lai pārliecinātos, ka nekas cits nav regresējis. - Pirms izmaiņu reģistrēšanas palaidiet
composer verify.
Labojot kļūdu:
- Saglabājiet kļūdaino ievadi kā scenāriju.
- Pārliecinieties, ka orākuls rada gaidīto izvadi.
- Pārliecinieties, ka Greph to nerada.
- Izlabojiet kļūdu.
- Pārliecinieties, ka Greph tagad atbilst orākulam.
- Palaidiet
composer verify.
Scenārijs vienmēr paliek korpusā, tāpēc kļūda nevar atkārtoties, neizraisot composer test:oracle (un composer verify) kļūmi.