العربية

دليل شامل للاختبار التكاملي يركز على اختبار واجهات برمجة التطبيقات (API) باستخدام Supertest، ويغطي الإعداد وأفضل الممارسات والتقنيات المتقدمة لاختبار قوي للتطبيقات.

الاختبار التكاملي: إتقان اختبار واجهات برمجة التطبيقات (API) باستخدام Supertest

في عالم تطوير البرمجيات، يعد ضمان عمل المكونات الفردية بشكل صحيح بمعزل عن غيرها (اختبار الوحدة) أمرًا بالغ الأهمية. ومع ذلك، من المهم بنفس القدر التحقق من أن هذه المكونات تعمل معًا بسلاسة. وهنا يأتي دور الاختبار التكاملي. يركز الاختبار التكاملي على التحقق من صحة التفاعل بين الوحدات أو الخدمات المختلفة داخل التطبيق. تتعمق هذه المقالة في الاختبار التكاملي، مع التركيز بشكل خاص على اختبار واجهات برمجة التطبيقات باستخدام Supertest، وهي مكتبة قوية وسهلة الاستخدام لاختبار تأكيدات HTTP في Node.js.

ما هو الاختبار التكاملي؟

الاختبار التكاملي هو نوع من اختبارات البرمجيات يجمع بين وحدات برمجية فردية ويختبرها كمجموعة. يهدف إلى كشف العيوب في التفاعلات بين الوحدات المدمجة. على عكس اختبار الوحدة الذي يركز على المكونات الفردية، يتحقق الاختبار التكاملي من تدفق البيانات وتدفق التحكم بين الوحدات. تشمل مناهج الاختبار التكاملي الشائعة ما يلي:

في سياق واجهات برمجة التطبيقات (APIs)، يتضمن الاختبار التكاملي التحقق من أن الواجهات المختلفة تعمل معًا بشكل صحيح، وأن البيانات المارة بينها متسقة، وأن النظام بأكمله يعمل كما هو متوقع. على سبيل المثال، تخيل تطبيقًا للتجارة الإلكترونية بواجهات API منفصلة لإدارة المنتجات، ومصادقة المستخدم، ومعالجة الدفع. سيضمن الاختبار التكاملي أن هذه الواجهات تتواصل بشكل صحيح، مما يسمح للمستخدمين بتصفح المنتجات وتسجيل الدخول بأمان وإتمام عمليات الشراء.

لماذا يعد اختبار تكامل واجهات برمجة التطبيقات مهمًا؟

يعد اختبار تكامل واجهات برمجة التطبيقات أمرًا بالغ الأهمية لعدة أسباب:

فكر في منصة عالمية لحجز السفر. يعد اختبار تكامل واجهات برمجة التطبيقات أمرًا بالغ الأهمية لضمان التواصل السلس بين واجهات برمجة التطبيقات التي تتعامل مع حجوزات الطيران وحجوزات الفنادق وبوابات الدفع من مختلف البلدان. قد يؤدي الفشل في دمج واجهات برمجة التطبيقات هذه بشكل صحيح إلى حجوزات غير صحيحة، وإخفاقات في الدفع، وتجربة مستخدم سيئة، مما يؤثر سلبًا على سمعة المنصة وإيراداتها.

تقديم Supertest: أداة قوية لاختبار واجهات برمجة التطبيقات

Supertest هو تجريد عالي المستوى لاختبار طلبات HTTP. يوفر واجهة برمجة تطبيقات مريحة وسلسة لإرسال الطلبات إلى تطبيقك والتأكيد على الاستجابات. تم بناء Supertest فوق Node.js، وهو مصمم خصيصًا لاختبار خوادم HTTP في Node.js. يعمل بشكل جيد للغاية مع أطر الاختبار الشائعة مثل Jest و Mocha.

الميزات الرئيسية لـ Supertest:

إعداد بيئة الاختبار الخاصة بك

قبل أن نبدأ، دعنا نقم بإعداد بيئة اختبار أساسية. سنفترض أن لديك Node.js و npm (أو yarn) مثبتين. سنستخدم Jest كإطار عمل للاختبار و Supertest لاختبار واجهات برمجة التطبيقات.

  1. إنشاء مشروع Node.js:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. تثبيت التبعيات:
npm install --save-dev jest supertest
npm install express  # أو إطار العمل المفضل لديك لإنشاء واجهة برمجة التطبيقات
  1. تكوين Jest: أضف ما يلي إلى ملف package.json الخاص بك:
{
  "scripts": {
    "test": "jest"
  }
}
  1. إنشاء نقطة نهاية API بسيطة: أنشئ ملفًا باسم app.js (أو ما شابه) بالكود التالي:
const express = require('express');
const app = express();
const port = 3000;

app.get('/hello', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

module.exports = app; // تصدير للاختبار

كتابة أول اختبار لك باستخدام Supertest

الآن بعد أن قمنا بإعداد بيئتنا، دعنا نكتب اختبار Supertest بسيط للتحقق من نقطة نهاية API الخاصة بنا. أنشئ ملفًا باسم app.test.js (أو ما شابه) في جذر مشروعك:

const request = require('supertest');
const app = require('./app');

describe('GET /hello', () => {
  it('يستجيب بحالة 200 OK ويعيد \"Hello, World!\"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).toBe(200);
    expect(response.text).toBe('Hello, World!');
  });
});

الشرح:

لتشغيل الاختبار، نفذ الأمر التالي في الطرفية الخاصة بك:

npm test

إذا تم إعداد كل شيء بشكل صحيح، يجب أن ترى الاختبار ينجح.

تقنيات Supertest المتقدمة

يقدم Supertest مجموعة واسعة من الميزات لاختبار واجهات برمجة التطبيقات المتقدمة. دعنا نستكشف بعضًا منها.

1. إرسال أجسام الطلبات

لإرسال البيانات في جسم الطلب، يمكنك استخدام طريقة .send(). على سبيل المثال، لنقم بإنشاء نقطة نهاية تقبل بيانات JSON:

app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  // محاكاة إنشاء مستخدم في قاعدة البيانات
  const user = { id: Date.now(), name, email };
  res.status(201).json(user);
});

إليك كيفية اختبار نقطة النهاية هذه باستخدام Supertest:

describe('POST /users', () => {
  it('ينشئ مستخدمًا جديدًا', async () => {
    const userData = {
      name: 'John Doe',
      email: 'john.doe@example.com',
    };

    const response = await request(app)
      .post('/users')
      .send(userData)
      .expect(201);

    expect(response.body).toHaveProperty('id');
    expect(response.body.name).toBe(userData.name);
    expect(response.body.email).toBe(userData.email);
  });
});

الشرح:

2. إعداد الرؤوس (Headers)

لتعيين رؤوس مخصصة في طلباتك، يمكنك استخدام طريقة .set(). هذا مفيد لتعيين رموز المصادقة، أو أنواع المحتوى، أو رؤوس مخصصة أخرى.

describe('GET /protected', () => {
  it('يتطلب مصادقة', async () => {
    const response = await request(app).get('/protected').expect(401);
  });

  it('يعيد 200 OK مع رمز صالح', async () => {
    // محاكاة الحصول على رمز صالح
    const token = 'valid-token';

    const response = await request(app)
      .get('/protected')
      .set('Authorization', `Bearer ${token}`)
      .expect(200);

    expect(response.text).toBe('Protected Resource');
  });
});

الشرح:

3. التعامل مع ملفات تعريف الارتباط (Cookies)

يمكن لـ Supertest أيضًا التعامل مع ملفات تعريف الارتباط. يمكنك تعيين ملفات تعريف الارتباط باستخدام طريقة .set('Cookie', ...)، أو يمكنك استخدام خاصية .cookies للوصول إلى ملفات تعريف الارتباط وتعديلها.

4. اختبار تحميل الملفات

يمكن استخدام Supertest لاختبار نقاط نهاية API التي تتعامل مع تحميل الملفات. يمكنك استخدام طريقة .attach() لإرفاق الملفات بالطلب.

5. استخدام مكتبات التأكيد (Chai)

بينما تكون مكتبة التأكيد المدمجة في Jest كافية للعديد من الحالات، يمكنك أيضًا استخدام مكتبات تأكيد أكثر قوة مثل Chai مع Supertest. توفر Chai بناء جملة تأكيد أكثر تعبيرًا ومرونة. لاستخدام Chai، ستحتاج إلى تثبيتها:

npm install --save-dev chai

بعد ذلك، يمكنك استيراد Chai إلى ملف الاختبار الخاص بك واستخدام تأكيداتها:

const request = require('supertest');
const app = require('./app');
const chai = require('chai');
const expect = chai.expect;

describe('GET /hello', () => {
  it('يستجيب بحالة 200 OK ويعيد \"Hello, World!\"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).to.equal(200);
    expect(response.text).to.equal('Hello, World!');
  });
});

ملاحظة: قد تحتاج إلى تكوين Jest للعمل بشكل صحيح مع Chai. غالبًا ما يتضمن ذلك إضافة ملف إعداد يستورد Chai ويهيئه للعمل مع expect العام لـ Jest.

6. إعادة استخدام الوكلاء (Agents)

بالنسبة للاختبارات التي تتطلب إعداد بيئة محددة (مثل المصادقة)، غالبًا ما يكون من المفيد إعادة استخدام وكيل Supertest. هذا يتجنب تكرار كود الإعداد في كل حالة اختبار.

describe('Authenticated API Tests', () => {
  let agent;

  beforeAll(() => {
    agent = request.agent(app); // إنشاء وكيل دائم
    // محاكاة المصادقة
    return agent
      .post('/login')
      .send({ username: 'testuser', password: 'password123' });
  });

  it('يمكنه الوصول إلى مورد محمي', async () => {
    const response = await agent.get('/protected').expect(200);
    expect(response.text).toBe('Protected Resource');
  });

  it('يمكنه أداء إجراءات أخرى تتطلب المصادقة', async () => {
    // قم بتنفيذ الإجراءات الأخرى المصادق عليها هنا
  });
});

في هذا المثال، نقوم بإنشاء وكيل Supertest في خطاف beforeAll ونقوم بمصادقة الوكيل. يمكن للاختبارات اللاحقة داخل كتلة describe بعد ذلك إعادة استخدام هذا الوكيل المصادق عليه دون الحاجة إلى إعادة المصادقة لكل اختبار.

أفضل الممارسات لاختبار تكامل واجهات برمجة التطبيقات باستخدام Supertest

لضمان اختبار تكامل API فعال، ضع في اعتبارك أفضل الممارسات التالية:

الأخطاء الشائعة التي يجب تجنبها

الخاتمة

يعد اختبار تكامل واجهات برمجة التطبيقات جزءًا أساسيًا من عملية تطوير البرمجيات. باستخدام Supertest، يمكنك بسهولة كتابة اختبارات تكامل API شاملة وموثوقة تساعد على ضمان جودة واستقرار تطبيقك. تذكر أن تركز على اختبار تدفقات العمل من البداية إلى النهاية، واستخدام بيانات واقعية، وعزل اختباراتك، وأتمتة عملية الاختبار الخاصة بك. باتباع أفضل الممارسات هذه، يمكنك تقليل مخاطر مشكلات التكامل بشكل كبير وتقديم منتج أكثر قوة وموثوقية.

مع استمرار واجهات برمجة التطبيقات في قيادة التطبيقات الحديثة وبنى الخدمات المصغرة، ستستمر أهمية اختبار واجهات برمجة التطبيقات القوي، وخاصة الاختبار التكاملي، في النمو. يوفر Supertest مجموعة أدوات قوية وسهلة الوصول للمطورين في جميع أنحاء العالم لضمان موثوقية وجودة تفاعلات واجهات برمجة التطبيقات الخاصة بهم.