Thử nghiệm với Trình chạy thử nghiệm Node.js

May 03 2023
Việc phát hành Node.js 18 gây bất ngờ: một người chạy thử nghiệm, mặc dù đằng sau một lá cờ thử nghiệm.
Ảnh của Jorge Rosal trên Bapt

Việc phát hành Node.js 18 gây bất ngờ: một người chạy thử nghiệm, mặc dù đằng sau một lá cờ thử nghiệm.

Với việc Mocha và Jest đã lấp đầy khoảng trống này trong thập kỷ qua, đã đến lúc chuyển sang ứng dụng chạy thử bản địa này chưa? Không còn sự phụ thuộc của nhà phát triển chỉ để chạy bộ thử nghiệm?

Nghe có vẻ hấp dẫn!

Lần thử đầu tiên

Tôi đã bắt đầu bằng cách thay thế testbước trong package.jsontệp bằng:

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

Hàng tấn lỗi trong bảng điều khiển:

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 ]

Vẫn còn vô số lỗi:

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

Thử lần thứ hai

Lần này tôi đang sử dụng v18.16.0phiên bản LTS của Node.js. Không còn lỗi khó hiểu! Đó là một cứu trợ.

Chạy báo cáo bảo hiểm. Bảo hiểm 45%! Huh? Chờ đợi. 60% bài kiểm tra của chúng tôi thậm chí không được chạy!

Thực hiện một số nghiên cứu đã dẫn tôi đến vấn đề GitHub này - một vấn đề với phân tích cú pháp toàn cầu cho người chạy thử nghiệm. Có vẻ như là một tính năng cơ bản, nhưng vâng, còn thiếu! Vì vậy, chúng tôi không thể sử dụng test/**/*.jsmô hình toàn cầu.

Nếu gặp phải một thư mục có tên test, trình chạy thử sẽ tìm kiếm nó một cách đệ quy cho tất cả các tệp .js, .cjs.mjstệp.

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

May mắn thay, thư mục thử nghiệm của chúng tôi thực sự được đặt tên là test. Vì vậy, không có quả cầu nữa.

// package.json

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

Lần thử thứ ba?

Bộ thử nghiệm cuối cùng đã có màu xanh lá cây. Bảo hiểm là màu xanh lá cây là tốt.

Tiếp theo là di chuyển từ sinon.assertbản địa node:assertbằng cách thay thế tất cả các lệnh gọi thành:

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

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

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

Bộ kiểm tra vẫn còn màu xanh lá cây. Bảo hiểm là màu xanh lá cây là tốt. Nhưng hiệu suất đã đi xuống cống. Hmm, đó là điều tôi chưa kiểm tra trước đây.

Mất hơn 16 giây để chạy bộ thử nghiệm, trong khi Mocha hoàn thành chưa đầy một giây! Ngay cả Jest cũng có thời điểm tương tự như Mocha.

Ấn tượng của tôi về việc sử dụng trình chạy thử gốc là nó có thể hoạt động tốt hơn các công cụ của bên thứ ba như Mocha và Jest. Nhưng điều đó dường như không đúng, như hiển nhiên từ vấn đề GitHub này .

Vì vậy, chúng tôi sẽ phải đợi cho đến khi bản phát hành nhỏ tiếp theo của Node.js để thử lần thứ ba!

Suy nghĩ cuối cùng

Ảnh của Carolina trên Bapt

Có thể chạy bộ thử nghiệm mà không cần cài đặt phần phụ thuộc của bên thứ ba chắc chắn có giá trị của nó. Hơn nữa, hỗ trợ cho cú pháp giống như Mocha giúp việc di chuyển trở nên dễ dàng.

Có rất nhiều tính năng khác mà tôi muốn dùng thử: mô phỏng, ảnh chụp nhanh, phạm vi bảo hiểm mã, trình theo dõi, v.v.

Nhưng hiệu suất thực sự là một sự trì hoãn. Háo hức chờ khắc phục!