Logo GH

API müqavilə testi

1) Niyə müqavilə testi

Müqavilə müştərinin gözləntilərini və provayderin vədlərini qeyd edir: marşrutlar/metodlar, başlıqlar, cisimlərin sxemləri, statuslar, səhvlərin semantikası və məhdudiyyətlər. Məqsəd inteqrasiyadan əvvəl uyğunsuz dəyişiklikləri tutmaq və versiyaları təhlükəsiz, ağır E2E olmadan buraxmaqdır.

2) Yanaşmalar

Consumer-Driven Contracts (CDC): müştəri gözləntiləri formalaşdırır (Pact və analoqları); provayder mütəmadi olaraq onları yoxlayır.
Spesifikasiya: müqavilə vahid həqiqət mənbəyi kimi (OpenAPI/Protobuf/GraphQL SDL); testlər spesifikasiyaya qarşı həyata keçirilməsini təsdiqləyir.
Hadisə: mesaj sxemləri (Avro/JSON Schema/Protobuf) + broker/reyestr uyğunluq qaydaları.

3) HTTP/REST: spesifikasiya axını

1. Müqavilə: OpenAPI 3. x (sxemlər, nümunələr, kodlar).
2. Lint və statistik analiz: stil, məcburi sahələr, vahid kodlar.
3. Tətbiq validasiya: OpenAPI-yə qarşı test generatoru (schemathesis/Dredd-yanaşma) + əl neqativləri.
4. Snapshotlar: cavab nümunələrini, ETag semantikasını, idempotentlik başlıqlarını qeyd edin.

Mənfi müqavilə nümunəsi (OpenAPI fraqmenti):
yaml paths:
/v1/payments:
post:
responses:
"201": { $ref: "#/components/responses/PaymentCreated" }
"409": { description: Duplicate by Idempotency-Key }
"422": { description: Schema/Business validation failed }

4) CDC (Pact-yanaşma)

Həyat dövrü:

1. Consumer test yazır, pact fayl (gözləntilər) formalaşdırır.

2. Broker nəşr (artefakt).

3. CI Provider xidməti (və ya raf müqaviləsi) qaldırır, pact-ları yoxlayır.

4. Broker can-i-deploy uyğunluq matrisi hesablayır.

Nümunə consumer-test (psevdo-JS):
js pact
.given("wallet exists")
.uponReceiving("get wallet")
.withRequest({ method:"GET", path:"/v1/wallets/w123", headers:{ "Authorization": term({generate:"Bearer x", matcher:/^Bearer\s.+/}) }})
.willRespondWith({
status: 200,
headers: { "Content-Type": "application/json" },
body: like({ id:"w123", currency: "EUR", balance: 0 })
});

5) gRPC/Protobuf müqavilələri

Müqavilə - paketlərin/xidmətlərin versiyası ilə '.proto'.
Uyğunluq: etiketləri yenidən istifadə etməyin, yalnız optional ilə yenisini əlavə edin, istifadə olunan sahələri silməyin; nömrələri sifariş.
Testlər: server/müştəri stabinin generasiyası, avtomatik yaradılan halların icarəsi + neqativlər (unknown fields, size-limits).

6) Hadisə müqavilələri (Kafka/NATS/...)

Схемы: Avro/JSON Schema/Protobuf в Schema Registry.
Uyğunluq siyasəti: 'BACKWARD' (çox vaxt kifayətdir) və ya 'FULL'.
Prodüser testləri: sxemə qarşı mesajı təsdiqləyir; konsumer testləri: köhnə və yeni versiyasını qəbul edir.
İnvariantlar: idempotentlik açarları, ardıcıllıq/təkrarlanabilirlik, deduplikasiya semantikası.

Avro sxeminin nümunəsi (fraqment):
json
{"type":"record","name":"PayoutCreated","fields":[
{"name":"payoutId","type":"string"},
{"name":"amount","type":"double"},
{"name":"currency","type":{"type":"string","logicalType":"iso-4217"}}
]}

7) Uyğunluq və versiyası

Backward-compatible (tövsiyə olunan minimum): Əlavə sahələr əlavə edin, mövcud sahələri sındırmayın.
Forward-compatible: istehlakçılar naməlum sahələrə məhəl qoymur.
Full: hər ikisi.
Versiyası: 'path (/v1)', 'Accept: application/vnd. brand. v2+json`, `proto package v2`.
Deprecation-siyasət: çıxış pəncərəsi (məsələn, 90 gün), xəbərdarlıq başlıqları/hadisələr.

8) Mənfi və səhvlər də müqavilədir

Kodları standartlaşdırın: 400/401/403/404/409/422/429/5xx, məcburi 'code', 'message', 'trace _ id'.
Ölçülər/limitlər - müqavilənin bir hissəsi (413/414/431).
İdempotentlik: təkrarlanan davranış (409 vs 201 same id).
Başlıqlar: 429/503-də 'Retry-After', 'Idempotency-Key', 'Content-Language' və s.

Səhv şablonu:
json
{ "code":"validation_error", "message":"amount must be ≥ 1", "trace_id":"..." }

9) Məlumatlar müqavilə ilə idarə olunur

Nümunələr/soyunma cavabları (examples) - canlı, CI-də təsdiqlənir.
CDC üçün fiksturlar - minimal, determinant.
Data Generation - ədədlər/tarixlər üçün property-based; lakin snapshot sabitliyini pozmayın.

10) CI/CD-də Paypline (istinad)

1. Lint/validate: OpenAPI/Proto/Avro (`validate`, style-линер).
2. Publish: artefakt kimi müqavilə (broker/reyestr).
3. Verify: provayder CDC paketlərini/spesifikasiya testlərini qaçırır.
4. can-i-deploy gate: yaşıl matrissiz buraxılış qadağandır.
5. Diff: dəyişikliklərin uyğun olduğunu yoxlamaq (semantic diff).
6. Report: JUnit/HTML, pozuntuların/definitsiyaların siyahısı.

Psevdo-matris:
yaml jobs:
lint:...
publish-contract: needs: [lint]
verify-provider: needs: [publish-contract]
can-i-deploy:
if: always()
steps: [run: pact-broker can-i-deploy...]

11) Alətlər (tapşırıq siniflərinə görə)

Lint/validatorlar: openapi-linters, protobuf-lint, avro-tools.
CDC: Pact-ailə/broker, Spring Cloud Contract, Hoverfly (HTTP qeydləri/replay).
Spesifikasiya rannerləri: schemathesis/Dredd oxşar yanaşma, Postman test + JSON Schema.
Diff: semantic-diff OpenAPI/Proto/Avro (breaking-dəyişikliklər aşkar).
Konteynerlər: Provayder/Rack müqavilələri qaldırmaq üçün Testcontainers.

12) Antipattern

«Xüsusi dok» koddan ayrı → rasinxronizasiya. Müqaviləni xidmətin yanında saxlayın.
Müqavilə əvəzinə üçüncü tərəf xidmət moki → yeniləmələrdə kövrəklik.
Təsadüfi cavablar/→ fleyka sxeminə bağlanmadan generasiya.
Versiyasız sahələrin növlərini/məcburiyyətini dəyişdirin.
Silent-uzantıları bildiriş/depreqasiya olmadan.
Mənfi müqavilələrin və səhv kodlarının olmaması.

13) iGaming/Maliyyə Xüsusiyyətləri

Pul sahələrini rəsmiləşdirin: 'amount' - ölçülü decimal, valyuta - ISO-4217, məbləğlərin invariantları.
Ödəniş/vebhuk müqavilələri: HMAC/mTLS, anti-replay ('X-Timestamp' pəncərə), idempotentlik, 'Retry-After'.
Regionallıq/tenantlar: məcburi başlıqlar 'X-Tenant/X-Region', mesajların lokallaşdırılması.
Hadisələr: dəyişməz jurnallar (audit), deduplikasiya açarları, çatdırılma zəmanətləri (at least once + idempotent hendlerlər).

14) Testlərin «skelet» nümunələri

14. 1 Schemathesis-stil (psevdo)

bash schemathesis run openapi. yaml --checks all --hypothesis-deadline=200

14. 2 Postman spesifikasiya ranner kimi

js pm. test ("Scheme/v1/wallets/{ id} is valid," () => {
const schema = pm. collectionVariables. get("wallet_get_schema");
pm. expect(ajv. validate(JSON. parse(schema), pm. response. json())). to. be. true;
});

14. 3 CDC Provider-yoxlama (psevdo)

bash pact-broker can-i-deploy --pacticipant wallets --version $SHA --to-environment staging

15) Prod hazırlıq yoxlama siyahısı

  • Resepsiyondakı müqavilələr, CI əsərləri təsdiqləyir və dərc edir.
  • CDC kritik inteqrasiya üçün daxil; broker/matrix «can-i-deploy» işləyir.
  • Uyğunluq siyasəti (HTTP/gRPC/Events) sənədləşdirilmişdir; avtomatik semantic-diff.
  • Mənfi müqavilələr: səhvlər, ölçü limitləri, idempotentlik, 'Retry-After'.
  • Test-data determined; nümunələrin snapshot dəstəklənir.
  • Version və deprecation: vaxt, bildirişlər, başlıqlar.
  • Hadisələr üçün - Schema Registry və uyğunluq rejimi; prodüser/konsumer hər iki versiyanı sınaqdan keçirir.
  • Artefaktlar: JUnit/HTML, diff/verify hesabatları, uyğunluq matrisi.
  • Hadisə proseduru: sürətli rollback müqaviləsi/Ficha bayrağı, inteqratorlara bildiriş.

16) TL; DR

Müqavilələrdə gözləntiləri qeyd edin və onları avtomatik olaraq qaçırın: müştəri gözləntiləri üçün CDC, həyata keçirilməsi üçün spesifikasiya testləri, hadisələr üçün sxemlərin reyestri. Ciddi uyğunluq siyasəti və mənfi müqavilələr (səhvlər, limitlər, idempotentlik) saxlayın. Yaşıl can-i-deploy matrisi və semantic-diff olmadan breaking-dəyişikliklər olmadan buraxıla bilməz.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.