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