Node.js Test Çalıştırıcısı ile Deneme
Node.js 18'in piyasaya sürülmesi bir sürprizle geldi: deneysel bir bayrağın arkasında olsa da bir test koşucusu.
Son on yıldır bu boşluğu Mocha ve Jest doldururken, bu yerel test çalıştırıcısına geçmenin zamanı geldi mi? Yalnızca test paketini çalıştırmak için başka geliştirici bağımlılığı yok mu?
Kulağa ilginç geliyor!
İlk deneme
test
Dosyadaki adımı şu şekilde değiştirerek başladım package.json
:
{
"scripts": {
"test": "node --test test/**/*.js"
}
}
Konsolda tonlarca hata var:
not ok * - <test path>
---
duration_ms: 1028.112875
failureType: 'subtestsFailed'
exitCode: 1
stdout: ''
stderr: |-
<test path>
^
ReferenceError: describe is not defined
at Object.<anonymous> (<test path>)
at Module._compile (node:internal/modules/cjs/loader:1159:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
at Module.load (node:internal/modules/cjs/loader:1037:32)
at Module._load (node:internal/modules/cjs/loader:878:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.12.1
error: 'test failed'
code: 'ERR_TEST_FAILURE'
...
const { describe, it, beforeEach, afterEach } = require('node:test');
// package.json
{
"scripts": {
"test": "node --test -r test.setup.js test/**/*.js"
}
}
// test.setup.js
global.describe = require('node:test').describe;
global.it = require('node:test').it;
global.beforeEach = require('node:test').beforeEach;
global.afterEach = require('node:test').afterEach;
global.before = require('node:test').before;
global.after = require('node:test').after;
Unable to resolve path to module 'node:test'. eslint(import/no-unresolved)
// .eslintrc.yml
settings:
import/core-modules: [ node:test ]
Hala bir sürü hata:
# Subtest: Errors thrown should be handled
not ok 3 - Errors thrown should be handled
---
duration_ms: 0.116958
failureType: 'hookFailed'
error: 'failed running beforeEach hook'
code: 'ERR_TEST_FAILURE'
stack: |-
checkWrappedMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:67:21)
wrapMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:132:13)
stub (node_modules/sinon/lib/sinon/stub.js:130:44)
node_modules/sinon/lib/sinon/util/core/walk-object.js:41:17
node_modules/sinon/lib/sinon/util/core/walk.js:28:22
Array.forEach (<anonymous>)
walkInternal (node_modules/sinon/lib/sinon/util/core/walk.js:20:5)
walk (node_modules/sinon/lib/sinon/util/core/walk.js:48:12)
walkObject (node_modules/sinon/lib/sinon/util/core/walk-object.js:26:5)
Function.stub (node_modules/sinon/lib/sinon/stub.js:103:16)
extendObjectWithWrappedMethods (node_modules/sinon/lib/sinon/util/core/wrap-method.js:167:34)
wrapMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:155:5)
stub (node_modules/sinon/lib/sinon/stub.js:130:44)
node_modules/sinon/lib/sinon/util/core/walk-object.js:41:17
node_modules/sinon/lib/sinon/util/core/walk.js:28:22
Array.forEach (<anonymous>)
walkInternal (node_modules/sinon/lib/sinon/util/core/walk.js:20:5)
walk (node_modules/sinon/lib/sinon/util/core/walk.js:48:12)
walkObject (node_modules/sinon/lib/sinon/util/core/walk-object.js:26:5)
Function.stub (node_modules/sinon/lib/sinon/stub.js:103:16)
...
İkinci deneme
v18.16.0
Bu sefer Node.js'nin LTS sürümünü kullanıyordum. Artık şifreli hatalar yok! Bu bir rahatlamaydı.
Kapsam raporunu çalıştırdı. %45 kapsama alanı! Ha? Beklemek. Testlerimizin %60'ı çalıştırılmadı bile!
Biraz araştırma yapmak beni bu GitHub sorununa götürdü - test yürütücüsü için glob ayrıştırma ile ilgili bir sorun. Temel bir özellik gibi görünüyordu, ama evet, eksik! Bu yüzden glob modelini kullanamayız test/**/*.js
.
Adlı bir dizinle karşılaşılırsa test
, test çalıştırıcısı dizinde tüm .js
, .cjs
, ve .mjs
dosyalar için yinelemeli olarak arama yapar.
https://nodejs.org/docs/latest-v18.x/api/test.html#test-runner-execution-model
Neyse ki test dizinimizin adı gerçekten test
. Yani artık küre yok.
// package.json
{
"scripts": {
"test": "node --test -r test.setup.js"
}
}
Üçüncü Deneme?
Test odası nihayet yeşildi. Kapsama alanı da yeşildi.
Sonraki , tüm çağrıları şuraya değiştirerek sinon.assert
yerelden uzaklaşmaktı :node:assert
sinon.assert.pass(condition);
sinon.assert.match(expected, received);
const assert = require('node:assert/strict');
assert.ok(condition);
assert.equal(expected, received);
Test odası hala yeşil. Kapsama alanı da yeşildir. Ancak performans boşa gitti. Hmm, bu daha önce kontrol etmediğim bir şeydi.
Test paketini çalıştırmak 16 saniyeden fazla sürerken, Mocha bir saniyenin altında bitirdi! Jest bile Mocha ile benzer zamanlar yaşadı.
Yerel bir test çalıştırıcı kullanma izlenimim, Mocha ve Jest gibi üçüncü taraf araçlardan daha iyi performans gösterebileceğiydi. Ancak bu GitHub sayısından da anlaşılacağı gibi, durum böyle görünmüyor .
Bu yüzden üçüncü bir deneme için Node.js'nin bir sonraki küçük sürümüne kadar beklememiz gerekecek!
Son düşünceler
Bir üçüncü taraf bağımlılığı kurmadan bir test paketi çalıştırabilmenin kesinlikle avantajları vardır. Ayrıca, Mocha benzeri sözdizimi desteği, geçişi kolaylaştırır.
Denemek istediğim çok daha fazla özellik var: taklitler, anlık görüntüler, kod kapsamı, izleyiciler ve daha fazlası.
Ancak performans gerçekten bir erteleme oldu. Bir düzeltme için sabırsızlıkla bekliyorum!