Liigu sisu juurde

Võrdlusallikaga testimine

Phasis iga teostusotsus sõltub ühest küsimusest: kas V8 annab sama väljundi?

JavaScript semantika on nüansirikas — NaN !== NaN, -0 === 0, [1] + 1 === "11", atribuutide loendamise täpne järjekord ning Promise mikrotööde ajastus. Nende tuletamine spetsifikatsiooni lugedes on aeglane ja veaohtlik. Phasis väldib seda, kasutades Node.js-i (V8) võrdlusallikana: kirjuta JS-s stsenaarium, käivita see V8-is ja salvesta väljund tõena; seejärel käivita see Phasis-is, salvesta väljund ning võrdle tulemusi.

Kood
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

Testimise kaks taset

Tase 1 — kohandatud stsenaariumid

Iga scenarios/-i stsenaarium on väike JS-programm, mille väljund on teada. Ühe stsenaariumi käivitamiseks:

Shell
./bin/test-scenario operators/arithmetic

Käivita kõik stsenaariumid või ainult üks kategooria, soovi korral paralleelselt:

Shell
./bin/test-regression
./bin/test-regression --jobs 4
./bin/test-regression --category expressions

Värskenda võrdlusallikat (e.g, näiteks pärast Node.js versiooni uuendamist):

Shell
./bin/oracle --refresh operators/arithmetic

Stsenaariumid on korraldatud ECMAScripti peatükkide kaupa: literaalid, tehtemärgid, muutujad, juhtvoog, funktsioonid, objektid, massiivid, klassid, sisseehitatud funktsioonid, vead, koostalitlus, erijuhud.

Tase 2 — test262

Ametlik TC39 vastavustestide komplekt on git alamoodulina teegis test262/. Iga test kontrollib end ise: see läbitakse, kui viga ei teki, ja kukub läbi, kui viga tekib (negative testide puhul vastupidi). Testirakendaja laadib enne iga testi assert.js ja sta.js.

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

Täieliku testikomplekti hetktõmmis asub failis COMPAT.md, mille loob uuesti bin/compat-report. CI-s käivitab töövoog compat-matrix.yml selle osadena ja salvestab tulemuse; töövoog käivitatakse käsitsi, mitte iga tõuke korral.

Kohalik kontroll enne tõukamist

./bin/verify-all käivitab kvaliteedikontrolli, mida CI nõuab:

Kood
=== PHPStan ===                  level 6, zero errors
=== Code Standards ===           PHPCS, zero warnings
=== PHPUnit ===                  unit suite passes
=== Oracle Regression ===        scenarios under `scenarios/` pass

Sellest üksi ei piisa — test262-st tuleb võtta valim ka kõigi muudatuste puhul, mis puudutavad parserit, interpretaatorit või sisseehitatud funktsioone. Iga tõmbetaotluse korral käivitab CI PHPStan, PHPCS, ühiktestid ja oraakli regressioonitestid; WPT ja populaarsete pakettide komplekt käivitatakse siis, kui tõmbetaotlus muudab src/ või nende testandmeid. Kogu test262 maatriks ei kuulu tõmbetaotluste CI-sse, seega võta mõjutatud kategooriatest kohapeal valim.

Miks see toimib

V8 käsitlemine tõeallikana kõrvaldab arendustsüklist peaaegu kogu spetsifikatsiooni lugemise. Lahknevus V8-ga viitab alati Phasis veale — mitte spetsifikatsiooni mitmetimõistetavusele, mille üle saaks vaielda. Kui parandus sisse viiakse, muutuvad vastavad test262 kirjed püsivateks regressioonitestideks.

100% läbimismäär on selle distsipliini tulemus: iga PR-i hinnatakse V8 järgi, CI lükkab tagasi regressioonid oraakli, WPT ja populaarsete pakettide komplektides ning test262 maatriks kinnitab kogu komplekti tulemuse selle käivitamisel.