GH GambleHub

Inteqrasiya üçün Mocking və Stubs

1) Niyə yuyucular və qapaqlar lazımdır

Ödəniş provayderləri, KYC xidmətləri, mesaj brokerləri, CRM və s. ilə inteqrasiya testləri yavaş, qeyri-sabit və bahalı edir. Moki/qapaqlar imkan verir:
  • xidmətin məntiqini qeyri-sabit mühitdən təcrid etmək;
  • cavabları və səhvləri müəyyənləşdirmək;
  • nadir sərhəd halları (taymaut, 429/5xx, qeyri-ardıcıllıq);
  • testlər yerli və CI tez və proqnozlaşdırıla bilər.
💡 Prinsip: Test səviyyəsi (Vahid/Komponent) nə qədər aşağı olarsa, bir o qədər çox əvəz edirik; prob-reallığa (Integration/E2E) nə qədər yaxın olarsa, bir o qədər az qapaq.

2) Terminlər və taksonomiya

Stub - qarşılıqlı əlaqəni yoxlamadan sabit cavab verən sadə bir qapaq.
Mock - çağırışları gözləyən və onları yoxlayan obyekt (sıra/miqdar/arqumentlər).
Fake - real davranış ilə sadələşdirilmiş reallaşdırma (məsələn, In-Memory Repository).
Spy - faktiki çağırışları qeyd edən sarğıdır.
Service Virtualization - ssenariləri, vəziyyəti və şəbəkə xüsusiyyətləri ilə «virtual» xarici xidmət.
Record/Replay - real trafikin yazılması və sonrakı oynatma (filtrlər/redaktələrlə).

Nə zaman seçmək lazımdır:
VəziyyətAlət
Təmiz biznes məntiqiFakes (in-memory), unit-mocks
Sadə kasalarla HTTP inteqrasiyasıStubs (WireMock/MockServer/HTTPServer)
Müştərinin provayderlə müqaviləsinin yoxlanılmasıCDC mocks (Pact)
Mürəkkəb ssenarilər/vəziyyətlər/şəbəkə səhvləriService virtualization / Hoverfly / MockServer
Mesajlar (Kafka/RabbitMQ)Testcontainers + schema-aware prodüser/konsumer stubs

3) Sınaq üçün memarlıq nümunələri

Ports & Adapters (Hexagonal): inteqrasiyanı interfeyslər arxasında aparın - asanlıqla fake/mock ilə əvəz edin.
Antikorrupsiya təbəqəsi (ACL): bir modul xarici modeli domen modelinə çevirir - daha az mok nöqtələri.
Contract-aware müştərilər: OpenAPI/Protobuf → daha az əl uyğunsuzluqları generation.
Feature bayraqlar və sandbox rejimləri: stabil provayder üçün təhlükəsiz açarlar/end-point.

4) HTTP: alətlər və nümunələr

4. 1 WireMock (standalone/Java DSL)

JSON-stab:
json
{
"request": { "method": "POST", "urlPath": "/v1/payouts", "headers": { "Idempotency-Key": { "matches": ".+" } } },
"response": {
"status": 201,
"headers": { "Content-Type": "application/json" },
"jsonBody": { "id": "po_123", "status": "queued" },
"fixedDelayMilliseconds": 80
}
}
Java DSL (bədən yoxlama və varyasyonları ilə):
java stubFor(post(urlEqualTo("/v1/payouts"))
.withHeader("Idempotency-Key", matching(".+"))
.withRequestBody(matchingJsonPath("$.amount", equalTo("100. 00")))
.willReturn(aResponse(). withStatus(201). withHeader("Content-Type","application/json")
.withBody("{\"id\":\"po_123\",\"status\":\"queued\"}")));

4. 2 MockServer (dinamika/yoxlama)

json
{
"httpRequest": { "method": "GET", "path": "/v1/wallets/w123" },
"httpResponse": { "statusCode": 200, "headers":[{"name":"Content-Type","values":["application/json"]}],
"body": { "id":"w123","currency":"EUR","balance":0 } }
}

4. 3 Hoverfly (middleware, record/replay)

Provayderin «qum qutusuna» qarşı trafik yazın, PII-ni təmizləyin, fixture kimi düzəldin.
Simulate rejimində 200/4xx/5xx, gecikmələr və «flaky» pəncərələri əlavə edin.

4. 4 Node (Nock) / Python (responses) / Go (`httptest`)

Nock:
js nock('https://psp. example. com')
.post('/v1/payouts'). reply(201, { id:'po_123', status:'queued' })
.post('/v1/payouts'). reply (409, {code: 'duplicate'}) ;//second call - conflict
Go:
go srv:= httptest. NewServer(http. HandlerFunc(func(w http. ResponseWriter, r http. Request){
if r. Header. Get("Idempotency-Key") == "" { w. WriteHeader(400); return }
w. Header(). Set("Content-Type","application/json")
w. WriteHeader(201); w. Write([]byte(`{"id":"po_123","status":"queued"}`))
}))
defer srv. Close()

5) gRPC/Protobuf

5. 1 Stab Generation

'.proto' ilə server yaradın, nəzarət edilən cavablarla metodları həyata keçirin.
Meta məlumatları (headers), statusları ('codes. InvalidArgument`, `codes. DeadlineExceeded`).

Go gRPC fake (fraqment):
go type FakePayouts struct{ pb. UnimplementedPayoutsServer }
func (f FakePayouts) Create(ctx context. Context, in pb. PayoutReq)(pb. PayoutRes,error){
if in. Amount <= 0 { return nil, status. Error(codes. InvalidArgument,"amount>0") }
return &pb. PayoutRes{Id:"po_123", Status:"QUEUED"}, nil
}

5. 2 mənfi üçün grpcurl


grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create

6) Mesajlar və axınlar: Kafka/RabbitMQ

6. 1 Schema-aware moki

Testlərdə Schema Registry və Euro/JSON-Schema/Protobuf-dan istifadə edin.
Producer test: mesaj sxemə uyğun; Consumer-test: köhnə və yeni versiyasını qəbul edir.

6. 2 Testcontainers (məsələn Kafka + Registry)

java
KafkaContainer kafka = new KafkaContainer(DockerImageName. parse("confluentinc/cp-kafka:7. 6. 1"));
kafka. start();
//We publish the event and wait for consumption with deduplication by key

6. 3 Neqativlər

Dublikatlar, qaydanın dəyişdirilməsi, çatdırılma gecikməsi, «zəhərli» mesajlar (dead-letter).
Böyük mesajlar (near-limit), sxemlərin tanınmamış versiyaları.

7) Contract-aware plug

7. 1 Pact (CDC mocks)

Consumer gözləntiləri formalaşdırır → pact faylı → provider stenddə yoxlayır.
Pact stub server müştərinin inteqrasiya testləri üçün gözləntiləri canlandırır.

7. 2 OpenAPI/Protobuf → stabillərin yaradılması

Spesifikasiyadan (o cümlədən Prism, openapi-mock, grpc-mock) mok serverini qaldıran alətlər.
Spesifikasiyaya mənfi nümunələr/kodlar daxil edin: bu da bir müqavilədir.

8) Şəbəkə və xaos: uğursuzluqların simulyasiyası

Gecikmələr və jitter: sabit/paylanmış; müddəti və per-try timeout yoxlayın.
Zaman/fasilələr: half-open bağlantıları, RST, H2 axını reset, 503/Retry-After.
Paket itkiləri/dublikatları: gRPC/axınlar üçün.
Alətlər: Toxiproxy, MockServer (fault injection), xk6-disruptor, CI-də netem.

Toxiproxy (CLI) nümunəsi:

toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100

9) Məlumatlar, sirlər və determinizm

Redact və sintetika: fikstürlərdə PII yoxdur; pul - decimal/ciddi formatlaşdırma.
Vaxt qeyd: fake clock; «dünən/bu gün» - nəzarət edin.
İdempotentlik: eyni 'Idempotency-Key' → eyni cavab.
Generatorlar: şəffaf dəyərlərlə fabrik/məlumat bilderləri (e. g., `test_user_001`).
Fikstürləri (etiketləri) versiya edin, mediasiya olmadan «çıxarılmış» cavabları saxlamayın.

10) CI/CD və mühit

Matris: unit (in-process fakes) → component (lokal virtualizasiya) → integration (minimum moq, Testcontainers).
Artefaktlar: pact faylları, OpenAPI snapshotları, mok serverlərinin qeydləri, düşdükdə PCAP.
Paralellik: unikal portlar/açar prefiksləri; konteynerlərin izolyasiyası.
Gate: müqavilə yaşıl (CDC verify), spesifikasiya validna (lint), neqativlər keçdi.

11) Antipattern

Moki real xidmət qüsurları → saxta inam «kopyalamaq». Müqavilələr və dövri record/verify ilə müalicə olunur.
Hər bir testdə bütün dünyanın «Makromokları» → kövrəklik, əziz meintenans. İnce port və ACL edin.
Moki real inteqrasiyanın lazım olduğu E2E (xüsusilə HMAC/mTLS ilə ödənişlər/vebhuk).
Vaxt/Random/Network Racing üçün Flakes → fake clock, determinated sides istifadə edin.
Fiksturlarda/repozitorlarda sirlər. Sirlər yalnız CI gizli saxlama vasitəsilə.

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

Ödənişlər/nəticələr: moki «Idempotency-Key», «Retry-After», HMAC/mTLS, sanksiya kodları və «uzun» cavabları dəstəkləməlidir.
Bonus məntiq/antifrod: velocity/429 ssenariləri, ATO/challenge, risk-həllər 'allow/deny/challenge' TTL ilə.
KYC/AML: KYC səviyyələrində sandbox cavabları, neqativlər (mismatch, etibarsız sənədlər), anti-replay ('X-Timestamp' pəncərə) ilə vebhukları.
Yurisdiksiyalar/tenantlar: 'X-Tenant/X-Region' məcburi başlıqları, müxtəlif cavab profilləri.

13) Mini reseptlər (şparqalka)

Ödənişin təkrarı: WireMock «Scenarios» - birinci '201', ikinci '409 duplicate'.
Yavaş PSP: MockServer 'responseDelay' + müştəridə per-try timeout yoxlama.
Webhooks: yerli HTTP server + HMAC imza yoxlama; 5 saniyə sonra təkrar dubl yaratmır.
Kafka-dublikatlar: eyni mesajı iki dəfə dərc edin; hendler idempotent olmalıdır.
gRPC-statusları: 'codes' matrix testləri (InvalidArgument, DeadlineExceeded, ResourceExhausted).

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

  • Portlar/adapterlər ayrılır; inteqrasiyalar interfeyslər arxasında gizlədilir.
  • HTTP/gRPC üçün - mənfi olan contract-aware yığınları (Pact/OpenAPI/Proto) var.
  • Brokerlər üçün - Testcontainers + Registry; dublikat testləri/sifariş/böyük mesajlar.
  • Xaos: gecikmələr, vaxtlar, reset, 429/503 'Retry-After'; şəbəkə emulasiya (Toxiproxy/netem).
  • PII olmadan fikstürlər; fake clock; idempotentlik yoxlanılır.
  • CI matrisi: unit → component → integration; log/müqavilə artefaktları saxlanılır.
  • Qum qutusu provayderləri: açarları ayrılmış, end nöqtələri konfiqurasiyalı, runbook var.
  • Record/Replay cədvələ uyğun olaraq yenilənir, tras redaktə olunur.
  • flaky metrikası və nəzarət altında test müddəti; böyümə zamanı alertlər.

15) TL; DR

İnce portlar vasitəsilə inteqrasiyanı təcrid edin və sadə hallar üçün stubs, qarşılıqlı əlaqələri yoxlamaq üçün mocks, real davranış üçün fakes, virtualization service və chaos - şəbəkə və nadir səhvlər üçün düzgün alətdən istifadə edin. Moki müqavilə-şüurlu edin (Pact/OpenAPI/Proto), fikstürləri determinant və PII olmadan saxlayın, gecikmələri/vaxtları/429/5xx simulyasiya edin. CI-də piramida qurun: unit → component → integration; qırmızı müqavilələrdə buraxılışı bloklayın. Ödəniş/KUS yolları üçün HMAC/mTLS, idempotentlik və mənfi ssenariləri nəzərə alın.

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!

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