Testarea API: Poștaș/Newman
1) De ce poștaș/Newman
Poștașul este un IDE la îndemână pentru scripturi și colecții de interogări. Newman este un motor CLI care rulează aceleași colecții fără GUI în CI/CD. Împreună dau:- regresii repetabile și fumuri rapide;
- parametrizarea mediilor/secretelor;
- măsurători de calitate și rapoarte care pot fi citite automat.
2) Modelul de bază
Colectarea - un arbore de interogări și foldere cu scripturi comune.
Medii - setați „{{vars}}” pentru dev/stage/prod (URL, chei).
Script pre-cerere - pregătirea: semnături, token-uri, corelarea datelor.
Teste - afirmații și conservarea variabilelor/artefactelor.
Fișiere de date - CSV/JSON pentru rularea bazată pe date.
Mock/Monitor - efective și controale periodice.
<API v1>
├─ _bootstrap (auth, health, seeds)
├─ Public
├─ Authenticated
│ ├─ Accounts
│ ├─ Payments
│ └─ Reports
└─ _teardown (cleanup)
3) Variabile și secrete
Consultați variabilele ca prefix explicit: „baseUrl',” chiriaș „,” clientId'.
Păstrați secrete (parole, client_secret, chei HMAC) în variabilele de mediu CI, nu se angajeze la depozit.
Utilizați domeniul de aplicare: colectarea → locale → mediu → globale.
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) Autentificare: șabloane
4. 1 OAuth2/OIDC (acreditări clienți)
Cerere prealabilă: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);
});
}
În cerere: „Autorizație: Purtător {{access _ token}}”.
4. 2 HMAC (Webhooks/Parteneri)
Cerere prealabilă: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);
Titluri: 'X-Timestamp: {{ts}}', 'X-Signature: {{dig}}'.
5) Teste: afirmații și corelație
Foloseşte pm. așteptați (...) 'и' pm. test ("...," fn) ".
Păstrați ID-urile pentru pașii următori prin "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) Schema de validare (OpenAPI/JSON Schema)
Stocați schema JSON în variabile de colectare sau într-un fișier separat.
Pentru OpenAPI: utilizați libs gata făcute în pre-cerere/test (ajv, tv4) - via 'pm. Trimite cererea "la fișier brut sau JSON inline.
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) scripturi bazate pe date
CSV:
email, password, currency u1@example. com, P@ss1, EUR u2@example. com, P@ss2, USD
Interogarea folosește '{{email}}', '{{currency}}'.
Lansare:
newman run collection. json -e stage-eu. json -d users. csv
JSON (matrice de obiecte) - convenabil pentru cazuri complexe/structuri.
8) Cazuri negative și reziliență
Coperta:- 401/403 (fără scop/rol nevalid).
- 400/422 (validarea schemei, câmpuri obligatorii, limite).
- 404 (BOLA/resursă extraterestră).
- 409 (conflicte, chei idempotente).
- 429 (limite) - verificați „Retry-After”.
- 5xx - degradare corectă și client retro.
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, pagination
Treceți 'Idempotency-Key' și asigurați-vă că repetarea dă același 'id/status'.
Paginarea testului: „limită/offset ”/„ cursor”, detectarea duplicatelor și a lacunelor.
Simularea retroactivelor într-un script de testare: apeluri consecutive cu aceeași cheie.
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 Lansare
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 Acțiuni GitHub (fragment)
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
Exportați JUnit („--reporter-junit-export”) pentru randare nativă.
În conductă, separați jabs: fum (rapid), regresie (plin), securitate (negativ/limite).
10. 4 Docker
docker run --rm -v $PWD:/etc/newman postman/newman \
run collection. json -e stage-eu. json
11) Moki și monitorizare
Servere Mock Postman - stive rapide pentru front și contracte.
Monitoare - rularea periodică a norilor din nor (latență, 5xx, SSL).
În depozit, păstrați fișierele de răspuns eșantion pentru mocs deterministe.
12) Date de testare și curățare
Creați/ștergeți entitățile (_bootstrap/_teardown).
Obiecte de testare a etichetelor cu prefixul 'e2e _' și TTL.
js pm. collectionVariables. set("uniq", Date. now()+"_"+Math. floor(Math. random()1e6));
13) Performanță „pe genunchi”
Poștașul nu este un instrument de încărcare, dar:- measure 'pm. răspuns. Timp de răspuns ";
- rulați 5-10 iterații și fixați p95/praguri;
- performanțe grele - în JMeter/k6/Gatling (în afara acestui articol).
14) Localizare și multi-chirie
Variabile „chiriaș”, „regiune”, „lang”; comutați în medii.
Testele ar trebui să verifice dacă datele nu „curg” între chiriași (BOLA-citit, interdicții de chiriaș încrucișat).
Colecții/foldere separate pentru caracteristici regionale (limite, valute).
15) Raportarea și artefacte
Stoca artefacte CI: rapoarte HTML, "junit. XML, organisme de răspuns.
Conectați notificările Slack/Echipe pentru picăturile de șoc.
16) Calitate și acoperire
Matrice de acoperire:- CRUD per-resursă (200/201/204 + negative).
- Autorizatie: roluri/scopuri/multi-chirias.
- Paginare/filtre/sortare.
- Idemptence și se retrage.
- Limite: 413/414/431/429.
- Formate și scheme (JSON Schema/OpenAPI).
- Integrări (webhooks cu HMAC/mTLS) - anti-reluare.
17) Antipattern
Un „mod fericit” fără teste negative.
Jetoane cu durată lungă de viață în colecție/depozit.
Amestecarea datelor de testare cu datele de producție.
Dependență latentă de ordin de testare fără corelație explicită.
Fișiere de date gigant fără eșantionare.
Nu există rapoarte JUnit/HTML → nici o vizibilitate în CI.
18) Lista de verificare Prod Readiness
- Colecțiile sunt defalcate pe domenii, există '_ bootstrap/_ teardown'.
- Medii pentru dev/etapa/prod; secrete de la CI-secret-stocare.
- Pre-cerere для auth (OAuth2/HMAC); jetoanele sunt cache și rotite.
- Teste: pozitive + negative, scheme (Schema JSON), paginare, 429/Retry-After.
- Idempotency: Check 'Idempotency-Key', dublu apel echivalent.
- CSV/JSON bazate pe date, sufixe aleatorii pentru unicitate.
- Newman în CI: rapoarte JUnit/HTML, artefacte ca ieșiri de construcție.
- Mocks/monitoare pentru rutele cheie; SLA pe smochine.
- Documentarea variabilelor, etichetelor și ordinii de lansare.
19) TL; DR
Stocați logica de testare în colecțiile Postman, parametrii în medii și rulați în CI prin Newman cu rapoarte JUnit/HTML. Acoperă negativele, schemele, idempotența, paginația și limitele. Corelați pașii cu variabilele, utilizați intrări și spălări/monitoare bazate pe date. Secretele - numai de la CI, rapoarte - construi artefacte.