Bereksperimen Dengan Test Runner Node.js

Foto oleh Jorge Rosal di Unsplash

Pelepasan Node.js 18 datang dengan kejutan: pelari uji, meskipun di belakang bendera eksperimental.

Dengan Mocha dan Jest mengisi kekosongan ini selama dekade terakhir, apakah sudah waktunya untuk beralih ke test runner asli ini? Tidak ada lagi ketergantungan dev hanya untuk menjalankan test suite?

Kedengarannya menarik!

Percobaan pertama

Saya memulai dengan mengganti testlangkah dalam package.jsonfile dengan:

{
  "scripts": {
    "test":  "node --test test/**/*.js"
  }
}

Banyak kesalahan di konsol:

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 ]

Masih banyak kesalahan:

# 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)
  ...

Percobaan Kedua

Kali ini saya menggunakan v18.16.0Node.js versi LTS. Tidak ada lagi kesalahan samar! Itu melegakan.

Jalankan laporan liputan. Cakupan 45%! Hah? Tunggu. 60% dari pengujian kami bahkan tidak dijalankan!

Melakukan beberapa penelitian membawa saya ke masalah GitHub ini - masalah dengan penguraian glob untuk test runner. Tampak seperti fitur dasar, tapi ya, hilang! Jadi kita tidak bisa menggunakan test/**/*.jspola glob.

Jika sebuah direktori dengan nama testditemukan, runner pengujian akan mencarinya secara rekursif untuk semua .js, .cjs, dan .mjsfile.

https://nodejs.org/docs/latest-v18.x/api/test.html#test-runner-execution-model

Untungnya direktori pengujian kami memang bernama test. Jadi tidak ada lagi gumpalan.

// package.json

{
  "scripts": {
    "test":  "node --test -r test.setup.js"
  }
}

Percobaan Ketiga?

Test suite akhirnya berwarna hijau. Cakupannya juga hijau.

Selanjutnya adalah bermigrasi dari sinon.assertke asli node:assertdengan mengganti semua panggilan ke:

sinon.assert.pass(condition);
sinon.assert.match(expected, received);

const assert = require('node:assert/strict');

assert.ok(condition);
assert.equal(expected, received);

Test suite masih hijau. Cakupannya juga hijau. Tapi kinerja sia-sia. Hmm, itu sesuatu yang belum saya periksa sebelumnya.

Butuh lebih dari 16 detik untuk menjalankan test suite, sementara Mocha selesai kurang dari satu detik! Bahkan Jest memiliki waktu yang mirip dengan Mocha.

Kesan saya menggunakan test runner asli adalah dapat mengungguli alat pihak ketiga seperti Mocha dan Jest. Tapi sepertinya bukan itu masalahnya, terbukti dari masalah GitHub ini .

Jadi kita harus menunggu sampai rilis minor Node.js berikutnya untuk mencoba ketiga kalinya!

Pikiran Akhir

Foto oleh Carolina di Unsplash

Mampu menjalankan test suite tanpa menginstal ketergantungan pihak ketiga tentu ada manfaatnya. Selain itu, dukungan untuk sintaks seperti Mocha membuat migrasi menjadi mudah.

Ada lebih banyak fitur yang ingin saya coba: tiruan, snapshot, cakupan kode, pengamat, dan banyak lagi.

Tapi kinerjanya memang ditunda. Sangat menunggu perbaikan!

Suggested posts

Sumber daya pengkodean saya yang paling sering digunakan

Sumber daya pengkodean saya yang paling sering digunakan

Minggu ini, saya menerima email dari anggota daftar email harian. Mereka ingin tahu: Sumber daya apa yang Anda kunjungi setiap hari, setiap minggu, dan setiap bulan? Pertanyaan bagus! Saya senang untuk mencoba membagikan beberapa wawasan tentang alur kerja saya & sumber daya teratas yang saya gunakan.

Seri pustaka lit — 1: Mendalami Pustaka lit-html

Seri pustaka lit — 1: Mendalami Pustaka lit-html

Tujuan dari rangkaian blog ini adalah untuk mendalami library Lit dan mendapatkan pemahaman komprehensif tentang fitur uniknya dan bagaimana Lit membedakan dirinya dari library dan framework lain di pasar. Serial ini dibagi menjadi tiga bagian, mencakup topik-topik seperti 1.

Related posts

Arsip Ancaman Itu: Vol 7 Black Basta

Arsip Ancaman Itu: Vol 7 Black Basta

Di dunia yang saling terhubung saat ini, ancaman serangan dunia maya lebih umum dari sebelumnya. Penjahat dunia maya dan aktor negara terus-menerus berusaha mengeksploitasi kerentanan dan mencuri data berharga, yang menimbulkan risiko signifikan bagi organisasi dari semua ukuran.

Mengumpulkan OSINT untuk Berburu Ancaman

Mengumpulkan OSINT untuk Berburu Ancaman

Halo, penggemar dunia maya! Selamat datang kembali di OSINT untuk seri berburu ancaman. Di artikel pertama, saya memberi Anda gambaran umum tentang OSINT dan pentingnya perburuan ancaman.

Penganiayaan Umat Kristiani: Kejahatan Kebencian yang Tidak Kita Bicarakan

Lupakan Islamofobia: Kristen (dan Yahudi) adalah korban utama kejahatan kebencian agama.

Penganiayaan Umat Kristiani: Kejahatan Kebencian yang Tidak Kita Bicarakan

Pikiran rasional mana pun tahu bahwa lingkaran politik dan media didominasi oleh kiri, bahkan paling kiri, suatu keadaan yang menciptakan ketidakseimbangan dalam wacana politik. Di bidang agama, ketidakseimbangan ini terlihat jelas: surat kabar dan jaringan sayap kiri tidak terburu-buru membela iman Kristen.

Percakapan Berbahaya

Percakapan Berbahaya

Jika kita ingin terus berkembang di planet ini, kita harus melakukan percakapan yang berbahaya. Yang menantang apa yang telah kita lakukan, apa yang kita lakukan, dan apa yang saat ini akan terus kita lakukan (atau rencanakan untuk lakukan).