API թեստավորում: Postman/Newman
1) Ինչու՞ Postman/Newman
POSTMAN-ը հարմար IDE-ն է դիմումների և հավաքածուների համար։ Newman-ը CLI շարժիչն է, որը սկսում է նույն հավաքածուները առանց GUI-ի CI/CD-ում։ Միասին նրանք տալիս են
կրկնվող ռեգրեսիաներ և արագ սկուտերներ;
շրջակա միջավայրի/գաղտնիքների բևեռացումը;
որակի նշաններ և մեքենայական ընթերցումներ։
2) Ռուսական մոդելը
Հավաքածուը հարցումների ծառն է և համագործակցում է ռուսական ջութակների հետ։
Շրջապատը "+ + vars++ + -ի հավաքածու է dev/stage/2019 համար (URL, բանալիներ)։
Pre-request script-ը 'ստորագրություններ, հոսանքներ, տվյալների կորլացիա։
Tesault-ը փոփոխականների/արտեֆակտների հայտարարությունն ու պահպանումն է։
Express-Express-ը CSV/JSON-ն է 71-driven-ի համար։
Mock/Monitor - ալյումինե և պարբերական ստուգումներ։
Հավաքածուի կառուցվածքը (առաջարկություն)
<API v1>
├─ _bootstrap (auth, health, seeds)
├─ Public
├─ Authenticated
│ ├─ Accounts
│ ├─ Payments
│ └─ Reports
└─ _teardown (cleanup)
3) Մոսկվան և գաղտնիքները
Անվանեք պարզ նախածանց '«box Url», «tenae», «clientId»։
Գաղտնիքները (գաղտնաբառեր, client _ secret, HMAC-բանալիներ) պահեք CI-ի փոփոխականների մեջ, մի զեկուցեք ռեպոզորիայի մեջ։
Օգտագործեք սկոուպը 'wwww.al collection.envi.ru (նվազագույն հնարավոր)։
Շրջապատման օրինակ (fragram JSON)
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 (Client Credentials)
Pre-request: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);
});
}
Հարցման մեջ '"Authorization: Bearer++ + + բանաձևը _ token++ +։
4. 2 HMAC (webhuks/գործընկերներ)
Pre-request: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: կոդ "։
5) Թեստեր ՝ հայտարարություններ և կորլացիա
Օգտագործեք 'pm։ expect(...)` и `pm. test("...", fn)`.
Պահպանեք ցուցիչները հաջորդ քայլերի համար '«pm»։ collectionVariables. set`.
Օրինակներ
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 Schema)
Պահպանեք JSON Schema-ը փոփոխական հավաքածուներում կամ առանձին հավաքածուներում։
OpenAPI-ի համար օգտագործեք պատրաստի լիբներ pre-request/test (ajv, tv4) - «pm» միջոցով։ sendRequest-ը rault ֆայլի վրա կամ inline 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) System-driven սցենարները
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 (առանց տոկենի/սխալ scope/դեր)։
400/422 (սխեմայի վալիդացիա, պարտադիր դաշտեր, սահմաններ)։
404 (BOLA/օտար ռեսուրս)։
407 (հակամարտություններ, գաղափարական բանալիներ)։
429 (լիմիտներ) - ստուգեք «Retry-After»։
5xx - ճիշտ դեգրադացիա և հաճախորդի վերափոխում։
«Retry-After» ստուգման օրինակ
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) Idempotenty, retrai, pagination
Փոխանցեք «Idempotency-Key» և համոզվեք, որ խոհարարը տալիս է նույն «id/status» -ը։
Փորձարկեք պագինացիան '"limit/www.set '/" cursor", կրկնօրինակների և բացթողումների։
Test-ջութակի ռեակտորների իմիտացիան նույն բանալին է։
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 Actions (հատված)
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 Jenkins/GitLab CI
Էքսպորտացրեք JUnit («-reporter-junit-export») national տեսողության համար։
Դելֆինայում բաժանեք ջոբները 'smoke (արագ), regression (ամբողջական), regression (բացասական/սահմաններ)։
10. 4 Docker
docker run --rm -v $PWD:/etc/newman postman/newman \
run collection. json -e stage-eu. json
11) Մոկի և Եվգենիա
Mock servers Postman-ը արագ ֆորումներ է առջևի և ռուսական համար։
Monitors-ը ամպերի (latency, 5xx, SSL) սոխերի պարբերական պրոթոն է։
Պահեք դետերմինացված մոծակների համար պատասխանների օրինակներ։
12) Թեստային տվյալները և մաքրումը
Ստեղծեք/հեռացրեք էությունը (_ bootstrap/_ teardown)։
Տեղադրեք թեստային օբյեկտները «e2e _» և TTL-ի նախածանցով։
Հակամարտական դաշտերի համար օգտագործեք պատահական վերջածանցներ
js pm. collectionVariables. set("uniq", Date. now()+"_"+Math. floor(Math. random()1e6));
13) «Ծնկի վրա» արտադրողականությունը
Postman-ը բեռի գործիք չէ, բայց
չափեք 'pm։ response. responseTime`;
թողեք 5-10 iteration և գրանցեք r95/press;
ծանր պերֆորանսային պրոգոնները 'JMeter/k6/Gatling (այս հոդվածի սահմաններից դուրս)։
14) Տեղայնացումը և բազմապատկումը
Windows ', «region», «lang»; անջատեք ձեր շրջապատը։
Թեստերը պետք է ստուգեն, որ տվյալները չեն հոսում տենանտների միջև (BOLA-read, cross-tenae արգելքներ)։
Առանձին հավաքածուներ/թղթապանակներ տարածաշրջանային հատկությունների վրա (լիմիտներ, արժույթներ)։
15) Հաշվետվություններ և արտեֆակտներ
Պահեք CI արտեֆակտները 'HTML լրագրողներ,' junit։ Xl ', անհաջող պատասխանների լոգներ (response bodies)։
Միացրեք Slack/Teams ծանուցումները մթության անկման մասին։
16) Որակը և ծածկույթը
Ծածկույթի մատրիցը
CRUD per ռեսուրսը (200/201/204 + բացասական)։
Հեղինակային իրավունքը 'դերեր/սկուտերներ/մուլտֆիլմ-տենանտ։
Պագինացիա/ֆիլտրեր/տեսակավորում։
Idempotenty և retray.
Լիմիտներ ՝ 413/414/431/429։
Ստանդարտ և սխեմաներ (JSON Schema/OpenAPI)։
Express (webhuks HMAC/mTSA) - anti-replay։
17) Անտիպատերնի
Մեկ «երջանիկ ճանապարհ» առանց բացասական թեստերի։
Երկար գոյատևող հոսանքները հավաքածուի/ավանդության մեջ։
Թեստային տվյալների խառնուրդը պրոդ տվյալների հետ։
Թաքնված կախվածությունը թեստերի կարգին առանց ակնհայտ կորստի։
Հսկա կոմպոզիցիաներ առանց սերմերի։
JUnit/HTML փաթեթների բացակայությունը չի երևում CI-ում։
18) Չեկ-թուղթ պատրաստակամության համար
- Հավաքածուները բաժանված են օրինագծերով, կա «_ bootstrap/_ teardown»։
- Շրջապատեր dev/stage/2019; գաղտնիքները CI գաղտնիք-2019-ից։
- Pre-request для auth (OAuth2/HMAC); պտտվում և պտտվում են։
- Թեստեր ՝ + բացասական, սխեմաներ (JSON Schema), պագինացիա, 429/Retry-After։
- Idempotenty: Idempotency-Key "ստուգումը, կրկնակի զանգը համարժեք է։
- System-driven CSV/JSON, պատահական վերջածանցներ եզակի համար։
- Newman CI: JUnit/HTML հաշվետվությունները, արտեֆակտները որպես build puts։
- Մոկի/մոնիտորներ հիմնական երթուղիների համար; SLA-ն սայթաքում է։
- Փոփոխություններ, թեստեր և գործարկման կարգեր։
19) TL; DR
Պահպանեք թեստերի տրամաբանությունը Postman հավաքածուներում, պարամետրերը շրջապատված են, իսկ grogone անում եք CI-ում Newman-ի միջոցով JUnit/HTML զեկույցներով։ Ծածկեք բացասական, սխեմաներ, գաղափարախոսություն, պագինացիա և սահմանաչափեր։ Փոխկապակցեք քայլերը փոփոխական, օգտագործեք ստանդարտ-driven մուտքեր և կամուրջներ/մոնիտորներ։ Գաղտնիքները միայն CI-ից են, հաշվետվությունները տոմսի արտեֆակտներ են։