تست API: پستچی/نیومن
1) چرا پستچی/نیومن
Postman یک IDE مفید برای اسکریپت ها و مجموعه های پرس و جو است. نیومن یک موتور CLI اجرا می شود که مجموعه همان بدون GUI در CI/CD است. با هم می دهند:- رگرسیون های مکرر و سیگار کشیدن سریع ؛
- پارامترسازی محیط/اسرار ؛
- معیارهای کیفیت و گزارش های قابل خواندن ماشین.
2) مدل پایه
Collection - درختی از پرس و جوها و پوشه ها با اسکریپت های مشترک.
محیط ها: {{vars}} را برای dev/stage/prod (URL, keys) تنظیم کنید.
اسکریپت پیش درخواست - آماده سازی: امضاها، نشانه ها، همبستگی داده ها.
تست ها - اظهارات و حفظ متغیرها/مصنوعات.
فایل های داده - CSV/JSON برای اجرای داده ها.
مدل/مانیتور - گله ها و چک های دوره ای.
<API v1>
├─ _bootstrap (auth, health, seeds)
├─ Public
├─ Authenticated
│ ├─ Accounts
│ ├─ Payments
│ └─ Reports
└─ _teardown (cleanup)
3) متغیرها و اسرار
به متغیرها به عنوان پیشوند صریح اشاره کنید: 'baseUrl'، 'tenant'، 'clientId'.
اسرار (رمزهای عبور، client_secret، کلیدهای HMAC) را در متغیرهای محیطی CI نگه دارید، به مخزن متعهد نباشید.
از scope استفاده کنید: local → collection → environment → globals.
json
{
"name": "stage-eu",
"values": [
{"key":"baseUrl","value":"https://api. stage. example. com","type":"text","enabled":true},
{"key":"tenant","value":"eu-1","type":"text","enabled":true}
]
}
4) احراز هویت: قالب
4. 1 OAuth2/OIDC (اعتبار مشتری)
پیش درخواست:js if (!pm.environment. get("access_token") Date. now() > pm. environment. get("token_exp")) {
pm. sendRequest({
url: pm. environment. get("authUrl"),
method: 'POST',
header: {'Content-Type':'application/x-www-form-urlencoded'},
body: { mode:'urlencoded', urlencoded:[
{key:'grant_type',value:'client_credentials'},
{key:'client_id',value:pm. environment. get('clientId')},
{key:'client_secret',value:pm. environment. get('clientSecret')},
{key:'scope',value:'payments:read payments:write'}
]}
}, (err, res) => {
pm. environment. set("access_token", res. json(). access_token);
pm. environment. set("token_exp", Date. now()+ (res. json(). expires_in-30)1000);
});
}
در درخواست: «مجوز: حامل {{access _ token}}».
4. 2 HMAC (وب سایت/همکاران)
پیش درخواست:js const body = pm. request. body? pm. request. body. raw '': '';
const ts = Math. floor(Date. now()/1000);
const msg = `${ts}.${body}`;
const sig = CryptoJS. HmacSHA256(msg, pm. environment. get('hmacSecret')). toString();
pm. variables. set('ts', ts);
pm. variables. set('sig', sig);
عناوین: «X-Timestamp: {{ts}}»، «X-Signature: {{sig}}».
5) تست: اظهارات و همبستگی
استفاده از PM انتظار می رود (...) 'и' PM. تست ("...،" fn) ".
شناسه های ذخیره برای مراحل بعدی از طریق "pm. متغیرهای مجموعه. مجموعه...
js pm. test("HTTP 200", () => pm. response. to. have. status(200));
pm. test ("Scheme is valid," () => {
const schema = pm. collectionVariables. get("schema_wallet");
pm. expect(tv4. validate(pm. response. json(), JSON. parse(schema))). to. be. true;
});
pm. test ("Contains id," () => {
const id = pm. response. json(). id;
pm. expect(id). to. be. a('string');
pm. collectionVariables. set("wallet_id", id);
});
6) اعتبار سنجی طرح (OpenAPI/JSON طرح)
طرح JSON را در متغیرهای مجموعه یا در یک فایل جداگانه ذخیره کنید.
برای OpenAPI: استفاده از لیبهای آماده در pre-request/test (ajv, tv4) - via 'pm. ارسال درخواست به فایل خام یا JSON درون خطی.
js pm. collectionVariables. set("schema_wallet", JSON. stringify({
"type":"object",
"required":["id","currency","balance"],
"properties":{
"id":{"type":"string"},
"currency":{"type":"string","pattern":"^[A-Z]{3}$"},
"balance":{"type":"number","minimum":0}
}
}));
7) اسکریپت های داده محور
CSV:
email, password, currency u1@example. com, P@ss1, EUR u2@example. com, P@ss2, USD
پرس و جو با استفاده از «{{email}}»، «{{currency}}».
راه اندازی:
newman run collection. json -e stage-eu. json -d users. csv
JSON (آرایه ای از اشیاء) - مناسب برای موارد/ساختارهای پیچیده.
8) موارد منفی و مقاومت
پوشش:- 401/403 (بدون توکن/دامنه/نقش نامعتبر).
- 400/422 (اعتبار سنجی طرح، زمینه های اجباری، محدودیت ها).
- 404 (BOLA/منابع بیگانه).
- 409 (درگیری ها، کلید های idempotent).
- 429 (محدودیت) - بررسی کنید «Retry-After».
- 5xx - تخریب صحیح و مشتری یکپارچهسازی با سیستمعامل.
js pm. test ("There is Retry-After at 429," () => {
if (pm. response. code === 429) pm. expect(pm. response. headers. has('Retry-After')). to. be. true;
});
9) idempotence، retrae، صفحه بندی
«Idempotency-Key» را منتقل کنید و مطمئن شوید که تکرار همان شناسه/وضعیت را می دهد.
صفحه بندی تست: 'limit/offset '/' cursor'، تشخیص تکراری و شکاف.
شبیه سازی مجدد در اسکریپت تست: تماس های متوالی با همان کلید.
js pm. test ("Idempotent repetition," () => {
pm. sendRequest(pm. request, (err, res2) => {
pm. expect(res2. code). to. eql(pm. response. code);
pm. expect(res2. json(). id). to. eql(pm. response. json(). id);
});
});
10) نیومن в CI/CD
10. 1 راه اندازی
newman run collection. json \
-e stage-eu. json \
-d data. csv \
--timeout-request 30000 \
--reporters cli,htmlextra,junit \
--reporter-htmlextra-export./reports/report. html \
--reporter-junit-export./reports/junit. xml
10. 2 اقدامات GitHub (قطعه)
yaml
- uses: actions/setup-node@v4 with: { node-version: '20' }
- run: npm i -g newman newman-reporter-htmlextra
- run: newman run collection. json -e stage-eu. json --reporters cli,junit --reporter-junit-export reports/junit. xml
- uses: actions/upload-artifact@v4 with: { name: newman-reports, path: reports }
10. 3 جنکینز/GitLab CI
صادرات JUnit ('--reporter-junit-export') برای رندر بومی.
در خط لوله، جابجایی ها را جدا کنید: دود (سریع)، رگرسیون (کامل)، امنیت (منفی/مرزها).
10. 4 کارگر بارانداز
docker run --rm -v $PWD:/etc/newman postman/newman \
run collection. json -e stage-eu. json
11) Moki و نظارت
سرورهای ساختگی پستچی - پشته سریع برای جلو و قرارداد.
مانیتورها - اجرای دوره ای ابرها از ابر (تاخیر، 5xx، SSL).
در مخزن، فایل های پاسخ نمونه را برای mocs قطعی نگه دارید.
12) داده های تست و تمیز کردن
ایجاد/حذف اشخاص (_bootstrap/_teardown).
اشیاء تست برچسب با پیشوند 'e2e _' و TTL.
js pm. collectionVariables. set("uniq", Date. now()+"_"+Math. floor(Math. random()1e6));
13) عملکرد «بر روی زانو»
پستچی یک ابزار بارگیری نیست، اما:- اندازه گیری PM پاسخ دادن زمان پاسخ ؛
- اجرای 5-10 تکرار و رفع p95/آستانه ؛
- عملکرد سنگین اجرا می شود - در JMeter/k6/Gatling (خارج از این مقاله).
14) محلی سازی و چند اجاره ای
متغیرهای «مستاجر»، «منطقه»، «لنگ» ؛ تغییر در محیط ها
تست ها باید بررسی کنند که داده ها بین مستاجران «جریان» نداشته باشند (BOLA خواندن، ممنوعیت های متقابل مستاجر).
مجموعه ها/پوشه های جداگانه برای ویژگی های منطقه ای (محدودیت ها، ارزها).
15) گزارش و مصنوعات
مصنوعات CI را ذخیره کنید: گزارش های HTML، "junit. xml، بدنه پاسخ
اطلاعیه های Slack/Teams را برای قطره های شوک وصل کنید.
16) کیفیت و پوشش
ماتریس پوشش:- CRUD در هر منبع (200/201/204 + منفی).
- مجوز: نقش/حوزه/چند مستاجر.
- صفحه بندی/فیلترها/مرتب سازی.
- شکست و عقب نشینی
- محدودیت ها: 413/414/431/429
- فرمت ها و طرح ها (JSON Schema/OpenAPI).
- یکپارچگی (webhooks با HMAC/mTLS) - ضد پخش.
17) ضد گلوله
یک «راه شاد» بدون تست منفی.
نشانه های طولانی مدت در مجموعه/مخزن.
مخلوط کردن داده های آزمون با داده های تولید.
وابستگی به دستور تست پنهان بدون همبستگی صریح.
فایل های داده غول پیکر بدون نمونه برداری.
بدون گزارش JUnit/HTML → بدون دید در CI.
18) تولید لیست آمادگی
- مجموعه ها توسط دامنه شکسته می شوند، «_ bootstrap/_ teardown» وجود دارد.
- محیط برای dev/stage/prod ؛ اسرار از CI راز ذخیره سازی.
- پیش درخواست для auth (OAuth2/HMAC) ؛ توکن ها ذخیره و چرخانده می شوند.
- تست: مثبت + منفی، طرح (طرح JSON)، صفحه بندی، 429/Retry-After.
- Idempotency: بررسی 'Idempotency-Key'، معادل دو تماس.
- CSV/JSON داده محور، پسوندهای تصادفی برای منحصر به فرد.
- نیومن در CI: گزارش JUnit/HTML، مصنوعات به عنوان خروجی ساخت.
- Mocks/مانیتور برای مسیرهای کلیدی ؛ SLA در انجیر.
- مستند سازی متغیرها، برچسب ها و سفارش راه اندازی.
19) TL ؛ دکتر متخصص
منطق تست را در مجموعه های Postman، پارامترها در محیط ها ذخیره کنید و در CI از طریق Newman با گزارش های JUnit/HTML اجرا کنید. پوشش منفی، طرح، idempotency، صفحه بندی و محدودیت ها. مراحل مرتبط با متغیرها، استفاده از ورودی های مبتنی بر داده ها و شستشو/مانیتور. اسرار - فقط از CI، گزارش - ساخت مصنوعات.