Testimine
Greph valideeritakse kolme testikihiga:
- Ühiktestid isoleeritud komponentidele (parserid, läbikäijad, kodekid, suvandid).
- Võrdlustestide regressioonikogu, mis võrdleb Greph väljundit kanooniliste
grep,ripgrepjaast-grepbinaarfailidega kindla stsenaariumide kogumi põhjal. - Päringupõhine funktsioonimaatriks, mis kontrollib
rgjasgümbrisklasside kinnitatud funktsioone.
CI käivitub iga main-i tõuke ja iga tõmbetaotluse (.github/workflows/ci.yml) korral. See käivitab koodistandardite kontrolli (composer cs), staatilise analüüsi (composer analyse), PHPUnit ühik- ja integratsioonitestid (composer test) ning composer audit versiooniga PHP 8.4. Võrdlustestide kogu (composer test:oracle) CI-sse ei kuulu ja funktsioonimaatriks luuakse käsitsi käsuga php bin/feature-matrix. PHPUnit testikomplekt sisaldab testi, mis loob maatriksi nii, et ülesvoolu tööriistad rg ja sg on märgitud kättesaamatuks, ning kontrollib aruande struktuuri, nii et ühe päringu taandareng ei põhjusta testi ebaõnnestumist.
Töötamine kloonitud hoidlaga
Kõik selle lehe toimingud eeldavad hoidla klooni. Kuna 0.2.3 sisaldab pakett Composer ainult src/ ja nelja käivitatavat käitusfaili; tests/, scenarios/, benchmarks/ ja arendusskriptid kataloogis bin/ on sealt välja jäetud.
git clone https://github.com/inline0/greph
cd greph
composer install
Testide käivitamine
# 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 on iga väljalaske tingimus. Kui see läbi ei lähe, pole muudatus valmis.
Võrdlusmudel
Greph järgib võrdluspõhist valideerimismudelit. Iga stsenaariumi puhul käivitatakse kolm käsku:
- Võrdlus:
grep,ripgrepvõiast-grep, mille väljund jäädvustatakse stsenaariumide kogu põhjal. - Tegelik tulemus: Greph, mille väljund jäädvustatakse sama kogu põhjal.
- Võrdleja: struktureeritud erinevuste võrdlus, mis kontrollib ridade kaupa või semantilist samaväärsust.
Kui Greph erineb võrdlusest, on Greph vale. Kui grep ja rg erinevad teineteisest, salvestab stsenaarium erinevuse jaotises oracle_disagreement, nimetab tööriista, millele Greph jaotises greph_follows järgneb, ning märgib võrdluse teise tööriistaga kui skip. Kogus esineb mõlemat suunda.
Tekstistsenaariume võrreldakse grep ja rg-ga, AST- ja ümberkirjutusstsenaariume aga sg-ga. Võrdlusväljund jäädvustatakse üks kord ja salvestatakse iga stsenaariumi kataloogi oracle/ alla, nii et tavalisel käivitamisel on vaja ainult PHP; väliseid tööriistu läheb vaja üksnes võrdlusväljundi jäädvustamiseks või värskendamiseks.
Teostus asub kataloogis tests/Oracle/ ja stsenaariumid kataloogides scenarios/text/, scenarios/ast/, scenarios/rewrite/ ja scenarios/edge/.
Stsenaariumide struktuur
Iga stsenaarium asub eraldiseisvas kataloogis:
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 määrab mustri, lipud ja otsingutee. Valikuline objekt expectations määrab iga võrdlusvahendi (exact, semantic või skip) võrdlusrežiimi; selle puudumisel võrreldakse tekstistsenaariumides täpselt grep ja rg ning semantiliselt rg JSON, AST- ja ümberkirjutusstsenaariume aga võrreldakse sg-ga.
Ühe stsenaariumi käivitamine
Hoidlas on väike komplekt CLI-tööriistu üksikute stsenaariumidega töötamiseks. Need on arendustööriistad, mitte käitusaja sisenemispunktid: need asuvad käivitatavate käitusfailide kõrval kataloogis bin/, kuid ei kuulu paketti Composer. Iga tööriist võtab stsenaariumi nime, mis on kataloogi scenarios/ suhtes.
# 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
Kogu regressioonikomplekti käivitamine
# 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
Stsenaariumid käivitatakse alati ühekaupa. --jobs N aktsepteeritakse ja see kuvatakse kokkuvõtterea, kuid see ei käivita midagi paralleelselt (#7). Värskelt kloonitud hoidlas nurjuvad text/no-ignore ja text/explicit-file-input, sest nende näidisfailid kataloogis setup/vendor/ pole sisse kantud (#6).
Regressioonitestide komplekt on uue käitumise kontrollvärav. Uus lipp, erandjuht või veaparandus nõuab stsenaariumi, mis määrab võrdlusvahendi abil oodatava käitumise.
Vastavusaruanded
./bin/verify-compliance
verify-compliance ei käivita ise midagi. See loeb eelmise stsenaariumide käivituse jäetud võrdlus-, tegeliku tulemuse ja aruandefailid ning kuvab, millised stsenaariumid läbivad kontrolli, millised nurjuvad ja millistel aruanne veel puudub. Käivitage esmalt ./bin/test-regression. --output report.json salvestab aruande ka faili JSON. Kasutage seda käsku, kui soovite teada, „kas praegune haru on väljalaskeks valmis“.
Testipõhine arendustöövoog
Funktsiooni lisamisel:
- Looge stsenaariumikataloog korpuse ja lippudega, mis uut käitumist kontrollivad.
- Jäädvustage kanoonilise tööriista väljund käsuga
./bin/oracle <scenario>. - Teostage funktsioon kataloogis
src/. - Kontrollige käsuga
./bin/test-scenario <scenario>, et Greph vastab võrdlusele. - Veenduge käsuga
./bin/test-regression --fast, et miski muu pole taandunud. - Käivitage
composer verifyenne sissekandmist.
Vea parandamisel:
- Jäädvustage nurjunud sisend stsenaariumina.
- Kinnitage, et võrdlusvahend väljastab oodatud tulemuse.
- Kinnitage, et Greph seda ei tee.
- Parandage viga.
- Kinnitage, et Greph vastab nüüd võrdlusele.
- Käivitage
composer verify.
Stsenaarium jääb jäädavalt korpusesse, et viga ei saaks tagasi tulla ilma composer test:oracle (ja composer verify) nurjumiseta.