فارسی

راهنمای جامع تست یکپارچه‌سازی API با Supertest، شامل راه‌اندازی، بهترین شیوه‌ها و تکنیک‌های پیشرفته برای تست قوی برنامه‌ها.

تست یکپارچه‌سازی: تسلط بر تست API با Supertest

در دنیای توسعه نرم‌افزار، اطمینان از عملکرد صحیح کامپوننت‌های منفرد به صورت مجزا (تست واحد) امری حیاتی است. با این حال، به همان اندازه مهم است که تأیید کنیم این کامپوننت‌ها به طور یکپارچه با یکدیگر کار می‌کنند. اینجاست که تست یکپارچه‌سازی وارد عمل می‌شود. تست یکپارچه‌سازی بر اعتبارسنجی تعامل بین ماژول‌ها یا سرویس‌های مختلف درون یک برنامه تمرکز دارد. این مقاله به طور عمیق به تست یکپارچه‌سازی، به ویژه با تمرکز بر تست API با Supertest، یک کتابخانه قدرتمند و کاربرپسند برای تست ادعاهای HTTP در Node.js، می‌پردازد.

تست یکپارچه‌سازی چیست؟

تست یکپارچه‌سازی نوعی از تست نرم‌افزار است که ماژول‌های نرم‌افزاری منفرد را با هم ترکیب کرده و آن‌ها را به عنوان یک گروه تست می‌کند. هدف آن آشکار ساختن نقص‌ها در تعاملات بین واحدهای یکپارچه شده است. برخلاف تست واحد که بر کامپوننت‌های فردی تمرکز دارد، تست یکپارچه‌سازی جریان داده و جریان کنترل بین ماژول‌ها را تأیید می‌کند. رویکردهای رایج تست یکپارچه‌سازی عبارتند از:

در زمینه APIها، تست یکپارچه‌سازی شامل تأیید این است که APIهای مختلف به درستی با هم کار می‌کنند، داده‌های منتقل شده بین آن‌ها سازگار است و سیستم کلی طبق انتظار عمل می‌کند. به عنوان مثال، یک برنامه تجارت الکترونیک را با APIهای جداگانه برای مدیریت محصول، احراز هویت کاربر و پردازش پرداخت تصور کنید. تست یکپارچه‌سازی اطمینان حاصل می‌کند که این APIها به درستی با هم ارتباط برقرار می‌کنند و به کاربران اجازه می‌دهد محصولات را مرور کنند، به طور امن وارد شوند و خرید خود را تکمیل کنند.

چرا تست یکپارچه‌سازی API مهم است؟

تست یکپارچه‌سازی API به دلایل متعددی حیاتی است:

یک پلتفرم جهانی رزرو سفر را در نظر بگیرید. تست یکپارچه‌سازی API برای اطمینان از ارتباط روان بین APIهایی که رزرو پرواز، رزرو هتل و درگاه‌های پرداخت از کشورهای مختلف را مدیریت می‌کنند، حیاتی است. عدم یکپارچه‌سازی صحیح این APIها می‌تواند منجر به رزروهای نادرست، شکست در پرداخت و تجربه کاربری ضعیف شود و بر اعتبار و درآمد پلتفرم تأثیر منفی بگذارد.

معرفی Supertest: ابزاری قدرتمند برای تست API

Supertest یک انتزاع سطح بالا برای تست درخواست‌های HTTP است. این کتابخانه یک API روان و راحت برای ارسال درخواست به برنامه شما و ادعا (assert) در مورد پاسخ‌ها فراهم می‌کند. Supertest که بر پایه Node.js ساخته شده، به طور خاص برای تست سرورهای HTTP در Node.js طراحی شده است. این کتابخانه به طرز استثنایی با فریمورک‌های تست محبوب مانند Jest و Mocha کار می‌کند.

ویژگی‌های کلیدی Supertest:

راه‌اندازی محیط تست شما

قبل از شروع، بیایید یک محیط تست پایه را راه‌اندازی کنیم. ما فرض می‌کنیم که شما Node.js و npm (یا yarn) را نصب کرده‌اید. ما از Jest به عنوان فریمورک تست و از Supertest برای تست API استفاده خواهیم کرد.

  1. ایجاد یک پروژه Node.js:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. نصب وابستگی‌ها:
npm install --save-dev jest supertest
npm install express  # یا فریمورک دلخواه شما برای ساخت API
  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('responds with 200 OK and returns "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 طیف گسترده‌ای از ویژگی‌ها را برای تست پیشرفته API ارائه می‌دهد. بیایید برخی از آن‌ها را بررسی کنیم.

۱. ارسال بدنه درخواست (Request Body)

برای ارسال داده در بدنه درخواست، می‌توانید از متد .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('creates a new user', 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);
  });
});

توضیح:

۲. تنظیم هدرها

برای تنظیم هدرهای سفارشی در درخواست‌های خود، می‌توانید از متد .set() استفاده کنید. این برای تنظیم توکن‌های احراز هویت، انواع محتوا یا سایر هدرهای سفارشی مفید است.

describe('GET /protected', () => {
  it('requires authentication', async () => {
    const response = await request(app).get('/protected').expect(401);
  });

  it('returns 200 OK with a valid token', async () => {
    // شبیه‌سازی دریافت یک توکن معتبر
    const token = 'valid-token';

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

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

توضیح:

۳. مدیریت کوکی‌ها

Supertest همچنین می‌تواند کوکی‌ها را مدیریت کند. شما می‌توانید کوکی‌ها را با استفاده از متد .set('Cookie', ...) تنظیم کنید، یا می‌توانید از خاصیت .cookies برای دسترسی و تغییر کوکی‌ها استفاده کنید.

۴. تست آپلود فایل

Supertest می‌تواند برای تست اندپوینت‌های API که آپلود فایل را مدیریت می‌کنند، استفاده شود. شما می‌توانید از متد .attach() برای پیوست کردن فایل‌ها به درخواست استفاده کنید.

۵. استفاده از کتابخانه‌های ادعا (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('responds with 200 OK and returns "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 پیکربندی می‌کند.

۶. استفاده مجدد از ایجنت‌ها

برای تست‌هایی که نیاز به راه‌اندازی یک محیط خاص دارند (مثلاً احراز هویت)، اغلب استفاده مجدد از یک ایجنت Supertest مفید است. این کار از کد راه‌اندازی تکراری در هر مورد تست جلوگیری می‌کند.

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

  beforeAll(() => {
    agent = request.agent(app); // ایجاد یک ایجنت پایدار
    // شبیه‌سازی احراز هویت
    return agent
      .post('/login')
      .send({ username: 'testuser', password: 'password123' });
  });

  it('can access a protected resource', async () => {
    const response = await agent.get('/protected').expect(200);
    expect(response.text).toBe('Protected Resource');
  });

  it('can perform other actions that require authentication', async () => {
    // اقدامات احراز هویت شده دیگر را در اینجا انجام دهید
  });
});

در این مثال، ما یک ایجنت Supertest را در هوک beforeAll ایجاد کرده و آن را احراز هویت می‌کنیم. سپس تست‌های بعدی در بلوک describe می‌توانند از این ایجنت احراز هویت شده مجدداً استفاده کنند بدون اینکه برای هر تست دوباره احراز هویت کنند.

بهترین شیوه‌ها برای تست یکپارچه‌سازی API با Supertest

برای اطمینان از تست یکپارچه‌سازی API مؤثر، بهترین شیوه‌های زیر را در نظر بگیرید:

اشتباهات رایج که باید از آنها اجتناب کرد

نتیجه‌گیری

تست یکپارچه‌سازی API بخش اساسی فرآیند توسعه نرم‌افزار است. با استفاده از Supertest، می‌توانید به راحتی تست‌های یکپارچه‌سازی API جامع و قابل اعتمادی بنویسید که به تضمین کیفیت و پایداری برنامه شما کمک می‌کند. به یاد داشته باشید که بر روی تست گردش‌کارهای سرتاسری، استفاده از داده‌های واقعی، جداسازی تست‌ها و خودکارسازی فرآیند تست خود تمرکز کنید. با پیروی از این بهترین شیوه‌ها، می‌توانید به طور قابل توجهی خطر مشکلات یکپارچه‌سازی را کاهش دهید و محصولی قوی‌تر و قابل اعتمادتر ارائه دهید.

همانطور که APIها به پیش راندن برنامه‌های مدرن و معماری‌های میکروسرویس ادامه می‌دهند، اهمیت تست قوی API، و به ویژه تست یکپارچه‌سازی، فقط بیشتر خواهد شد. Supertest مجموعه ابزار قدرتمند و در دسترسی را برای توسعه‌دهندگان در سراسر جهان فراهم می‌کند تا از قابلیت اطمینان و کیفیت تعاملات API خود اطمینان حاصل کنند.