اختبار في JavaScript (Node.js): الأطر والأدوات
الاختبار عالي الجودة هو جزء لا يتجزأ من تطوير أي مشروع جاد على Node.js. فهو يسمح باكتشاف الأخطاء في المراحل المبكرة، ويبسط إعادة الهيكلة، ويضمن استقرار عمل التطبيق. في نظام JavaScript البيئي، توجد العديد من الأدوات لمستويات مختلفة من الاختبار: من اختبارات الوحدة إلى الاختبار الشامل (e2e). في هذه المقالة، سنستعرض الأطر والأدوات الرئيسية التي ستساعدك في تنظيم اختبار موثوق في بيئة Node.js.
1. Jest — إطار عمل شامل من Facebook
Jest هو أحد أشهر أطر اختبار JavaScript. فهو يوفر كل ما هو ضروري "مباشرة من الصندوق": مشغل اختبار، مكتبة تأكيدات (assertions)، كائنات وهمية (mocks)، جواسيس (spies)، وتغطية كود مدمجة (code coverage). Jest مناسب تمامًا لتطبيقات الخادم على Node.js وكذلك لواجهات المستخدم الأمامية.
الإمكانيات الرئيسية:
- اكتشاف تلقائي لملفات الاختبار (افتراضيًا
*.test.jsأو*.spec.js). - دعم مدمج للكائنات الوهمية للوحدات والدوال.
- عزل الاختبارات (sandboxing) لمنع الآثار الجانبية.
- نظام قوي للقطات (snapshot testing).
- عمل سريع في وضع المراقبة (watch mode).
مثال لاختبار بسيط مع Jest:
// math.jsfunction add(a, b) { return a + b;}module.exports = { add };
// math.test.jsconst { add } = require('./math');
test('جمع 2 + 3 يساوي 5', () => { expect(add(2, 3)).toBe(5);});
test('جمع الأعداد السالبة', () => { expect(add(-1, -1)).toBe(-2);});للتشغيل، يكفي تنفيذ الأمر npx jest في الطرفية. سيجد Jest تلقائيًا جميع ملفات الاختبار ويعرض التقرير.
2. Mocha — إطار عمل مرن ومعياري
Mocha هو أحد أقدم وأكثر أطر Node.js مرونة. على عكس Jest، فهو لا يتضمن مكتبة تأكيدات أو كائنات وهمية — أنت تختار الأدوات التي تحتاجها بنفسك (على سبيل المثال، Chai للتأكيدات و Sinon.js للكائنات الوهمية). وهذا يمنح أقصى قدر من الحرية في التهيئة.
الميزات الرئيسية:
- صيغة بسيطة وواضحة (
describe,it). - دعم الاختبار غير المتزامن (الوعود (promises)، async/await، دوال الاسترجاع (callbacks)).
- إمكانيات غنية لتخصيص أدوات إعداد التقارير (HTML, JSON, Spec, Dot وغيرها).
- التكامل مع أي مكتبات تأكيد.
مثال لاختبار مع Mocha + Chai:
// math.js (نفس ما سبق)// math.test.jsconst { expect } = require('chai');const { add } = require('./math');
describe('دالة add', function() { it('يجب أن تعيد 5 عند جمع 2 و 3', function() { expect(add(2, 3)).to.equal(5); });
it('يجب أن تعمل بشكل صحيح مع الأعداد السالبة', function() { expect(add(-1, -1)).to.equal(-2); });});التثبيت: npm install mocha chai --save-dev. التشغيل: npx mocha.
3. Vitest — بديل حديث لمشاريع Vite
Vitest هو إطار عمل جديد نسبيًا، تم إنشاؤه بواسطة فريق Vite. وهو متوافق تمامًا مع نظام Vite البيئي ويقدم واجهة برمجة تطبيقات (API) مشابهة جدًا لـ Jest. يعمل Vitest بشكل أسرع بكثير بفضل استخدام نظام الوحدات الأصلي ESM وإعادة التحميل السريع.
مزايا Vitest:
- سرعة فائقة بفضل Vite.
- التوافق مع معظم إضافات (plugins) وإعدادات Jest.
- دعم مدمج لـ TypeScript و JSX ووحدات CSS.
- سهولة الترحيل من Jest.
مثال لاختبار (مماثل لـ Jest):
// math.ts (أو math.js)export function add(a: number, b: number): number { return a + b;}
// mat