راهنمای جامع Test Runner در Node.js (ماژول node:test)

ماژول node:test یک فریم‌ورک تست داخلی و مدرن در Node.js است که بدون نیاز به هیچ وابستگی خارجی، امکاناتی مانند تست‌های همگام و ناهمگام، تست‌های Promise و Callback، زیرتست‌ها، هوک‌ها، Mocking، Snapshot، پوشش کد، حالت Watch و گزارشگرهای سفارشی را ارائه می‌دهد. این ماژول پایدار، قدرتمند و مناسب پروژه‌های مدرن Node.js است.

node:testTestContext (t)SubtestsHooksMockingSnapshot testingCoverageWatch modeCustom reporters

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۹ دی ۱۴۰۴

1. نحوهٔ وارد کردن ماژول


const test = require('node:test');
// یا ESM
import test from 'node:test';

2. انواع تست‌های پایه


ماژول node:test از تمام سبک‌های رایج تست پشتیبانی می‌کند:


2.1 تست‌های همگام


test('تست همگام موفق', (t) => {
  assert.strictEqual(1, 1);
});

test('تست همگام ناموفق', (t) => {
  assert.strictEqual(1, 2);
});

2.2 تست‌های Async و Promise


test('تست async موفق', async (t) => {
  assert.strictEqual(1, 1);
});

test('تست async ناموفق', async (t) => {
  throw new Error('failed');
});

test('تست Promise ناموفق', (t) => {
  return Promise.reject(new Error('failed'));
});

2.3 تست‌های Callback


test('تست callback موفق', (t, done) => {
  setImmediate(done);
});

test('تست callback ناموفق', (t, done) => {
  setImmediate(() => done(new Error('failed')));
});

اگر هر تستی شکست بخورد، Node.js با کد خروج 1 خارج می‌شود.


3. زیرتست‌ها (Subtests)


test('تست سطح بالا', async (t) => {
  await t.test('زیرتست ۱', (t) => {
    assert.strictEqual(1, 1);
  });

  await t.test('زیرتست ۲', (t) => {
    assert.strictEqual(2, 2);
  });
});

4. تست‌های Skip و TODO


test('تست Skip شده', { skip: true }, (t) => {});

test('Skip با دلیل', { skip: 'reason' }, (t) => {});

test('تست TODO', { todo: true }, (t) => {
  throw new Error('ignored failure');
});

// داخل تست:
t.skip('skip inside');
t.todo('todo inside');

5. تست‌های Only


test('فقط این تست اجرا می‌شود', { only: true }, (t) => {});

اجرای فقط تست‌های only:


node --test-only

6. هوک‌ها (Hooks)


test('با هوک‌ها', async (t) => {
  t.before(() => console.log('قبل از همه'));
  t.beforeEach(() => console.log('قبل از هر تست'));
  t.afterEach(() => console.log('بعد از هر تست'));
  t.after(() => console.log('بعد از همه'));

  await t.test('زیرتست ۱', () => {});
  await t.test('زیرتست ۲', () => {});
});

7. Mocking


7.1 Mock کردن تابع


test('Mock تابع', (t) => {
  const fn = t.mock.fn((a, b) => a + b);
  assert.strictEqual(fn(2, 3), 5);
  assert.strictEqual(fn.mock.callCount(), 1);
});

7.2 Mock کردن متد


test('Mock متد', (t) => {
  const obj = { add: (a, b) => a + b };
  t.mock.method(obj, 'add');
  obj.add(1, 2);
  assert.strictEqual(obj.add.mock.callCount(), 1);
});

7.3 Mock کردن تایمرها و Date


test('Mock تایمرها', (t) => {
  t.mock.timers.enable({ apis: ['setTimeout', 'Date'] });
  setTimeout(() => console.log('done'), 1000);
  t.mock.timers.tick(1000);
});

8. Snapshot Testing


test('Snapshot', (t) => {
  t.assert.snapshot({ a: 1, b: [2, 3] });
});

به‌روزرسانی Snapshotها:


node --test-update-snapshots

9. پوشش کد (Coverage)


node --experimental-test-coverage --test-reporter=lcov

10. حالت Watch


node --test --watch

11. گزارشگرهای سفارشی


node --test --test-reporter=./my-reporter.js

12. اجرای تست‌ها


node --test                        # اجرای همهٔ تست‌ها
node --test test/**/*.test.js      # الگو
node --test-only                   # فقط تست‌های only
node --test-name-pattern="my test" # فیلتر بر اساس نام

نتیجه‌گیری


ماژول node:test یک Test Runner کامل و مدرن است که امکانات زیر را ارائه می‌دهد:

  • API ساده و قدرتمند
  • زیرتست‌ها و هوک‌ها
  • Mocking برای توابع، متدها، تایمرها و ماژول‌ها
  • Snapshot Testing
  • پوشش کد و حالت Watch
  • گزارشگرهای سفارشی
  • Strict mode و Test Plans

این ماژول یک راه‌حل کامل و بدون وابستگی برای تست در پروژه‌های Node.js است.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

آشنایی کامل با ماژول Cluster در Node.js و نحوه افزایش مقیاس‌پذیری سرور

ماژول Cluster در Node.js به توسعه‌دهندگان اجازه می‌دهد چندین پردازش همزمان ایجاد کنند که یک پورت سرور را به اشتراک می‌گذارند. این کار باعث استفاده بهتر از هسته‌های CPU و افزایش توان پردازش برنامه می‌شود. در این مقاله نحوه کار Cluster، مدیریت Workerها، تنظیمات مهم و مثال عملی را بررسی می‌کنیم.

ادامه

راهنمای جامع ماژول VM در Node.js (ماژول node:vm)

ماژول node:vm امکان کامپایل و اجرای کد جاوااسکریپت در کانتکست‌های ایزولهٔ V8 را فراهم می‌کند. این کانتکست‌ها مانند یک «سندباکس سبک» داخل برنامهٔ Node.js عمل می‌کنند و هرکدام globalThis مخصوص خود را دارند. این ماژول برای اجرای پویا، موتورهای قالب (Template Engines)، سیستم‌های افزونه (Plugin Systems)، REPLها و تست ایزولهٔ منطق بسیار مناسب است. اما نکتهٔ بسیار مهم: vm یک ابزار امنیتی نیست و نباید برای اجرای کدهای غیرقابل‌اعتماد استفاده شود.

ادامه

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

ادامه

راهنمای جامع Worker Threads در Node.js (ماژول node:worker_threads)

ماژول node:worker_threads امکان اجرای واقعی چندریسمانی (Multithreading) را در Node.js فراهم می‌کند. برخلاف مدل تک‌ریسمانی سنتی Node.js، Worker Threads اجازه می‌دهند کارهای سنگین CPU در ریسه‌های جداگانه اجرا شوند بدون اینکه حلقهٔ رویداد (Event Loop) مسدود شود. این ماژول از حافظهٔ اشتراکی، انتقال بدون کپی (Zero‑Copy)، کانال‌های پیام، Worker Pool، محدودیت منابع و ابزارهای همگام‌سازی پیشرفته پشتیبانی می‌کند. Worker Threads برای پردازش‌های محاسباتی سنگین ایده‌آل هستند، در حالی که I/O همچنان باید توسط ریسهٔ اصلی مدیریت شود.

ادامه

راهنمای جامع ماژول util در Node.js

ماژول node:util مجموعه‌ای از توابع کمکی قدرتمند برای استفاده در هستهٔ Node.js و همچنین توسعهٔ برنامه‌ها ارائه می‌دهد. این ماژول ابزارهایی برای دیباگ، بازرسی اشیا، تبدیل Callback ↔ Promise، قالب‌بندی رشته‌ها، بررسی انواع، مدیریت خطاها، رمزگذاری متن، پردازش MIME، پارس آرگومان‌های CLI، سیگنال‌های Abort، و ابزارهای متفرقه فراهم می‌کند. این ماژول یکی از جعبه‌ابزارهای اصلی و ضروری برای توسعه‌دهندگان Node.js است.

ادامه

راهنمای جامع ماژول URL در Node.js

ماژول node:url ابزارهایی برای تحلیل، ساخت، و دست‌کاری URLها در Node.js فراهم می‌کند. Node.js دو API برای کار با URL دارد: WHATWG URL API — استاندارد مدرن و سازگار با مرورگرها (توصیه‌شده). Legacy API — API قدیمی Node.js (غیرتوصیه‌شده). WHATWG URL API یک رابط تمیز، سازگار و قدرتمند برای کار با اجزای URL، پارامترهای query، الگوهای URL و حتی Blob URLها ارائه می‌دهد.

ادامه