İçeriğe geç

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):

Kod
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:

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

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

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

Kabuk
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:

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