الدرس الواحد والثلاثون: اختبار الكود باستخدام الأدوات الحديثة
في هذا الدرس، سنتعرف على كيفية اختبار الكود باستخدام Jest، أحد أشهر أدوات اختبار الكود في بيئة JavaScript. سنغطي كيفية إعداد Jest، وكيفية كتابة اختبارات للوحدات (Unit Tests)، وكيفية إجراء الاختبارات باستخدام هذه الأدوات الحديثة.
1. ما هو Jest؟
Jest هو إطار عمل لاختبار الكود مفتوح المصدر تم تطويره بواسطة Facebook. يستخدم Jest بشكل شائع لاختبار JavaScript، بما في ذلك React، ولكنه يمكن أن يُستخدم أيضًا لاختبار Node.js وJavaScript العادي.
تتميز Jest بعدة مزايا:
- سهولة التثبيت والإعداد.
- التنفيذ المتوازي للاختبارات مما يزيد السرعة.
- دعم الاختبارات غير المتزامنة (Asynchronous).
- تغطية الكود (Code Coverage).
- سهولة الكتابة والصيانة.
- دعم المحاكاة (Mocks).
2. إعداد Jest
الخطوة 1: تثبيت Jest
لتثبيت Jest في مشروع Node.js، يجب أولاً التأكد من أن لديك ملف package.json في المشروع (يمكنك إنشاؤه باستخدام الأمر npm init إذا لم يكن موجودًا). ثم قم بتثبيت Jest عبر npm:
npm install --save-dev jest
الخطوة 2: إعداد npm script
لتسهيل تشغيل الاختبارات باستخدام Jest، يمكنك إضافة سكربت في package.json لتشغيل Jest بسهولة. في قسم “scripts”، أضف السطر التالي:
{
"scripts": {
"test": "jest"
}
}
الخطوة 3: كتابة أول اختبار باستخدام Jest
الآن يمكنك كتابة أول اختبار باستخدام Jest. لنفترض أن لدينا دالة بسيطة نريد اختبارها. على سبيل المثال، دالة لجمع رقمين:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
لإجراء اختبار لهذه الدالة، قم بإنشاء ملف اختبار جديد:
// sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
الشرح:
test()هو دالة من Jest تستخدم لتعريف اختبار.expect()تُستخدم لمقارنة النتيجة المتوقعة.toBe()هي matcher تُستخدم للتحقق من القيمة المتوقعة.
الخطوة 4: تشغيل الاختبارات
لتشغيل الاختبارات، يمكنك استخدام الأمر التالي في سطر الأوامر:
npm test
ستقوم Jest بالبحث عن أي ملفات تبدأ بـ .test.js أو .spec.js وتشغيلها.
3. كتابة اختبارات وحدات (Unit Tests)
اختبارات الوحدات هي نوع من الاختبارات التي تهدف إلى اختبار جزء صغير من الكود (وحدة) بشكل منفصل عن باقي النظام.
مثال 1: اختبار دالة جمع
لنفترض أنك قمت بكتابة دالة أخرى تقوم بطرح رقمين:
// subtract.js
function subtract(a, b) {
return a - b;
}
module.exports = subtract;
نكتب اختبار لهذه الدالة في subtract.test.js:
// subtract.test.js
const subtract = require('./subtract');
test('subtracts 5 - 3 to equal 2', () => {
expect(subtract(5, 3)).toBe(2);
});
مثال 2: اختبار دالة غير متزامنة
في بعض الأحيان، قد تحتاج إلى اختبار دوال غير متزامنة. على سبيل المثال، دالة تقوم بجلب بيانات عبر fetch أو أي API آخر.
نفترض أن لدينا دالة تقوم بجلب البيانات من خادم باستخدام fetch:
// fetchData.js
const fetchData = async (url) => {
const response = await fetch(url);
const data = await response.json();
return data;
}
module.exports = fetchData;
نكتب اختبار لهذه الدالة في fetchData.test.js باستخدام Jest:
// fetchData.test.js
const fetchData = require('./fetchData');
test('fetches data from API', async () => {
const data = await fetchData('https://jsonplaceholder.typicode.com/posts/1');
expect(data).toHaveProperty('id');
expect(data.id).toBe(1);
});
في هذا الاختبار:
async/awaitيُستخدم لاختبار الدوال غير المتزامنة.toHaveProperty()تُستخدم للتحقق من أن الكائن يحتوي على خاصية معينة.
مثال 3: استخدام المحاكاة (Mocks)
في بعض الحالات، قد تحتاج إلى محاكاة دوال أو وحدات خارجية مثل fetch أو console.log. باستخدام Jest، يمكنك إنشاء محاكاة لأي دالة أو وحدة. على سبيل المثال، محاكاة دالة console.log:
// logger.js
function logMessage(message) {
console.log(message);
}
module.exports = logMessage;
في الاختبار، يمكنك محاكاة console.log:
// logger.test.js
const logMessage = require('./logger');
test('logs message to console', () => {
console.log = jest.fn(); // محاكاة دالة console.log
logMessage('Hello, Jest!');
expect(console.log).toHaveBeenCalledWith('Hello, Jest!');
});
4. الاختبارات في Jest – الميّزات المتقدمة
- التغطية (Code Coverage): يمكنك استخدام Jest لقياس تغطية الكود عبر الأمر:
npm test -- --coverage
سيقوم Jest بتقديم تقرير حول أجزاء الكود التي تم اختبارها، ويعرض لك تفاصيل حول التغطية.
- اختبارات معتمدة على الوقت: يمكنك استخدام Jest لإجراء اختبارات على الكود الذي يعتمد على الوقت. يتم ذلك باستخدام timers mocks مثل
jest.useFakeTimers(). - الاختبارات مع قواعد البيانات: يمكنك محاكاة قواعد البيانات أو التعامل معها أثناء الاختبارات باستخدام Jest Mocks أو أدوات أخرى مثل mongodb-memory-server لاختبار الكود الذي يتعامل مع قاعدة البيانات.
5. الختام
في هذا الدرس:
- تعلمنا كيفية إعداد Jest لاختبار الكود في مشاريع JavaScript.
- كتبنا اختبارات وحدات (Unit Tests) لعدة دوال مختلفة.
- استخدمنا بعض ميزات Jest المتقدمة مثل المحاكاة (Mocks) واختبارات غير متزامنة.
اختبارات الوحدات تعتبر جزءًا أساسيًا في عملية تطوير البرمجيات الحديثة، لأنها تساعد في التأكد من أن الكود يعمل كما هو متوقع وتقلل من الأخطاء عند إضافة ميزات جديدة أو تعديل الكود.
اكتشاف المزيد من كود التطور
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.


