اختبار في JavaScript (Node.js): الأطر والأدوات
الاختبار هو جزء لا يتجزأ من تطوير البرمجيات الموثوقة. في نظام Node.js البيئي، توجد العديد من الأدوات لأتمتة الاختبار، بدءًا من مكتبات assert البسيطة وصولاً إلى الأطر القوية. في هذه المقالة، سنستعرض الأطر والأدوات الرئيسية التي ستساعدك في كتابة اختبارات عالية الجودة لتطبيقات Node.js.
لماذا من المهم اختبار تطبيقات Node.js؟
غالبًا ما يُستخدم Node.js في التطوير الخادمي، وواجهات برمجة التطبيقات (API)، والخدمات المصغرة. يمكن أن تؤدي الأخطاء في هذه الأنظمة إلى توقف مكلف أو تسرب للبيانات. تتيح الاختبارات الآلية ما يلي:
- العثور السريع على الانحدارات (regressions) أثناء إعادة الهيكلة
- توثيق سلوك الكود
- ضمان الاستقرار عند التكامل مع قواعد البيانات والخدمات الخارجية
- تسريع مراجعة الكود بفضل السيناريوهات القابلة للتحقق
الأنواع الرئيسية للاختبارات في Node.js
- الاختبارات الوحدوية — تتحقق من الدوال أو الوحدات الفردية بشكل معزول.
- الاختبارات التكاملية — تختبر التفاعل بين عدة وحدات (مثل قواعد البيانات أو API).
- اختبارات E2E — تحاكي إجراءات المستخدم عبر المتصفح أو طلبات HTTP.
Jest — إطار عمل شامل من Facebook
Jest هو الإطار الأكثر شيوعًا لاختبار JavaScript. يتضمن كل ما تحتاجه: مشغل اختبار، مكتبة تأكيدات (assertions)، كائنات وهمية (mocks)، ودعم مدمج للبرمجة غير المتزامنة.
// math.jsfunction add(a, b) { return a + b;}module.exports = { add };
// math.test.jsconst { add } = require('./math');
test('adds 1 + 2 to equal 3', () => { expect(add(1, 2)).toBe(3);});يدعم Jest ما يلي:
- الاكتشاف التلقائي لملفات الاختبار (
*.test.js) - الكائنات الوهمية والجواسيس المدمجة
- تغطية الكود (coverage) عبر العلم
--coverage - العمل مع الكود غير المتزامن عبر
async/await
Mocha + Chai — الكلاسيكية المرنة
Mocha هو مشغل اختبار يوفر هيكلًا للاختبارات (describe, it). للتأكيدات، تُستخدم عادةً مكتبة Chai، التي تقدم عدة أنماط (assert, expect, should).
const chai = require('chai');const expect = chai.expect;const { add } = require('./math');
describe('Math operations', () => { it('should add two numbers', () => { expect(add(2, 3)).to.equal(5); });});غالبًا ما يُدمج Mocha مع:
- Chai — للتأكيدات القابلة للقراءة
- Sinon — للكائنات الوهمية، والبدائل (stubs)، والجواسيس
- Supertest — لاختبار خوادم HTTP
Sinon — كائنات وهمية وجواسيس قوية
Sinon.JS هي مكتبة لإنشاء مزدوجات اختبارية. تتيح عزل الكود المختبر عن التبعيات الخارجية.
const sinon = require('sinon');const { expect } = require('chai');
const userService = { getUser: (id) => { /* استدعاء خارجي */ }};
describe('User controller', () => { it('should call getUser with correct id', () => { const spy = sinon.spy(userService, 'getUser'); userService.getUser(123); expect(spy.calledWith(123)).to.be.true; spy.restore(); });});Supertest — اختبار خوادم HTTP
يتيح Supertest اختبار خوادم Express/Koa دون تشغيلها على منفذ حقيقي. يحاكي طلبات HTTP ويتحقق من الاستجابات.
const request = require('supertest');const express = require('express');
const app = express();app.get('/hello', (req, res) => { res.status(200).json({ message: 'Hello World' });});
describe('GET /hello', () => { it('responds with json', (done) => { request(app) .get('/hello') .expect('Content-Type', /j