Pereiti prie turinio

Testavimas ir git orakulas

Pitmaster kanoninį git dvejetainį failą laiko orakulu: jei git priima tai, ką įrašo Pitmaster, ir Pitmaster perskaito tai, ką įrašo git, veikimas teisingas. Testavimo infrastruktūra yra Pitmaster saugykloje. Composer pakete yra tik src/ ir bin/pitmaster, todėl viską, kas aprašyta toliau, vykdykite iš klono po composer install.

Testų rinkiniai

Komanda Ką vykdo Reikia git
composer test:unit PHPUnit unit rinkinys: izoliuoti komponentų testai Ne
composer test:integration PHPUnit integration rinkinys: Pitmaster ir git darbas su tomis pačiomis saugyklomis Taip
composer test:oracle bin/test-regression: visi orakulo scenarijai Taip
composer test PHPUnit (abu rinkiniai) ir orakulo regresija Taip
./bin/verify-all composer verify: palaikymo įrodymai, aukštesniųjų projektų pokyčiai, įrodymo artefaktas, mutacijų patikra, composer audit, PHPStan, kodavimo standartai ir composer test Taip

CI vykdo vienetinių testų rinkinį su keliomis PHP versijomis, integracinių testų rinkinį, orakulo regresiją (PITMASTER_TEST_JOBS=4) ir palaikymo įrodymų bei aukštesniųjų projektų pokyčių patikras.

Orakulo scenarijai

Kiekvienas scenarijus yra katalogas aplanke scenarios/<category>/ (iš viso 761, 156 sukurtų Pitmaster, o 605 importuotų iš kitų Git realizacijų):

Kodas
scenarios/diff/diff-add-lines/
  scenario.json   # commands and expectations
  setup.sh        # builds the starting repository
  oracle/         # outputs captured from git

scenario.json nurodo komandą, kurią reikia vykdyti su git, jai lygiavertę Pitmaster komandą ir tai, kas turi sutapti:

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

Vykdymo metu nukopijuojama setup.sh sukurta saugykla, orakulas ir Pitmaster komandos paleidžiamos atskirose kopijose, o išvestys, objektai, nuorodos ir žurnalas palyginami. fsck_clean taip pat reikalauja, kad git fsck priimtų Pitmaster sukurtą saugyklą. Orakulo išvestis užfiksuojama iš git, jei jos nėra arba ji atnaujinama; kitu atveju naudojami įrašyti oracle/ failai.

Scenarijus apima tiksliai tuos atvejus, kuriuos sukuria jo sąranka. Pavyzdžiui, diff scenarijuose lyginami pakeisti failai, todėl Diff išvardyti naujų, ištrintų ir dvejetainių failų diff išvesties skirtumai jais neaptinkami.

Darbas su scenarijais

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

Norėdami patikrinti kelias git versijas, išvardykite jas PITMASTER_TEST_GIT_BINARIES ir paleiskite greitąjį testą:

Shell
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
  vendor/bin/phpunit --filter MultiGitVersionSmokeTest

Aukštesniųjų projektų testų rinkiniai

scenarios/upstream/ scenarijai importuoti iš kitų realizacijų testų rinkinių: paties git testų rinkinio (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) ir dulwich (6). Jiems reikalingi testinių duomenų medžiai įtraukti į saugyklą aplanke fixtures/upstream/, todėl visas rinkinys veikia iš naujo klono be tinklo prieigos ir vietinių kompiuterio kelių. Sąrankos scenarijai juos randa naudodami aplinkos kintamąjį PITMASTER_ROOT.

composer verify:drift (bin/audit-upstream-drift) tikrina, ar kiekvienas įtrauktas aukštesniojo projekto atvejis susietas su scenarijumi.

Palaikymo matrica

SUPPORT_MATRIX.md saugykloje pateikia visas į aprėptį įtrauktas git funkcijas ir jų būseną:

Būsena Reikšmė
DONE Įgyvendinta ir patikrinta orakulu pagal deklaruotą suderinamumo aprėptį
PART Įgyvendinta iš dalies
TODO Įtraukta į aprėptį, bet dar neįgyvendinta
DEFER Kol kas neplanuojama
N/A Už aprėpties ribų

Failą iš config/support-matrix.json sugeneruoja bin/support-matrix. config/support-evidence.json susieja kiekvieną DONE ir PART eilutę su konkrečiais testais ir orakulo scenarijais, o composer verify:evidence nepavyksta, jei eilutė neturi įrodymų. CI iš naujo sugeneruoja matricą ir pateikia klaidą, jei ji skiriasi nuo įrašyto failo.

Eilutė DONE reiškia, kad joje nurodyti scenarijai sutampa su git. Už šių scenarijų ribų veikimas vis dar gali skirtis; žinomi skirtumai registruojami issue tracker.

Našumo testai

Našumo darbams naudojama testavimo aplinka aplanke bench/:

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

CI patikrina greitojo testo ataskaitą pagal įrašytas ribines reikšmes.