جیمز مسینجر یکی از مهندسان Postman است که تجربیات خود در تعامل با کاربرانی که از Postman برای تست API خود استفاده میکنند را به اشتراک گذاشته است. در ادامه نگاهی به تجربیات مسینجر و ترفندهای تست API داریم.
تستها را بنویسید
اولین گام در تست API انجام دادن آن است. بدون تستهای خوب داشتن دید مناسب نسبت به رفتار، ثبات و ویژگیهای API غیر ممکن است. انجام تستها همزمان با رشد کد اصلی باعث صرفهجویی در زمان و هزینه شما میشود.
نوشتن تستها در Postman بسیار ساده بوده و از سینتکسهای جاوا اسکریپت استفاده میشود. تست کردن چیزهای سادهای مانند کدهای وضعیت HTTP، زمان پاسخ و هدرها به راحتی و با یک خط کد قابل انجام است.
۱ ۲ ۳ ۴ ۵ |
tests&#۰۹۱;"Status code is 200"] = responseCode.code === 200; tests&#۰۹۱;"Response time is acceptable"] = responseTime < 200; // milliseconds tests&#۰۹۱;"Content-Type header is set"] = postman.getResponseHeader("Content-Type"); |
اما شما میتوانید منطقهای پیچیدهتری مانند پیادهسازی قوانین مختص به کسبوکار، تداوم دادهها به متغیرها یا کنترل پویای گردشکار را برای تایید پاسخها بنویسید.
تستها را با مستندسازی اشتباه نگیرید
بسیاری از افراد از Postman Collections برای مستندسازی APIهای خود از جمله دستهای از درخواستهای نمونه که میتوان بین اعضای تیم به اشتراک گذاشت یا راهنما برای مشتریان استفاده میکنند. در هر دو مورد وجود توضیحات کامل برای هر اندپونیت، راهنماهای گامبهگام، نیازمندیهای احراز هویت و لیستها در کالکشن شما منطقی است.
اما تستهای APIهدف کاملا متفاوتی دارند.
- اول این که مخاطب هدف در تست تفاوت دارد. در مستندسازی مخاطب شما کاربران API بوده و در تست API مخاطب شما توسعهدهندههای آن است.
- دوم این که محتوای هر کداوم تفاوت دارد. یک مجموعه تست شامل سناریوهای غیر محتمل، ورودیهای اشتباه و اطلاعات حساس است که در مستندات API جایی ندارند.
- در نهایت، نویسندههای هر کدام نیز متفاوت است. به طور معمول مستندات (به خصوص مستندات عمومی) توسط تیم بازاریابی و نویسنده فنی نوشته شده و تستها توسط توسعهدهندهها تهیه میشوند.
به همین دلیل بهتر است که کالکشن تستها از کالکشن مستندات جدا باشد. شاید در ابتدا تفاوت چندانی بین این دو نبینید، اما مطمئن باشید که محتوای هر کدام به مرور زمان کاملا متفاوت خواهد بود.
تستها را داخل پوشهها دستهبندی کنید
مرتب کردن تستها همگام با افزایش پیچیدگی API به شما کمک میکند تستها را راحتتر پیدا کنید. از پوشهها برای دستهبندی تستها بر اساس ریسورسها، گردش کار و… بهره ببرید.
بهترین کار این است که یک پوشه رده بالا برای هر ریسورس ایجاد کرده و داخل آنها پوشههای مختلف برای اهداف تستها را قرار دهید. در سطح سوم پوشهها نیز گردش کارها برای تستهای پیچیده که APIهای مختلف را درگیر میکنند، قرار دارند.
اعتبارسنجی الگوی JSON
APIهای امروزی هر کدام از نوعی الگوی JSON برای تعریف ساختار درخواستها و پاسخها استفاده میکنند. Postman یک کتابخانه به اسم tv4 دارد که کار نوشتن تستها برای تایید مطابقت پاسخهای API با تعاریف الگوی JSON شما را سادهتر میکند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ |
// Define the JSON Schema const customerSchema = { "required": &#۰۹۱;"id"], "properties": { "id": { "type": "integer", "minimum": ۱۰۰, "maximum": ۱۰۰۰ }, "name": { "type": "string", "minLength": ۱, "maxLength": ۲۵ } } }; // Test whether the response matches the schema var customer = JSON.parse(responseBody); tests&#۰۹۱;"Customer is valid"] = tv4.validate(customer, customerSchema); |
البته به احتمال زیاد شما دوست ندارید کد الگوی JSON خودتان را داخل اسکریپت تست قرار دهید. بنابراین میتوانید به جای آن الگو را به عنوان یک رشته JSON ذخیره کنید. سپس متغیر را به شکل زیر داخل اسکریپت تست قرار دهید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ |
// Load the JSON Schema const customerSchema = JSON.parse(environment.customerSchema); // Test whether the response matches the schema var customer = JSON.parse(responseBody); tests&#۰۹۱;"Customer is valid"] = tv4.validate(customer, customerSchema); |
دوباره از کد استفاده کنید
در نکته قبل دیدیم که چطور می توان از یک الگوی JSON در درخواستهای مختلف استفاده کرد. شما میتوانید در کد جاوااسکریپت با استفاده از فانکشن ()eval همین کار را انجام دهید. بیشتر APIها یک سری قوانین دارند که برای بیشتر (یا تمام) اندپوینتها وجود دارند. به جای نوشتن تست برای هر درخواست، شما میتوانید تست را برای درخواست اول هر کالکشن بنویسید و سپس آن را در سایر درخواستها استفاده کنید.
به عنوان مثال اولین درخواست به شکل زیر خواهد بود:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ |
// Save common tests in a global variable postman.setGlobalVariable("commonTests", () => { // The Content-Type must be JSON tests&#۰۹۱;"Content-Type header is set"] = postman.getResponseHeader("Content-Type") === "application/json"; // The response time must be less than 500 milliseconds tests&#۰۹۱;"Response time is acceptable"] = responseTime < 500; // The response body must include an "id" property var data = JSON.parse(responseBody); tests&#۰۹۱;"Response has an ID"] = data.id !== undefined; }); |
و سایر درخواستها به شکل زیر:
۱ ۲ ۳ ۴ ۵ ۶ |
// First, run the common tests eval(globals.commonTests)(); // Then run any request-specific tests tests&#۰۹۱;"Status code is 200"] = responseCode.code === 200; |
Postman BDD
با وجود این که یادگیری و استفاده سینتکس تست پیشفرض Postman ساده است، اما بسیاری از افراد ترجیح میدهند از کتابخانههای تست محبوب جاوااسکریپت مانند Mocha و Chai استفاده کنند. Postman BDD به شما اجازه میدهد تستهای Postman را با استفاده از سینتکس BDD در Mocha بنویسید. این ابزار از ترفند استفاده مجدد کد که در نکته قبلی گفتیم برای بارگذاری Chai و Chai-HTTP استفاده میکند. به این ترتیب شما میتوانید تستهایی مانند مثال زیر بنویسید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ |
describe('Get customer info', () => { it('should return a valid response', () => { response.should.have.status(۲۰۰); response.should.be.json; response.body.should.not.be.empty; }); it('should set the Location header', () => { response.should.have.header('Location'); }); it('should match the customer schema', () => { var customerSchema = JSON.parse(environment.customerSchema)); response.body.should.have.schema(customerSchema); }); it('should return the correct customer', () => { response.body.id.should.equal(۱۲۳۴۵); response.body.age.should.be.above(۱۸).and.below(۹۹); response.body.firstName.should.be.a('string').and.not.empty; response.body.lastName.should.be.oneOf(&#۰۹۱;'Smith', 'Jones', 'Robinson']); }); }); |
با کمک collection runner در Postman تستهای خود را اتوماسیون کنید
ما تا به اینجا روی اجرای یک درخواست و تست پاسخ آن تمرکز کردهایم. این رویکرد هنگام نوشتن تستها بسیار کاربردی است، اما بعد از اتمام نوشتن تستها شما به یک راه ساده و سریع برای اجرای تمام آنها و دیدن نتیجه در یک صفحه نیاز دارید. collection runner در Postman برای این منظور طراحی شده است.
با استفاده از Newman تستهای خود را اتوماسیون کنید
هرچند collection runner یک راه عالی برای اجرای تمام تستها است، اما نیاز به اجرای دستی دارد. اما اگر بخواهید تستهای خود را به عنوان بخشی از یکپارچهسازی مستمر یا پایپلاین تحویل مستمر اجرا کنید، باید از Newman بهره ببرید.
Newman به راحتی داخل Jenkins، AppVeyor، Bamboo، CodeShip، Travis CI، Circle CI یا هر ابزار پایپلاین استقرار کد دیگری یکپارچه میشود. همچنین Newman از فرمتهای خروجی مختلف مانند HTML و JSON پشتیبانی میکند.
از ابزار نظارت Postman برای اتوماسیون تستهای خود استفاده کنید
ابزار Postman Monitors به شما اجازه میدهد تستهای Postman خودتان را در بازههای مختلف مانند هر شب یا هر ۵ دقیقه اجرا کند. در صورت بروز خطا در هر تست نیز به شما یک نوتیفیکیشن ارسال شده و میتوانید آن را با ابزارهای ثالث گوناگونی مانند PagerDuty، Slack، Datadog و… یکپارچه کنید.
گردشکارهای تست را به صورت پویا کنترل کنید
ابزارهای collection runner، Newman و Postman Monitors هر درخواست داخل کالکشن شما را به ترتیب اجرا میکنند. اما شما میتوانید از فانکشن ()postman.setNextRequest برای تغیر ترتیب اجرا استفاده کنید. به این ترتیب میتوانید از درخواستها رد شوید، درخواستها را تکرار کنید، کالکشن را متوقف کنید و….
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ |
var customer = JSON.parse(responseBody); if (customer.id === undefined) { // No customer was returned, so don't run the rest of the collection postman.setNextRequest(null); } else { // Save the customer ID to a Postman environment variable postman.setEnvironmentVariable("cust_id", customer.id); // The "Edit Customer" request uses the "cust_id" variable postman.setNextRequest('Edit Customer'); } |