Testler ve git Oracle'ı
Pitmaster, kanonik git ikilisini oracle olarak kullanır: git, Pitmaster tarafından yazılanı kabul ederse ve Pitmaster, git tarafından yazılanı okuyabilirse davranış doğrudur. Test altyapısı Pitmaster deposunda bulunur. Composer paketi yalnızca src/ ve bin/pitmaster içerir; bu nedenle aşağıdaki her şeyi composer install işleminden sonra bir klondan çalıştırın.
Test paketleri
| Komut | Çalıştırdığı | git gerekli mi |
|---|---|---|
composer test:unit |
PHPUnit unit paketi: yalıtılmış bileşen testleri |
Hayır |
composer test:integration |
PHPUnit integration paketi: aynı depolarda çalışan Pitmaster ve git |
Evet |
composer test:oracle |
bin/test-regression: tüm oracle senaryoları |
Evet |
composer test |
PHPUnit (her iki paket) ve oracle regresyonu | Evet |
./bin/verify-all |
composer verify: destek kanıtı, üst akış sapması, kanıt yapıtı, mutasyon duman testi, composer audit, PHPStan, kodlama standartları ve composer test |
Evet |
CI, birim paketini birkaç PHP sürümünde, entegrasyon paketini, oracle regresyonunu (PITMASTER_TEST_JOBS=4) ve destek kanıtı ile üst akış sapması denetimlerini çalıştırır.
Oracle senaryoları
Her senaryo, scenarios/<category>/ altında bir dizindir (toplam 761; Pitmaster için yazılan 156 ve diğer Git uygulamalardan içe aktarılan 605):
scenarios/diff/diff-add-lines/
scenario.json # commands and expectations
setup.sh # builds the starting repository
oracle/ # outputs captured from git
scenario.json, git ile çalıştırılacak komutu ve eşdeğer Pitmaster komutunu, ayrıca eşleşmesi gerekenleri belirtir:
{
"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 }
}
Bir çalıştırma, setup.sh tarafından oluşturulan depoyu kopyalar, oracle ve Pitmaster komutlarını ayrı kopyalarda çalıştırır ve çıktıları, nesneleri, başvuruları ve günlüğü karşılaştırır. fsck_clean ayrıca git fsck öğesinin Pitmaster tarafından yazılan depoyu kabul etmesini gerektirir. Oracle çıktısı eksikse veya yenileniyorsa git üzerinden yakalanır; aksi hâlde commit edilmiş oracle/ dosyaları kullanılır.
Bir senaryo, kurulumunun oluşturduğu durumları tam olarak kapsar. Örneğin diff senaryoları değiştirilmiş dosyaları karşılaştırır; bu nedenle Diff içinde listelenen yeni, silinmiş ve ikili dosyalara ilişkin diff çıktısı farklılıkları bu senaryolarca yakalanmaz.
Senaryolarla çalışma
./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
Birden çok git sürümünü denetlemek için bunları PITMASTER_TEST_GIT_BINARIES içinde listeleyin ve duman testini çalıştırın:
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
vendor/bin/phpunit --filter MultiGitVersionSmokeTest
Üst akış derlemleri
scenarios/upstream/ altındaki senaryolar, diğer uygulamaların test paketlerinden içe aktarılır: git uygulamasının kendi test paketi (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) ve dulwich (6). Gereken fikstür ağaçları fixtures/upstream/ altında tedarik edilir; böylece tüm derlem yeni bir checkout'ta ağ erişimi veya makineye özgü yollar olmadan çalışır. Kurulum betikleri bunları PITMASTER_ROOT ortam değişkeni aracılığıyla bulur.
composer verify:drift (bin/audit-upstream-drift), tedarik edilen her üst akış durumunun bir senaryoya eşlendiğini denetler.
Destek matrisi
Depodaki SUPPORT_MATRIX.md, kapsama alınan her git özelliği durumuyla birlikte listeler:
| Durum | Anlamı |
|---|---|
DONE |
Beyan edilen eşdeğerlik kapsamı içinde uygulandı ve oracle ile doğrulandı |
PART |
Kısmen uygulandı |
TODO |
Kapsam içinde, henüz uygulanmadı |
DEFER |
Henüz planlanmadı |
N/A |
Kapsam dışında |
Dosya, config/support-matrix.json üzerinden bin/support-matrix tarafından oluşturulur. config/support-evidence.json, her DONE ve PART satırını somut testlere ve oracle senaryolarına bağlar; composer verify:evidence ise bir satırın kanıtı yoksa başarısız olur. CI matrisi yeniden oluşturur ve commit edilmiş dosya farklıysa başarısız olur.
Bir DONE satırı, bunun için kaydedilen senaryoların git ile eşleştiği anlamına gelir. Bu senaryoların dışındaki davranışlar yine farklılık gösterebilir; bilinen farklılıklar sorun izleyicisinde takip edilir.
Kıyaslamalar
Performans çalışmaları, bench/ altındaki test düzeneğini kullanır:
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, duman testi raporunu commit edilmiş eşiklerle doğrular.