Liigu sisu juurde

Testimine

Greph valideeritakse kolme testikihiga:

  1. Ühiktestid isoleeritud komponentidele (parserid, läbikäijad, kodekid, suvandid).
  2. Võrdlustestide regressioonikogu, mis võrdleb Greph väljundit kanooniliste grep, ripgrep ja ast-grep binaarfailidega kindla stsenaariumide kogumi põhjal.
  3. Päringupõhine funktsioonimaatriks, mis kontrollib rg ja sg ü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.

Shell
git clone https://github.com/inline0/greph
cd greph
composer install

Testide käivitamine

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

  1. Võrdlus: grep, ripgrep või ast-grep, mille väljund jäädvustatakse stsenaariumide kogu põhjal.
  2. Tegelik tulemus: Greph, mille väljund jäädvustatakse sama kogu põhjal.
  3. 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:

Kood
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.

Shell
# 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

Shell
# 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

Shell
./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:

  1. Looge stsenaariumikataloog korpuse ja lippudega, mis uut käitumist kontrollivad.
  2. Jäädvustage kanoonilise tööriista väljund käsuga ./bin/oracle <scenario>.
  3. Teostage funktsioon kataloogis src/.
  4. Kontrollige käsuga ./bin/test-scenario <scenario>, et Greph vastab võrdlusele.
  5. Veenduge käsuga ./bin/test-regression --fast, et miski muu pole taandunud.
  6. Käivitage composer verify enne sissekandmist.

Vea parandamisel:

  1. Jäädvustage nurjunud sisend stsenaariumina.
  2. Kinnitage, et võrdlusvahend väljastab oodatud tulemuse.
  3. Kinnitage, et Greph seda ei tee.
  4. Parandage viga.
  5. Kinnitage, et Greph vastab nüüd võrdlusele.
  6. Käivitage composer verify.

Stsenaarium jääb jäädavalt korpusesse, et viga ei saaks tagasi tulla ilma composer test:oracle (ja composer verify) nurjumiseta.