jsrosetta

Thư viện chuẩn

Viết test

node:test + node:assert của Node.js so với testing (Go), #[test] (Rust), Swift Testing và JUnit (Java) cho table-driven test.

Phiên bản tối thiểu
Node.js ≥ 18.1Go ≥ 1.7Rust ≥ 1.58Swift ≥ 6.0Java ≥ 17
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Node.js và Go đều có test runner built-in, không cần cài package ngoài; Rust cũng vậy với #[test]/cargo test. t.test() lồng nhau của Node.js gần tương đương t.Run() của Go cho table-driven test — chạy cùng một test case với nhiều bộ input khác nhau. Rust không có subtest có tên như Go/Node trong #[test] thuần std — ví dụ dưới lặp qua từng case trong một test function. Swift Testing (framework mới thay XCTest, có sẵn trong toolchain từ Swift 6.0 chứ không cần thêm package) hỗ trợ việc này trực tiếp qua @Test(arguments:). Java không có test runner chuẩn trong JDK, nên dùng thư viện phổ biến nhất, JUnit, với @ParameterizedTest + @CsvSource.

Table-driven test

import { test } from 'node:test'
import assert from 'node:assert/strict'
 
test('sum', async t => {
  const tt = [
    { a: 1, b: 1, ret: 2 },
    { a: 2, b: 3, ret: 5 },
    { a: 5, b: 5, ret: 10 },
  ]
 
  for (const { a, b, ret } of tt) {
    await t.test(`${a} + ${b}`, () => {
      assert.equal(sum(a, b), ret)
    })
  }
})
 
function sum(a, b) {
  return a + b
}
$ node --test examples/example_test.js
▶ sum
  ✔ 1 + 1 (0.29ms)
  ✔ 2 + 3 (0.05ms)
  ✔ 5 + 5 (0.05ms)
✔ sum (0.87ms)
# đã bỏ dòng tổng hợp tests/suites/pass/fail/duration; thời gian thay đổi giữa các lần chạy
$ go test -v examples/example_test.go
=== RUN   TestSum
=== RUN   TestSum/(1_+_1)
=== RUN   TestSum/(2_+_3)
=== RUN   TestSum/(5_+_5)
--- PASS: TestSum (0.00s)
    --- PASS: TestSum/(1_+_1) (0.00s)
    --- PASS: TestSum/(2_+_3) (0.00s)
    --- PASS: TestSum/(5_+_5) (0.00s)
PASS
ok  	command-line-arguments	0.459s
$ cargo test -q
running 1 test
.
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
$ swift test
◇ Test "sum" started.
◇ Test case passing 1 argument testCase → (1, 1, 2) to "sum" started.
◇ Test case passing 1 argument testCase → (5, 5, 10) to "sum" started.
◇ Test case passing 1 argument testCase → (2, 3, 5) to "sum" started.
✔ Test "sum" with 3 test cases passed after 0.001 seconds.
✔ Test run with 1 test in 0 suites passed after 0.001 seconds.
$ java -jar junit-platform-console-standalone-6.1.3.jar execute -cp out --scan-class-path --details=tree
# đã bỏ banner "Thanks for using JUnit!", nhánh JUnit Platform Suite/JUnit Vintage (rỗng, không
# có test nào chạy qua đó) và các dòng tổng hợp containers/tests found/started/failed ở cuối
├─ JUnit Jupiter ✔
│  └─ SumTest ✔
│     └─ sum(int, int, int) ✔
│        ├─ "1" + "1" ✔
│        ├─ "2" + "3" ✔
│        └─ "5" + "5" ✔

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#testing