GH GambleHub

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.

Struktura zbiórki (zalecenie):

<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.

Przykład środowiska (fragment 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) 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 ".

Przykłady:
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.

Przykład pamięci masowej schematu:
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.
Przykład badania „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) 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.

W przypadku pól kolidujących użyj losowych przyrostków:
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.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Telegram
@Gamble_GC
Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.