تست کارآمد Cypress API با دستورات سفارشی

هنگام کار بر روی پروژههایی که شامل تست API گسترده است، مدیریت درخواستهای API در تستهای Cypress شما میتواند به سرعت طاقتفرسا شود. نوشتن فراخوانی های تکراری cy.request() به طور مستقیم در فایل های آزمایشی نه تنها باعث به هم ریختگی آنها می شود، بلکه نگهداری آنها را نیز دشوار می کند. برای رسیدگی به این موضوع، من یک رویکرد ساختاریافته برای سازماندهی و ساده کردن درخواستهای API با استفاده از دستورات سفارشی در Cypress اتخاذ کردهام. در اینجا، من راه حل خود را گام به گام به شما معرفی می کنم، که می توانید برای ساده کردن تست های API خود پیاده سازی کنید.
مرحله 1: یک عملکرد کلی برای همه درخواست ها
اولین قدم ایجاد یک تابع عمومی برای رسیدگی به هر نوع درخواست API است. این تابع پارامترهایی مانند روش HTTP، URL، پارامترهای پرس و جو، بدنه درخواست، نشانه حامل و هدرهای دستگاه را می پذیرد. در اینجا پیاده سازی است:
function callRequest(method, url, params, body, bearer, device) {
var headers = {
uuid: Cypress.uuid // Unique identifier for tracking requests
}
if (bearer) {
headers.authentication = 'Bearer ' + bearer;
}
if (device) {
headers['Origin-Type'] = device;
}
return cy.request({
method: method,
url: url,
qs: params,
body: body,
headers: headers,
failOnStatusCode: false,
}).then((response) => {
if (response.status === 500) {
cy.task('log', `[\${new Date().toISOString()}] Request URL: \${url}, Parameters: \${JSON.stringify(params)}, Response: \${JSON.stringify(response.body)}`);
}
return cy.wrap(response);
});
}
این تابع یک پایه منعطف برای همه انواع درخواست ها است و مدیریت مداوم هدرها، پارامترهای پرس و جو و ثبت خطا را تضمین می کند.
مرحله 2: توابع خاص برای روش های HTTP
از آنجایی که روشهای مختلف HTTP اغلب به پارامترهای متفاوتی نیاز دارند (مثلاً GET معمولاً به بدنه درخواست نیاز ندارد)، من برای هر روش توابع جداگانه ایجاد کردم. به عنوان مثال:
function getRequest(url, params = { countryId: Cypress.env().countryId }, bearer) {
return callRequest('GET', url, params, undefined, bearer);
}
function postRequest(url, params = { countryId: Cypress.env().countryId }, body, bearer) {
return callRequest('POST', url, params, body, bearer);
}
این انتزاع کد را پاکتر میکند و از مشخص کردن مکرر جزئیات روش HTTP در هر تماس API اجتناب میکند.
مرحله 3: دستورات Cypress سفارشی
برای سادهتر کردن استفاده از API در تستها، دستورات Cypress سفارشی ایجاد کردم. هر دستور URL نقطه پایانی خاصی را تعریف می کند و تابع روش HTTP مناسب را فراخوانی می کند. در اینجا چند نمونه وجود دارد:
Cypress.Commands.add('getTranslation', (params) => {
const reqUrl = '/_api/v1/translations/translate/';
return getRequest(reqUrl, params);
});
Cypress.Commands.add('setUserData', (params, body, bearer) => {
const reqUrl = '/api/v1/user/signup-info-data/';
return postRequest(reqUrl, undefined, body, bearer);
});
این دستورات اضافه کردن نقاط پایانی API جدید را در صورت نیاز بسیار آسان می کند. شما فقط باید URL نقطه پایانی را تعریف کنید و تابع روش HTTP مناسب را انتخاب کنید.
من یک فایل جداگانه فقط برای دستورات سفارشی API ایجاد کرده ام. برای اینکه بتوانم از آن استفاده کنم، مجبور شدم اضافه کنم import './commands-api'
به فایل e2e.js در پوشه پشتیبانی.
مرحله 4: استفاده از دستورات سفارشی در تست ها
با تنظیم همه چیز، استفاده از درخواستهای API در تستهای شما بدون دردسر میشود. به عنوان مثال:
cy.getTranslation().then(response => {
expect(response.status).to.eq(200);
expect(response.body).to.have.property('translations');
});
مزایای این رویکرد
- قابلیت نگهداری: تغییرات در منطق درخواست API (به عنوان مثال، سرصفحه ها، ورود به سیستم) را می توان در یک مکان ایجاد کرد.
- قابلیت استفاده: از همان دستورات سفارشی در چندین آزمایش استفاده مجدد کنید.
- خوانایی: فایل های آزمایشی مختصر و متمرکز بر ادعاها هستند.
- مقیاس پذیری: به راحتی نقاط پایانی یا روش های HTTP جدید را بدون تکرار کد اضافه کنید.
نتیجه گیری
با سازماندهی درخواستهای API در یک تابع کلی، توابع خاص روش HTTP و دستورات سفارشی، میتوانید قابلیت نگهداری و مقیاسپذیری تستهای Cypress API خود را به میزان قابل توجهی بهبود بخشید. این رویکرد تکرار کد را کاهش می دهد و کنترل سناریوهای آزمایشی پیچیده را آسان می کند.
با خیال راحت این ساختار را در پروژه های خود پیاده سازی و تطبیق دهید. نظرات خود را به من بگویید یا رویکردهای خود را برای سازماندهی درخواست های API در Cypress به اشتراک بگذارید!