Pāriet uz saturu

Testēšana un git Oracle

Pitmaster par orākulu izmanto kanonisko git bināro failu: ja git pieņem to, ko raksta Pitmaster, un Pitmaster nolasa to, ko raksta git, uzvedība ir pareiza. Testēšanas infrastruktūra atrodas repozitorijā Pitmaster. Pakotnē Composer ir iekļautas tikai src/ un bin/pitmaster, tāpēc, lai palaistu tālāk aprakstītos testus, vispirms klonējiet repozitoriju un izpildiet composer install.

Testu kopas

Komanda Ko tā palaiž Nepieciešams git
composer test:unit PHPUnit unit kopa: izolēti komponentu testi Nē
composer test:integration PHPUnit integration kopa: Pitmaster un git darbojas tajos pašos repozitorijos Jā
composer test:oracle bin/test-regression: visi orākula scenāriji Jā
composer test PHPUnit (abas kopas) un orākula regresijas testu Jā
./bin/verify-all composer verify: atbalsta pierādījumi, augšupstraumes izmaiņas, pierādījuma artefakts, mutāciju dūmu tests, composer audit, PHPStan, kodēšanas standarti un composer test Jā

CI palaiž vienību testu kopu ar vairākām PHP versijām, integrācijas testu kopu, orākula regresijas testu (PITMASTER_TEST_JOBS=4), kā arī atbalsta pierādījumu un augšupstraumes izmaiņu pārbaudes.

Orākula scenāriji

Katrs scenārijs ir direktorijs zem scenarios/<category>/ (kopā 761: 156 rakstīti Pitmaster un 605 importēti no citām Git implementācijām):

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

scenario.json norāda palaižamo komandu ar git un tai līdzvērtīgo Pitmaster komandu, kā arī to, kam jāsakrīt:

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

Palaišanas laikā tiek kopēts repozitorijs, ko izveidoja setup.sh, tad orākula komandas un Pitmaster komandas tiek izpildītas atsevišķās kopijās un salīdzinātas izvades, objekti, atsauces un žurnāls. fsck_clean papildus pieprasa, lai git fsck pieņemtu repozitoriju, ko izveidoja Pitmaster. Orākula izvade tiek iegūta no git, ja tās trūkst vai tā jāatjauno; citādi tiek izmantoti repozitorijā iekļautie oracle/ faili.

Scenārijs aptver tikai tos gadījumus, ko izveido tā iestatīšana. Piemēram, diff scenāriji salīdzina modificētus failus, tāpēc tie neuztver atšķirības diff izvadē jaunajiem, dzēstajiem un binārajiem failiem, kas uzskaitītas Diff.

Darbs ar scenārijiem

Apvalks
./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

Lai pārbaudītu vairākas git versijas, norādiet tās failā PITMASTER_TEST_GIT_BINARIES un palaidiet dūmu testu:

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

Augšupstraumes testu korpusi

Scenāriji, kas atrodas scenarios/upstream/, ir importēti no citu implementāciju testu kopām: paša git testu kopa (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) un dulwich (6). Nepieciešamie testa datu koki ir iekļauti fixtures/upstream/, tāpēc visu korpusu var palaist pēc tīras repozitorija lejupielādes bez tīkla piekļuves vai lokāliem ceļiem. Iestatīšanas skripti tos atrod, izmantojot vides mainīgo PITMASTER_ROOT.

composer verify:drift (bin/audit-upstream-drift) pārbauda, vai katram iekļautajam augšupstraumes gadījumam ir atbilstošs scenārijs.

Atbalsta matrica

SUPPORT_MATRIX.md repozitorijā uzskaita visas tvērumā ietvertās git funkcijas un to statusu:

Statuss Nozīme
DONE Ieviests un pārbaudīts ar orākulu deklarētajā saderības tvērumā
PART Ieviests daļēji
TODO Iekļauts tvērumā, vēl nav ieviests
DEFER Pagaidām nav plānots
N/A Ārpus tvēruma

Failu ģenerē bin/support-matrix no config/support-matrix.json. config/support-evidence.json sasaista katru DONE un PART rindu ar konkrētiem testiem un orākula scenārijiem, bet composer verify:evidence neizdodas, ja rindai nav pierādījumu. CI atjauno matricu un ziņo par kļūdu, ja tā atšķiras no repozitorijā esošā faila.

Rinda DONE nozīmē, ka tajā norādītie scenāriji atbilst git. Ārpus šiem scenārijiem uzvedība joprojām var atšķirties; zināmās atšķirības tiek reģistrētas problēmu izsekotājā.

Veiktspējas testi

Veiktspējas uzlabojumiem tiek izmantots ietvars zem bench/:

Apvalks
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 pārbauda dūmu testa pārskatu, salīdzinot to ar repozitorijā iekļautajiem sliekšņiem.