Oracle testi
Phasis içindeki her uygulama kararı tek bir soruya dayanır: V8 aynı çıktıyı üretiyor mu?
JavaScript incelikli anlambilime sahiptir — NaN !== NaN, -0 === 0, [1] + 1 === "11", özelliklerin tam sıralanma düzeni ve Promise mikro görevlerinin zamanlaması. Belirtimi okuyarak bunları yeniden çıkarmak yavaş ve hataya açıktır. Phasis bu sorunu, Node.js'ı (V8) oracle olarak ele alarak aşar: bir JS senaryosu yazın, V8 üzerinden çalıştırıp çıktıyı doğru kabul edilen sonuç olarak kaydedin; ardından Phasis üzerinden çalıştırıp çıktıyı yeniden kaydedin ve farkları karşılaştırın.
1. SETUP → a JavaScript source file or snippet
2. ORACLE → Node.js executes it, output captured as truth
3. ACTUAL → Phasis executes it, output captured
4. COMPARE → oracle vs actual, diff measures the gap
İki test düzeyi
Düzey 1 — Özel senaryolar
scenarios/ içindeki her senaryo, çıktısı bilinen küçük bir JS programıdır. Tek bir senaryoyu çalıştırın:
./bin/test-scenario operators/arithmetic
Tüm senaryoları, yalnızca bir kategoriyi veya tümünü paralel olarak çalıştırın:
./bin/test-regression
./bin/test-regression --jobs 4
./bin/test-regression --category expressions
Referans sonuçlarını yenileyin (örneğin bir Node.js sürüm güncellemesinden sonra):
./bin/oracle --refresh operators/arithmetic
Senaryolar ECMAScript bölümlerine göre düzenlenmiştir: değişmezler, işleçler, değişkenler, denetim akışı, işlevler, nesneler, diziler, sınıflar, yerleşikler, hatalar, birlikte çalışabilirlik ve uç durumlar.
Düzey 2 — test262
Resmî TC39 uyumluluk test paketi, test262/ altında bir git alt modülü olarak alınır. Her test kendi sonucunu doğrular: hata fırlatmazsa geçer, fırlatırsa başarısız olur (negative testlerinde bunun tersi geçerlidir). Test düzeneği, her testten önce assert.js ve sta.js yükler.
./bin/test262 # full suite
./bin/test262 --category built-ins/Array # subset
./bin/test262 --jobs 4 # parallel
./bin/test262 --failures # one line per failing test
./bin/compat-report # full COMPAT.md + compat.json
Tam takım anlık görüntüsü COMPAT.md konumunda bulunur ve bin/compat-report tarafından yeniden oluşturulur. CI'da compat-matrix.yml iş akışı bunu parçalara bölerek çalıştırır ve sonucu kaydeder; bu iş akışı her push'ta değil, elle başlatılır.
Yerel push öncesi kontrol
./bin/verify-all, CI'ın uyguladığı kalite denetimini çalıştırır:
=== PHPStan === level 6, zero errors
=== Code Standards === PHPCS, zero warnings
=== PHPUnit === unit suite passes
=== Oracle Regression === scenarios under `scenarios/` pass
Tek başına yeterli değildir — ayrıştırıcıyı, yorumlayıcıyı veya yerleşik öğeleri etkileyen her değişiklik için test262 da örneklenerek çalıştırılmalıdır. Her pull request'te CI; PHPStan, PHPCS, birim test paketini ve oracle regresyon testini çalıştırır; WPT ve popüler paket testleri ise pull request src/ dosyasını veya bunların fixture'larını değiştirdiğinde çalışır. Tam test262 matrisi pull request CI'ının parçası değildir; bu nedenle etkilenen kategorileri yerel olarak örnekleyin.
Bunun işe yaramasının nedeni
V8 öğesini tek doğruluk kaynağı olarak kabul etmek, geliştirme döngüsünde spesifikasyonu okumaya duyulan ihtiyacı neredeyse tamamen ortadan kaldırır. V8 ile uyuşmazlık her zaman bir Phasis hatasına işaret eder; tartışılabilecek bir spesifikasyon belirsizliğine asla işaret etmez. Bir düzeltme eklendikten sonra ilgili test262 girdileri kalıcı regresyon testlerine dönüşür.
100 % geçiş oranı bu disiplinin sonucudur: her PR, V8 ile değerlendirilir; CI, oracle, WPT ve popüler paket testlerindeki gerilemeleri reddeder; test262 matrisi ise çalıştırıldığında tam takım sonucunu doğrular.