اسکریپت و آزمون نویسی مقدماتی با Postman را در
قسمت دوم بررسی کردیم. در این قسمت نکات و امکانات پیشرفتهتری را در این مورد مرور خواهیم کرد.
بررسی اجزای اولین آزمایش با Postman
آزمونهای Postman، عموما یک سری Assertion هستند؛ به این معنا که در آنها، مقداری از Response دریافتی از سرور را با مقداری مشخص و مورد انتظار، مقایسه میکنیم:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
برای مثال اگر اجرای درخواستی موفقیت آمیز باشد، در بسیاری از موارد status code مساوی 200 از سمت سرور بازگشت داده میشود. بنابراین در آزمونی، مقدار status code دریافتی را با مقدار مورد انتظار 200، مقایسه میکنیم. در کدهای فوق، سطر pm.response، یک Assertion نامیده میشود.
چند نکته:
- آزمونهای Postman، با متد pm.test شروع میشوند. هدف از آن، نوشتن بدنهی یک آزمون متشکل از چندین Assertion است. اولین پارامتر آن، نام رشتهای آزمون است. پارامتر دوم آن، یک callback function است که پس از پایان درخواست جاری، اجرا میشود.
- روش اجرای آزمونها در اینجا non-blocking است. یعنی آزمونهای نوشته شده، به موازات هم اجرا شده و نتایج و حتی خطاهای آنها بر روی یکدیگر تاثیرگذار نیستند.
- برای یک Response و اجزای مختلف آن، میتوان چندین آزمون را نوشت و هر آزمون میتواند چندین Assertion را داشته باشد.
- در Postman، آزمونها تنها پس از پایان اجرای درخواستها، اجرا میشوند.
- به شیء pm.response در اینجا، response assertion API میگویند. توسط آن میتوان به اجزای مختلف response مانند status code، هدرها و یا بدنهی بازگشتی از سمت سرور، دسترسی یافت و برای آنها یک Assertion را نوشت.
لیستی از بررسیهای متداول، در حین نوشتن آزمونهای Postman
تا اینجا روش بررسی status code را در حین نوشتن آزمونهای Postman بررسی کردیم. در جدول زیر، مهمترین حالاتی را که جهت بررسی خروجی یک API میتوان مدنظر داشت، برشمرده شدهاند:
نوع بررسی |
Response assertions |
بررسی مقدار status code دریافتی از سرور با مقدار مورد انتظار | pm.response.to.have.status(200); |
آیا status code دریافتی، معادل یکی از مقادیر مشخص شدهاست؟ | pm.expect(pm.response.code).to.be.oneOf([201,202]); |
آیا status name دریافتی از سرور، معادل عبارت مشخصی است؟ | response.to.have.status("Created"); |
مقایسهی مقدار responseTime با مقدار مورد انتظار | pm.expect(pm.response.responseTime).to.be.below(200); |
آیا هدر تنظیم شدهی توسط response، دارای کلید مورد انتظار است؟ | pm.response.to.have.header("X-Cache"); |
آیا هدر تنظیم شدهی توسط response، دارای کلید و مقدار مشخصی است؟ | pm.response.to.have.header("X-Cache", "HIT"); |
آیا نام یکی از کوکیهای تنظیم شدهی توسط response، معادل مقدار مورد انتظار است؟ | pm.expect(pm.cookies.has("sessionId")).to.be.true; |
آیا نام و مقدار یکی از کوکیهای تنظیم شدهی توسط response، معادل مقادیر مشخصی هستند؟ | pm.expect(pm.cookies.get("sessionId")).to.equal("abcb9s"); |
آیا بدنهی response، دقیقا معادل مقدار مشخص است؟ | pm.response.to.have.body("OK"); |
آیا بدنهی response، حاوی مقدار مشخصی است؟ | pm.expect(pm.response.text()).to.include("Order placed."); |
یک نکته: در رابط کاربری Postman، زمانیکه برگهی Tests را انتخاب میکنیم، کنار آن لیستی از code snippets نیز قرار دارند که با کلیک بر روی آنها، میتوان حالت عمومی اکثر موارد فوق را به صورت خودکار تولید کرد:
روش بررسی اجزای خروجی با فرمت JSON از سرور
فرض کنید API شما یک چنین خروجی JSON ای را بازگشت میدهد:
{
"id": 12,
"name": "DNT",
"isDeleted": false,
"prefs": {
"comments": "members",
"voting": "disabled"
}
}
برای نوشتن آزمونهای Postman مخصوص به آن، میتوان به صورت زیر عمل کرد:
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.name).to.eql("DNT");
pm.expect(jsonData.prefs.voting).to.eql("disabled");
pm.expect(jsonData.isDeleted).to.eql(false);
});
متد ()pm.response.json، بدنهی response را تبدیل به یک شیء جاوا اسکریپتی میکند که پس از آن از طریق دسترسی به خواص و یا کلیدهای آن، میتوان مقادیر هر یک را بررسی کرد. برای مثال jsonData.name به مقدار خاصیت name اشاره میکند و یا jsonData.prefs.voting، روش دسترسی به خاصیت یک شیء تو در تو را بیان کردهاست.
ساماندهی بهتر آزمونهای نوشته شده
البته میتوان تمام Response assertions مدنظر را داخل یک callback function نیز قرار داد، اما بهتر است هر کدام را و یا گروهی از آنها را که به هم مرتبط هستند، توسط یک pm.test جدید تعریف کرد تا بتوان به ساماندهی بهتر رسید و همچنین زمانیکه این آزمونها بررسی میشوند، گزارش بهتری را نیز مشاهده نمود. به همین جهت برای نمونه میتوان آزمایش فوق را به دو آزمایش مجزا تبدیل کرد که در یکی ایجاد مطلب جدید و در دیگری، ویژگیهای آن مطلب بررسی شدهاند:
pm.test("Post should be created", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.name).to.eql("DNT");
pm.expect(jsonData.isDeleted).to.eql(false);
});
pm.test("Post's voting feature should be disabled", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.prefs.voting).to.eql("disabled");
});
ساده سازی و همچنین بهبود کارآیی آزمونهای نوشته شده
چون در اینجا چندینبار از ()var jsonData = pm.response.json داخل هر آزمایش استفاده شدهاست و در عمل یک شیء response نیز بیشتر وجود ندارد، میتوان جهت کاهش این تکرار و بهبود کارآیی آزمونهای نوشته شده، آنرا به صورت یک ثابت، به پیش از تمام آزمایشها منتقل کرد:
const jsonData = pm.response.json();
pm.test("Post should be created", function () {
pm.expect(jsonData.name).to.eql("DNT");
pm.expect(jsonData.isDeleted).to.eql(false);
});
pm.test("Post's voting feature should be disabled", function () {
pm.expect(jsonData.prefs.voting).to.eql("disabled");
});