בדיקת API: Postman/Newman
1) מדוע דוור/ניומן
דוור הוא תעודה מזהה שימושית לתסריטים ואוספי שאילתות. ניומן הוא מנוע CLI שמריץ את אותם אוספים ללא GUI ב CI/CD. יחד הם נותנים:- רגרסיות חוזרות וסיגריות מהירות;
- פרמטריזציה של סביבות/סודות;
- מדדים איכותיים ודיווחים ניתנים לקריאה.
2) מודל בסיס
אוסף - עץ של שאילתות ותיקיות עם תסריטים נפוצים.
סביבות - הגדרת '[vars]' עבור dev/stage/prod (כתובת, מפתחות).
תסריט מראש - הכנה: חתימות, אסימונים, מתאם נתונים.
בדיקות - קביעות ושימור של משתנים/חפצים.
קבצי נתונים - CSV/JSON לריצה מונעת נתונים.
Mock/Monitor - עדר ובדיקות תקופתיות.
<API v1>
├─ _bootstrap (auth, health, seeds)
├─ Public
├─ Authenticated
│ ├─ Accounts
│ ├─ Payments
│ └─ Reports
└─ _teardown (cleanup)
3) משתנים וסודות
התייחס למשתנים כקידומת מפורשת: ”eshurl”, ”terenant',” JId'.
שמור סודות (סיסמאות, client_secret, מפתחות HMAC) במשתני סביבת CI, אל תתחייב למאגר.
השתמש בהיקף: local action collection ac.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);
});
}
בבקשה: ”אישור: Bearer [access _ token]”.
4. 2 HMAC (Webhooks/Partners)
בקשה מראש: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:”, ”X-חתימה: [sig]”.
5) מבחנים: טענות וקורלציה
השתמש 'אחר הצהריים. מצפה (...) 'bullief' pm. מבחן ("...," fn) ".
תעודות זהות של הצעדים הבאים. משתנים. להגדיר '.
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: השתמש בשפתיים מוכנות בבדיקה/בקשה מראש (ajv, tv4) - באמצעות '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
שאילתה משתמשת "[דוא" ל] "," [מטבע] ".
השקה:
newman run collection. json -e stage-eu. json -d users. csv
JSON (מערך אובייקטים) - נוח למקרים/מבנים מורכבים.
8) מקרים שליליים והתאוששות
שער:- 401/403 (לא סמלי/לא תקף היקף/תפקיד).
- 400/422 (אישור התוכנית, שדות חובה, גבולות).
- 404 (בולה/משאב זר).
- 409 (סכסוכים, מפתחות אידיוטים).
- 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) אידמפוטנטיות, retrae, pagination
העבר 'Idempotency-Key' ולוודא כי החזרה נותנת את אותו 'id/status'.
pagination: ”הגבלה/קיזוז ”/” סמן”, זיהוי כפילויות ופערים.
הדמיית מגשים מחדש בתסריט מבחן: שיחות רצופות עם אותו מפתח.
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) Newman 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 ("- reforter-junit-export') לתרגום ילידי.
בצינור, הפרד בין הדקירות: עשן (מהיר), רגרסיה (מלאה), ביטחון (שלילי/גבולות).
10. 4 Docker
docker run --rm -v $PWD:/etc/newman postman/newman \
run collection. json -e stage-eu. json
11) מוקי וניטור
שרתים מדומים דוור - ערימות מהירות לחוזים וחזית.
צגים - ריצה מחזורית של עננים מהענן (latency, 5xx, SSL).
במאגר, שמור קבצי תגובת דגימה למוקים דטרמיניסטיים.
12) בדיקת נתונים וניקוי
צור/מחק ישויות (_bootstrap/_teardown).
אובייקטי בדיקה עם הקידומת e2e _' ו TTL.
js pm. collectionVariables. set("uniq", Date. now()+"_"+Math. floor(Math. random()1e6));
13) ביצוע ”על הברך”
דוור הוא לא כלי טעינה, אבל:- מידה 'אחר הצהריים. תגובה. זמן ";
- ריצת 5-10 חזרות ותיקון p95/סף;
- ריצות ביצועים כבדות - JMeter/k6/Gatling (מחוץ למאמר זה).
14) לוקליזציה וריבוי דירות
משתנים ”דייר”, ”אזור”, ”לאנג”; מתחלפים בסביבות.
על הבדיקות לבדוק כי הנתונים אינם ”זורמים” בין הדיירים (איסורי בולה-קריאה, חוצה דיירים).
אוספים/תיקיות נפרדות עבור מאפיינים אזוריים (גבולות, מטבעות).
15) דיווח וחפצים
חפצי מודיע של החנות, דיווחים של האצ "ל, ג 'וניט. xml', גוף תגובה.
חבר הודעות רפוי/צוותים לטיפות הלם.
16) איכות וכיסוי
מטריצת ציפוי:- CRUD לכל משאב (200/201/204 + שלילי).
- אישור: תפקידים/סקופים/רב-דייר.
- סגידה/מסננים/מיון.
- אימפוטנציה ונופש.
- גבולות: 413/414/431/429.
- תבניות וסכימות (JSON Schema/OpenAPI).
- אינטגרציות (חוברות אינטרנט עם HMAC/mTLS) - אנטי-שידור חוזר.
17) תרופות אנטי ־ פטריות
”דרך שמחה” אחת בלי בדיקות שליליות.
אסימונים ארוכי חיים באוסף/מאגר.
ערבוב נתוני מבחן עם נתוני ייצור.
תלות בסדרי מבחן סמויים ללא קורלציה מפורשת.
קבצי נתונים ענקיים ללא דגימה.
אין דיווח של JUnit/HTML = אין ראות במודיעה.
18) רשימת מוכנות למומחים
[ האוספים ] מפורקים על ידי תחום, יש ”_ bootstrap/_ קורע”.
[ סביבות ] עבור dev/stage/prod; סודות מאחסון סודי של המודיעים.
[ בקשה מוקדמת ] OAuth2/HMAC; אסימונים מסודרים ומסובבים.
[ ] בדיקות: חיובי + שלילי, מזימות (JSON Schema), עבודת אלילים, 429/Retry-After.
[ ] אידמפוטנטיות: בדוק 'Idempotency-Key', מקבילה שיחה כפולה.
[ ] CSV/JSON מונע נתונים, סיומות אקראיות לייחודיות.
[ ] ניומן ב CI: JUnit/HTML מדווח, חפצים כתפוקות לבנות.
[ ] Mocks/Monitors עבור נתיבי מפתח; SLA על תאנים.
[ ] תיעוד של משתנים, תגיות והזמנת שיגור.
19) TL; DR
החנות בוחנת היגיון באוספי דוור, פרמטרים בסביבה, ורצה ב-CI דרך Newman עם דו "חות JUnit/HTML. לכסות תשלילים, תוכניות, אידמפוטנטיות, עבודת אלילים ומגבלות. התאמת צעדים עם משתנים, שימוש בקלט מונע נתונים ושטיפה/צגים. סודות - רק ממודיע, דיווחים - לבנות חפצים.