جدول المحتويات
1 المقدمة
Postman هي أداة اختبار قوية لواجهة برمجة التطبيقات تسهل على المطورين اختبار واجهات برمجة التطبيقات وتطويرها وتوثيقها . تم تصميم هذه المقالة لتكون ورقة غش للمبتدئين والمطورين ذوي الخبرة على حد سواء. سيغطي المتغيرات والتأكيدات و Postman Sandbox و Postman Echo ومهام سير العمل والمقتطفات شائعة الاستخدام والأخطاء. دعنا نتعمق!
2. العمل مع المتغيرات
2.1. الحصول على المتغيرات في منشئ الطلبات
يمكنك الوصول إلى المتغيرات في Request Builder باستخدام الأقواس المزدوجة المتعرجة {{variable_name}}
. على سبيل المثال ، إذا كان لديك متغير بيئة يسمى base_url
، فيمكنك استخدامه في عنوان URL لطلبك مثل هذا: {{base_url}} / api / endpoint
.
2.2. المتغيرات العالمية
المتغيرات العالمية يمكن الوصول إليها عبر جميع البيئات والمجموعات. لتعيين المتغيرات العامة أو الحصول عليها ، استخدم ما يلي:
// Set a global variable
pm.globals.set("variable_name", "value");
// Get a global variable
pm.globals.get("variable_name");
2.3 متغيرات المجموعة
متغيرات المجموعة خاصة بالمجموعة. لتعيين أو الحصول على متغيرات المجموعة ، استخدم ما يلي:
// Set a collection variable
pm.collectionVariables.set("variable_name", "value");
// Get a collection variable
pm.collectionVariables.get("variable_name");
2.4 متغيرات البيئة
متغيرات البيئة خاصة بالبيئة. لتعيين أو الحصول على متغيرات البيئة ، استخدم ما يلي:
// Set an environment variable
pm.environment.set("variable_name", "value");
// Get an environment variable
pm.environment.get("variable_name");
2.5 متغيرات البيانات
يتم استخدام متغيرات البيانات عند تشغيل مجموعة مع ملف بيانات (على سبيل المثال ، CSV أو JSON). للوصول إلى متغيرات البيانات ، استخدم pm.iterationData
:
// Get a data variable
pm.iterationData.get("variable_name");
2.6. المتغيرات المحلية
المتغيرات المحلية مؤقتة ولا تتوفر إلا في البرنامج النصي الحالي. لتعيين أو الحصول على المتغيرات المحلية ، استخدم pm.variables
:
// Set a local variable
pm.variables.set("variable_name", "value");
// Get a local variable
pm.variables.get("variable_name");
2.7. المتغيرات الديناميكية
المتغيرات الديناميكية هي قيم يتم إنشاؤها بشكل عشوائي. لاستخدام المتغيرات الديناميكية ، قم بلفها بأقواس معقوفة مزدوجة {{variable_name}}
في Request Builder أو استخدم pm.variables.replaceIn ()
في البرامج النصية:
// Replace dynamic variables in a string
const url = pm.variables.replaceIn("{{base_url}}/api/{{randomInt}}");
تتضمن بعض المتغيرات الديناميكية الشائعة ما يلي:
{{الدليل}}
: GUID عشوائي.{{$ timestamp}}
: الطابع الزمني الحالي لـ UNIX.{{randomInt}}
: عدد صحيح عشوائي بين 0 و 1000.
2.8 متغيرات التسجيل والتصحيح
لتسجيل أو تصحيح المتغيرات ، استخدم console.log ()
:
// Log a variable
console.log(pm.environment.get("variable_name"));
3. التأكيدات
يتم استخدام التأكيدات في Postman للتحقق من استجابات API. تمت كتابتها بلغة JavaScript باستخدام مكتبة Chai Assertion.
3.1. تأكيدات رمز الحالة
لتأكيد رمز الحالة للاستجابة ، استخدم pm.response.to.have.status ()
:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
3.2 تأكيدات وقت الاستجابة
لتأكيد وقت الاستجابة للاستجابة ، استخدم طريقة `pm.expect ()`:
pm.test("Response time is less than 500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});
3.3 تأكيدات الرأس
لتأكيد وجود رأس أو قيمته ، استخدم pm.response.to.have.header ()
:
pm.test("Content-Type header is present", function () {
pm.response.to.have.header("Content-Type");
});
pm.test("Content-Type is application/json", function () {
pm.response.to.have.header("Content-Type", "application/json");
});
3.4. تأكيدات ملفات تعريف الارتباط
لتأكيد وجود ملف تعريف الارتباط أو قيمته ، استخدم pm.cookies.has ()
و pm.cookies.get ()
:
pm.test("Session cookie is present", function () {
pm.expect(pm.cookies.has("session")).to.be.true;
});
pm.test("Session cookie has a valid value", function () {
const cookieValue = pm.cookies.get("session");
pm.expect(cookieValue).to.match(/^[a-f0-9]{32}$/);
});
3.5 تأكيدات الجسم
3.5.1. أي نوع محتوى / ردود HTML
لتأكيد وجود نص في نص الاستجابة ، استخدم pm.response.to.have.body ()
:
pm.test("Response body contains 'success'", function () {
pm.response.to.have.body("success");
});
3.5.2. ردود JSON
لتأكيد قيمة خاصية JSON في نص الاستجابة ، استخدم pm.response.to.have.json ()
:
pm.test("User ID is 1", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.id).to.equal(1);
});
3.5.3. استجابات XML
لتأكيد قيمة عنصر XML في نص الاستجابة ، استخدم pm.response.to.have.xml ()
ووظيفة xml2Json ()
:
pm.test("Order ID is 1", function () {
const xmlData = xml2Json(pm.response.text());
pm.expect(xmlData.order.id._text).to.equal("1");
});
3.6 تخطي الاختبارات
لتخطي الاختبار ، استخدم pm.test.skip ()
:
pm.test.skip("Skipped test", function () {
// Test code
});
3.7 الاختبارات الفاشلة
لفشل الاختبار ، استخدم pm.expect ()
مع .to.be.false
:
pm.test("Failing test", function () {
pm.expect(true).to.be.false;
});
4. صندوق حماية ساعي البريد
4.1 كائن مساء
كائن pm
هو كائن عام في نصوص Postman النصية التي توفر الوصول إلى بيانات الطلب والاستجابة ، بالإضافة إلى القدرة على معالجة المتغيرات وإجراء الاختبارات.
4.2 مساءا
pm.sendRequest
هي طريقة تسمح لك بإرسال طلب HTTP من البرامج النصية الخاصة بك. يمكن أن يكون هذا مفيدًا في تسلسل الطلبات ، أو جلب البيانات من مصادر خارجية ، أو إجراء استدعاءات API داخل البرامج النصية للاختبار.
pm.sendRequest("https://api.example.com/data", function (err, response) {
if (err) {
console.error(err);
} else {
const data = response.json();
// Do something with the data
}
});
5. صدى ساعي البريد
Postman Echo هي خدمة تتيح لك محاكاة طلبات واستجابات واجهة برمجة التطبيقات. إنه مفيد للاختبار والتعلم حول مفاهيم API المختلفة دون الحاجة إلى إعداد API الخاص بك.
5.1 احصل على التوقيت العالمي المنسق الحالي في البرنامج النصي للطلب المسبق
يمكنك استخدام Postman Echo للحصول على وقت UTC الحالي في نص طلب مسبق. هذا مثال:
pm.sendRequest("https://postman-echo.com/time/zone?zone=UTC", function (err, response) {
if (err) {
console.error(err);
} else {
const jsonData = response.json();
const currentTime = jsonData.formatted;
pm.environment.set("current_time", currentTime);
}
});
6. تدفقات العمل
تسمح لك مهام سير العمل في Postman بالتحكم في ترتيب تنفيذ الطلب عند تشغيل مجموعة.
6.1 قم بتعيين الطلب التالي ليتم تنفيذه
لتعيين الطلب التالي ليتم تنفيذه ، استخدم postman.setNextRequest ()
:
// In the Tests tab of your request
if (pm.response.to.have.status(200)) {
postman.setNextRequest("Next Request Name");
} else {
postman.setNextRequest(null);
}
6.2 إيقاف تنفيذ الطلبات / إيقاف تشغيل المجموعة
لإيقاف تنفيذ الطلبات أو إيقاف تشغيل المجموعة ، استخدم postman.setNextRequest (فارغ)
:
// In the Tests tab of your request
if (pm.response.to.have.status(400)) {
postman.setNextRequest(null);
}
7. المقتطفات شائعة الاستخدام لاختبار API
عند اختبار واجهات برمجة التطبيقات في Postman ، هناك بعض المقتطفات الشائعة التي يمكن أن تساعدك في التحقق بسرعة من صحة بيانات الاستجابة وهيكلها. دعنا نلقي نظرة على هذه المقتطفات وحالات استخدامها.
7.1 فحص رمز الحالة
للتحقق مما إذا كانت الاستجابة تحتوي على رمز حالة معين ، يمكنك استخدام المقتطف التالي:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
7.2 فحص وقت الاستجابة
للتحقق مما إذا كان وقت الاستجابة ضمن النطاق المقبول ، يمكنك استخدام هذا المقتطف:
pm.test("Response time is less than 500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});
7.3. فحص رأس نوع المحتوى
للتأكد من أن الاستجابة تحتوي على رأس "نوع المحتوى" الصحيح ، يمكنك استخدام المقتطف التالي:
pm.test("Content-Type is 'application/json'", function () {
pm.response.to.have.header("Content-Type", "application/json");
});
7.4. فحص قيمة JSON
للتحقق مما إذا كانت خاصية JSON معينة لها القيمة المتوقعة ، يمكنك استخدام هذا المقتطف:
pm.test("Response has a 'status' property with the value 'success'", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.have.property('status');
pm.expect(jsonData.status).to.equal('success');
});
7.5 فحص طول الصفيف
للتحقق من طول المصفوفة في الاستجابة ، يمكنك استخدام المقتطف التالي:
pm.test("Response has an array of 5 items", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.be.an('array').that.has.lengthOf(5);
});
7.6 نص الرد يحتوي على نص
للتحقق مما إذا كان نص الاستجابة يحتوي على نص معين ، استخدم المقتطف التالي:
pm.test("Body contains 'example'", function () {
pm.expect(pm.response.text()).to.include('example');
});
7.7 فحص بنية كائن JSON
للتأكد من أن استجابة JSON لها بنية محددة ، استخدم هذا المقتطف:
pm.test("Response has correct JSON structure", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.have.all.keys('id', 'name', 'email');
});
7.8 تحتوي صفيف JSON على كائن
للتحقق مما إذا كانت مصفوفة JSON تحتوي على كائن بخصائص معينة ، استخدم المقتطف التالي:
pm.test("Array contains object with specific properties", function () {
const jsonData = pm.response.json();
const targetObject = jsonData.find(item => item.id === 1);
pm.expect(targetObject).to.include.all.keys('id', 'name', 'email');
});
7.9. فحص متغير البيئة
للتحقق مما إذا تم تعيين متغير البيئة بشكل صحيح ، استخدم هذا المقتطف:
pm.test("Environment variable 'token' is set", function () {
pm.expect(pm.environment.has('token')).to.be.true;
});
7.10. فحص قيمة متغير البيئة
للتحقق مما إذا كان متغير البيئة لديه القيمة المتوقعة ، استخدم المقتطف التالي:
pm.test("Environment variable 'token' has correct value", function () {
const token = pm.environment.get('token');
pm.expect(token).to.equal('your_expected_token_value');
});
7.11. التحقق من معلمة الاستعلام
للتحقق مما إذا كان الطلب يحتوي على معلمة طلب بحث معينة ، استخدم هذا المقتطف:
pm.test("Request has 'limit' query parameter", function () {
pm.expect(pm.request.url.query.has('limit')).to.be.true;
});
7.12. التحقق من قيمة معلمة الاستعلام
للتحقق مما إذا كانت معلمة الاستعلام تحتوي على القيمة المتوقعة ، استخدم المقتطف التالي:
pm.test("Query parameter 'limit' has correct value", function () {
const limit = pm.request.url.query.get('limit');
pm.expect(limit).to.equal('10');
});
7.13. التحقق من صحة مخطط JSON للرد
للتحقق من صحة استجابة JSON مقابل مخطط ، استخدم المقتطف التالي:
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true });
const schema = {
"type": "object",
"properties": {
"id": { "type": "number" },
"name": { "type": "string" }
},
"required": ["id", "name"]
};
pm.test("Response JSON schema is valid", function () {
const jsonData
8. الأخطاء الشائعة التي يجب تجنبها في ساعي البريد
فيما يلي بعض الأخطاء الشائعة التي يجب تجنبها عند استخدام Postman:
8.1 استخدام "set" بدلاً من "get" عند تحديد متغير
كن حذرًا عند استخدام المجموعة
واحصل على
المتغيرات. أن يؤدي استخدام set
بدلاً من get
عند تحديد متغير إلى استبدال القيمة ، مما يؤدي إلى نتائج غير متوقعة. إذا حاولت الحصول على
المتغير بعد ذلك ، فقد تتلقى خالية
أو قيمة أخرى غير القيمة المقصودة.
8.2 عدم معالجة التعليمات البرمجية غير المتزامنة بشكل صحيح
تعمل نصوص ساعي البريد بشكل متزامن افتراضيًا. إذا كنت تستخدم رمزًا غير متزامن (على سبيل المثال ، setTimeout أو fetch أو async / wait) ، فقد تواجه مشكلات أو نتائج غير متوقعة. للتعامل مع التعليمات البرمجية غير المتزامنة بشكل صحيح في Postman ، استخدم pm.sendRequest
أو قم بتضمين done ()
في اختباراتك.
في هذا المثال ، ستتعلم كيفية استخدام التعليمات البرمجية غير المتزامنة بشكل صحيح في Postman باستخدام pm.sendRequest ()
ووظيفة done ()
في اختباراتك:
// Pre-request script
pm.sendRequest("https://api.example.com/data", (error, response) => {
if (error) {
console.log(error);
done(error);
} else {
pm.environment.set("data", JSON.stringify(response.json()));
done();
}
});
في نص الطلب المسبق هذا ، نجري طلبًا غير متزامن إلى https://api.example.com/data
باستخدام pm.sendRequest ()
. عند اكتمال الطلب ، يتم تنفيذ وظيفة رد الاتصال. إذا كان هناك خطأ ، نقوم بتسجيله واستدعاء ()
مع الخطأ. إذا لم يكن هناك خطأ ، فقمنا بتعيين متغير بيئة مع بيانات الاستجابة وتم إجراء المكالمة ()
للإشارة إلى اكتمال العملية غير المتزامنة.
8.3 استخدام نطاق متغير غير صحيح
لدى Postman نطاقات متغيرة مختلفة ، مثل العالمية ، والبيئة ، والتجميع. تأكد من استخدام النطاق المناسب للمتغيرات الخاصة بك لتجنب الكتابة فوق القيم أو استخدام البيانات الخاطئة في طلباتك واختباراتك.
عندما تتعارض أسماء المتغيرات في Postman ، يتبع التطبيق ترتيبًا محددًا للأولوية لتحديد القيمة التي يجب استخدامها. هذا التسلسل الهرمي للنطاقات هو كما يلي:
- المتغيرات المحلية
- متغيرات البيانات
- متغيرات البيئة
- متغيرات المجموعة
- المتغيرات العالمية
إذا كان اسم المتغير موجودًا في نطاقات متعددة ، فسيستخدم Postman القيمة من النطاق ذي الأولوية القصوى. على سبيل المثال ، إذا كان لديك نفس اسم المتغير في نطاقات البيئة والتجميع ، فسيتم استخدام قيمة متغير البيئة ، حيث إنها ذات أولوية أعلى.
لنفكر في مثال:
المتغير العالمي:
pm.globals.set("apiUrl", "https://global.example.com");
متغير المجموعة:
pm.collectionVariables.set("apiUrl", "https://collection.example.com");
متغيرات البيئة:
pm.environment.set("apiUrl", "https://environment.example.com");
في هذه الحالة ، عند استخدام {{apiUrl}}
في طلبك ، سيستخدم Postman القيمة من نطاق البيئة: https://environment.example.com
.
لتجنب المشكلات المتعلقة بتعارض أسماء المتغيرات ، من الضروري اتباع أفضل الممارسات عند تسمية المتغيرات واستخدام الأسماء الوصفية التي تشير إلى غرضها ونطاقها. بالإضافة إلى ذلك ، يمكنك الحفاظ على اصطلاح تسمية متسق عبر فريقك لتقليل مخاطر التعارضات.
8.4 نسيان تحديث متغيرات البيئة
إذا كنت تستخدم متغيرات البيئة في اختباراتك وطلباتك ، فتأكد من تحديثها بانتظام. قد يؤدي عدم القيام بذلك إلى بيانات قديمة أو غير صحيحة في اختباراتك ، مما قد يؤدي إلى فشلها.
في هذا المثال ، لدينا واجهة برمجة تطبيقات برمز وصول تنتهي صلاحيته كل 30 يومًا. إذا لم تقم بتحديث رمز الوصول المخزن في متغير البيئة الخاص بك ، فستبدأ مكالمات API الخاصة بك في الفشل بعد 30 يومًا.
لنفكر في السيناريو التالي:
لديك متغير بيئة يسمى accessToken
:
pm.environment.set("accessToken", "your_access_token");
في طلب واجهة برمجة التطبيقات ، يمكنك استخدام accessToken
في رأس التفويض:
GET /api/v1/resource
Authorization: Bearer {{accessToken}}
لديك اختبار يتحقق مما إذا كانت حالة الاستجابة هي 200:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
إذا نسيت تحديث accessToken
عند انتهاء صلاحيته ، فستقوم واجهة برمجة التطبيقات بإرجاع خطأ مصادقة ، وسيفشل اختبار التحقق من رمز الحالة 200.
لتجنب هذه المشكلة ، يمكنك إما:
- قم بتعيين تذكير لتحديث رمز الوصول في متغير البيئة قبل انتهاء صلاحيته ، أو
- قم بتنفيذ برنامج نصي للطلب المسبق يقوم بتحديث رمز الوصول تلقائيًا إذا انتهت صلاحيته.
على سبيل المثال ، يمكنك إنشاء نص برمجي للطلب المسبق يتحقق من تاريخ انتهاء صلاحية الرمز المميز ويقوم بتحديثه إذا لزم الأمر:
const refreshTokenIfNeeded = () => {
const accessToken = pm.environment.get("accessToken");
const expirationDate = new Date(pm.environment.get("expirationDate"));
if (new Date() > expirationDate) {
// Refresh the access token
pm.sendRequest({
url: "https://your_auth_server.com/oauth/token",
method: "POST",
body: {
mode: "urlencoded",
urlencoded: [
{ key: "client_id", value: "your_client_id" },
{ key: "client_secret", value: "your_client_secret" },
{ key: "grant_type", value: "refresh_token" },
{ key: "refresh_token", value: pm.environment.get("refreshToken") },
],
},
}, (err, res) => {
if (!err) {
pm.environment.set("accessToken", res.json().access_token);
const expiresIn = res.json().expires_in;
const newExpirationDate = new Date();
newExpirationDate.setSeconds(newExpirationDate.getSeconds() + expiresIn);
pm.environment.set("expirationDate", newExpirationDate.toISOString());
} else {
console.error("Error refreshing access token: ", err);
}
});
}
};
refreshTokenIfNeeded();
8.5 معالجة خطأ غير كافية
تأكد من تضمين المعالجة المناسبة للخطأ في اختباراتك ، مثل التحقق من صحة رمز حالة الاستجابة والتحقق من رسائل الخطأ في نص الاستجابة. سيساعدك هذا في تحديد المشكلات بسرعة وبدقة.
في هذا المثال ، سننشئ مجموعة اختبار تتحقق من سيناريوهات الخطأ المختلفة في الاستجابة ، مثل رموز الحالة غير الصالحة أو الحقول المفقودة أو رسائل الخطأ غير المتوقعة.
ضع في اعتبارك طلب API التالي:
GET /api/v1/resource/{{resourceId}}
Authorization: Bearer {{accessToken}}
فيما يلي مجموعة اختبار مع معالجة خطأ غير كافية:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Response contains 'data' field", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.have.property("data");
});
الآن ، دعنا نحسن معالجة الأخطاء عن طريق إضافة اختبارات لسيناريوهات الخطأ المختلفة:
// Test for expected status code
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// Test for unexpected status codes
const errorStatusCodes = [400, 401, 403, 404, 500];
errorStatusCodes.forEach(function (statusCode) {
pm.test(`Status code is not ${statusCode}`, function () {
pm.response.to.not.have.status(statusCode);
});
});
// Test for the existence of a 'data' field in the response
pm.test("Response contains 'data' field", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.have.property("data");
});
// Test for common error fields in the response
pm.test("Response does not contain 'error' or 'message' fields", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.not.have.property("error");
pm.expect(jsonData).to.not.have.property("message");
});
9. الخلاصة
خلال هذه المقالة ، قمنا بتغطية المفاهيم والميزات الأساسية في Postman ، مثل العمل مع المتغيرات ، وكتابة التأكيدات ، واستخدام Postman Sandbox ، وإنشاء مهام سير العمل. لقد قدمنا أيضًا أمثلة ومقتطفات من التعليمات البرمجية لمساعدتك على فهم أفضل لكيفية استخدام Postman بفعالية.
لمواصلة التعلم وتحسين مهاراتك في اختبار وتطوير API ، ضع في اعتبارك استكشاف الموارد والمراجع التالية:
- الوثائق الرسمية لساعي البريد
- منتدى مجتمع ساعي البريد
- قناة يوتيوب ساعي البريد للدروس
- دورات ساعي البريد في Udemy
بالإضافة إلى ذلك ، يمكنك التدرب عن طريق الاختبار والعمل مع واجهات برمجة التطبيقات العامة ، مثل:
أخيرًا ، لا تنسَ مواكبة آخر التحديثات والميزات في Postman من خلال متابعة مدونتهم وحساباتهم على وسائل التواصل الاجتماعي:
نأمل أن يكون هذا الدليل مفيدًا وجذابًا. استمر في استكشاف ساعي البريد وممارسة مهاراتك في اختبار API لتصبح خبيرًا. نتمنى لكم اختبارًا سعيدًا ، ولا تنسوا الانضمام إلى قائمتنا البريدية.