Zum Inhalt springen

test262-Abdeckung

test262 ist die offizielle, von TC39 gepflegte Konformitätstestsuite und die maßgebliche Methode, um JavaScript-Engines miteinander zu vergleichen.

Phasis besteht die gesamte Suite zu 100 % in allen Kategorien — Sprachsemantik, Standardbibliothek, Intl, annexB Legacy-Webfunktionen, das staging-Verzeichnis mit Tests in der Inkubationsphase und die Selbsttests des Test-Harness. Keine Umgehungen per Feature-Flag, keine Blocklisteneinträge für Host-Lücken, keine Ausschlüsse einzelner Shards.

Die Suite ist fest versioniert: Das test262-Git-Submodul legt die Revision fest, an der Phasis gemessen wird; neue Upstream-Tests zählen erst, wenn das Submodul aktualisiert wird. Der vollständige Suite-Snapshot in COMPAT.md wird durch den compat-matrix.yml-Workflow neu erstellt, der manuell statt bei jedem Push gestartet wird; COMPAT.md hält fest, wann der Snapshot erstellt wurde und gegen welchen Commit.

Zum Vergleich: test262.fyi prüft dieselbe Suite für alle produktiv eingesetzten JS-Engines:

Engine Konformität
V8 (Chrome / Node) 99.8 %
SpiderMonkey (Firefox) 99.6 %
JavaScriptCore (Safari) 99.4 %
QuickJS ~97 %
Hermes (React Native) ~95 %
Phasis 100 %

Bei diesen Engines bleibt jeweils eine kleine Lücke (neu hinzugekommene Vorschläge, seltene Edge-Cases in Entwicklung). Phasis schließt diese Lücke, weil es eine spezialisierte Implementierung ist, bei der Konformität an erster Stelle steht.

Lokal ausführen

Der Runner benötigt das test262-Submodul und die Testklassen des Repositorys, die beide nicht im Composer-Paket enthalten sind. Führe ihn daher in einem Klon aus:

Shell
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4

Ein vollständiger Lauf dauert auf einem aktuellen Mac etwa 20 Minuten; die CI-Matrix führt die Shards parallel aus und ist in weniger als zehn Minuten fertig.

So führst du beim Debuggen nur eine Kategorie aus:

Shell
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures

Alle Flags findest du in der CLI-Referenz.

Warum das wichtig ist

JavaScript hat subtile Semantik — NaN !== NaN, -0 === 0, [1] + 1 === "11", die genaue Reihenfolge der Property-Aufzählung und den Zeitpunkt von Promise-Microtasks. Eine Bibliothek, die JS-Code von Nutzern ausführt, muss all das jedes Mal korrekt umsetzen. test262 ist der Maßstab für „korrekt“; 100 % zu bestehen bedeutet, dass ein JS-Programm, das auf V8 läuft, auf Phasis byte-identische Ausgabe erzeugt (abgesehen von reinen Browser-APIs).