Testowanie API: Listonosz/Newman
1) Dlaczego listonosz/Newman
Listonosz to przydatny IDE do skryptów i kolekcji zapytań. Newman jest silnikiem CLI, który obsługuje te same kolekcje bez GUI w CI/CD. Razem dają:- powtarzalne regresje i szybkie dymy;
- parametryzacja środowisk/tajemnic;
- mierniki jakości i raporty do odczytu maszynowego.
2) Model podstawowy
Kolekcja - drzewo zapytań i folderów ze wspólnymi skryptami.
Środowiska - ustaw '{{vars}}' dla dev/stage/prod (URL, klucze).
Skrypt wstępny - przygotowanie: podpisy, żetony, korelacja danych.
Badania - twierdzenia i zachowanie zmiennych/artefaktów.
Pliki danych - CSV/JSON do uruchamiania napędzanego danymi.
Mock/Monitor - stada i okresowe kontrole.
<API v1>
├─ _bootstrap (auth, health, seeds)
├─ Public
├─ Authenticated
│ ├─ Accounts
│ ├─ Payments
│ └─ Reports
└─ _teardown (cleanup)
3) Zmienne i tajemnice
Odnosi się do zmiennych jako przedrostek jawny: 'Url',' Lokator ',' ClientId'.
Zachowaj tajemnice (hasła, client_secret, klucze HMAC) w zmiennych środowiskowych CI, nie zobowiązuj się do repozytorium.
Użyj zakresu: lokalne → kolekcja → środowisko → 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) Uwierzytelnianie: szablony
4. 1 OAuth2/OIDC (poświadczenia klienta)
Wniosek wstępny: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);
});
}
We wniosku: „Autoryzacja: Bearer {{access _ token}}”.
4. 2 HMAC (Webhooks/Partners)
Wniosek wstępny: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);
Tytuły: 'X-Timestamp: {{ts}}', 'X-Signature: {{sig}}'.
5) Badania: twierdzenia i korelacja
Użyj 'pm. oczekiwać (...) 'н' pm. test (..., „fn)”.
Przechowywać identyfikatory dla kolejnych kroków przez 'pm. Zmienne. zestaw ".
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) Walidacja schematu (OpenAPI/JSON Schema)
Przechowywać schemat JSON w zmiennych kolekcji lub w oddzielnym pliku.
Dla OpenAPI: użyj gotowych libs w pre-request/test (ajv, tv4) - via 'pm. „Żądanie” do surowego pliku lub 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) Skrypty oparte na danych
CSV:
email, password, currency u1@example. com, P@ss1, EUR u2@example. com, P@ss2, USD
Zapytanie używa '{{email}}', '{{waluta}}'.
Uruchomienie:
newman run collection. json -e stage-eu. json -d users. csv
JSON (tablica obiektów) - wygodne dla złożonych przypadków/struktur.
8) Przypadki negatywne i odporność
Okładka:- 401/403 (brak tokenu/nieprawidłowy zakres/rola).
- 400/422 (walidacja programu, obowiązkowe pola, limity).
- 404 (BOLA/zasoby obce).
- 409 (konflikty, idempotentne klucze).
- 429 (limity) - sprawdź „Retry-After”.
- 5xx - prawidłowa degradacja i klient 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) Idempotencja, odwrót, paginacja
Podaj 'Idempotence-Key' i upewnij się, że powtórzenie daje ten sam 'id/status'.
Paginacja testowa: 'limit/offset '/' cursor', wykrywanie duplikatów i szczelin.
Symulowanie retras w skrypcie testowym: kolejne połączenia z tym samym kluczem.
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 Uruchomienie
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 Działania GitHub (snippet)
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
Eksport JUnit ('--reporter-junit-export') do renderowania rodzimego.
W rurociągu oddzielić jabs: dym (szybki), regresja (pełny), bezpieczeństwo (negatywne/granice).
10. 4 Docker
docker run --rm -v $PWD:/etc/newman postman/newman \
run collection. json -e stage-eu. json
11) Moki i monitorowanie
Mock serwery Listonosz - szybkie stosy do przodu i kontraktów.
Monitory - okresowy przebieg chmur z chmury (opóźnienie, 5xx, SSL).
W repozytorium przechowuj pliki odpowiedzi próbki dla moców deterministycznych.
12) Dane z badań i czyszczenie
Tworzenie/usuwanie podmiotów (_bootstrap/_teardown).
Znakowanie obiektów testowych z prefiksem 'e2e _' i TTL.
js pm. collectionVariables. set("uniq", Date. now()+"_"+Math. floor(Math. random()1e6));
13) Wydajność „na kolanie”
Listonosz nie jest narzędziem ładowania, ale:- pomiar 'pm. odpowiedź. „Czas”;
- przebieg 5-10 iteracji i ustalenie progów p95/;
- ciągi o dużej wydajności - w JMeter/k6/Gatling (poza niniejszym artykułem).
14) Lokalizacja i wielopoziomowość
Zmienne „najemca”, „region”, „lang”; przełączanie w środowisku.
Badania powinny sprawdzać, czy dane nie „przepływają” między najemcami (BOLA-read, zakazy najmu krzyżowego).
Oddzielne zbiory/foldery dla funkcji regionalnych (limity, waluty).
15) Sprawozdawczość i artefakty
Przechowywać artefakty CI: raporty HTML, 'junit. xml', ciała odpowiedzi.
Podłącz powiadomienia Slack/Zespoły dla kropli wstrząsów.
16) Jakość i zasięg
Matryca powłoki:- CRUD na jeden zasób (200/201/204 + negatywy).
- Autoryzacja: role/zakresy/multi-najemca.
- Paginacja/filtry/sortowanie.
- Idempotencja i odwrót.
- Limity: 413/414/431/429.
- Formaty i schematy (JSON Schema/OpenAPI).
- Integracje (webhaki z HMAC/mTLS) - anty-replay.
17) Antypattery
„Szczęśliwy sposób” bez negatywnych testów.
Długotrwałe żetony w kolekcji/repozytorium.
Mieszanie danych testowych z danymi produkcyjnymi.
Ukryta zależność od zlecenia testu bez wyraźnej korelacji.
Gigantyczne pliki danych bez pobierania próbek.
Brak raportów JUnit/HTML → brak widoczności w CI.
18) Lista kontrolna gotowości Prod
- Zbiory są podzielone według domeny, istnieje '_ bootstrap/_ łzawienie'.
- Środowiska dla dev/stage/prod; Sekrety z CI-secret-storage.
- Wstępny wniosek (OAuth2/HMAC); żetony są buforowane i obracane.
- Testy: pozytywne + negatywne, programy (JSON Schema), paginacja, 429/Retry-After.
- Idempotency: Check 'Idempotency-Key', double call equivalent.
- CSV/JSON napędzane danymi, losowe przyrostki dla wyjątkowości.
- Newman in CI: raporty JUnit/HTML, artefakty jako wyjścia budowlane.
- Kpiny/monitory dla głównych tras; SLA na figach.
- Dokumentacja zmiennych, znaczników i zamówienia startowego.
19) TL; DR
Przechowuj logikę testową w zbiorach listonosza, parametry w środowiskach i uruchom w CI przez Newman za pomocą raportów JUnit/HTML. Pokrycie negatywów, schematów, idempotencji, paginacji i ograniczeń. Skoreluj kroki z zmiennymi, używaj wejść i myjek/monitorów napędzanych danymi. Sekrety - tylko z CI, raporty - budować artefakty.