Integrasiýa üçin mocking we stubs
1) Näme üçin çukurlar we tüpeňler gerek?
Töleg üpjün edijileri, KYC-hyzmatlar, habar dellallary, CRM we ş.m. bilen integrasiýa synaglary haýal, durnuksyz we gymmat edýär. Moki/tüpeňler:- hyzmatyň logikasyny durnuksyz gurşawdan izolirlemek;
- jogaplary we ýalňyşlyklary kesgitlemek;
- seýrek serhet ýagdaýlaryny (wagt, 429/5xx, yzygiderlilik) köpeltmek;
- testleri ýerli we CI-de çalt we öňünden aýdyp boljak görnüşde başlamak.
2) Adalgalar we taksonomiýa
Stub - özara täsirleri barlamazdan, kesgitlenen jogap bilen ýönekeý gysgyç.
Mock - kynçylyklara garaşýan we olary barlaýan obýekt (tertibi/sany/argumentleri).
Fake - hakyky özüni alyp barşy bilen ýönekeýleşdirilen amal (mysal üçin, In-Memory repozitoriýasy).
Spy - hakyky kynçylyklary ýazga alýan örtük.
Service Wirtualization - ssenarileri, ýagdaýy we tor aýratynlyklary bolan "wirtual" daşarky hyzmat.
Record/Replay - hakyky traffigi ýazmak we soňraky oýnamak (süzgüçler/redaksiýa bilen).
3) Synag üçin binagärlik nusgalary
Ports & Adapters (Hexagonal): integrasiýany interfeýslerden çykaryň - fake/mock bilen çalyşmak aňsat.
Korrupsiýa garşy gatlak (ACL): bir modul daşarky modeli domene geçirýär - mok nokatlaryndan az.
Contract-aware müşderileri: OpenAPI/Protobuf → az el bilen gabat gelmeýär.
Feature-baýdaklar we sandbox-re modeimleri: ygtybarly açarlar/stabil üpjün ediji üçin endpointler.
4) HTTP: gurallar we mysallar
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 (beden barlagy we üýtgemeleri bilen):
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/tassyklama)
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)
Üpjün edijiniň "sandyk gutusyna" garşy traffigi ýazyň, PII-ni arassalaň, fixture hökmünde ýazyň.
Simulate re modeiminde 200/4xx/5xx, gijikdirmeler we "flaky" penjireleri goşuň.
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 Durnukly nesil
'.proto' serwerini dörediň, gözegçilik edilýän jogaplar bilen usullary durmuşa geçiriň.
Meta-maglumatlary (headers), statuslary ('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. Negatiwler üçin 2 grpcurl
grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create
6) Habarlar we akymlar: Kafka/RabbitMQ
6. 1 Schema-aware moki
"Schema Registry" -ni ulanyň we synaglarda "Euro/JSON-Schema/Protobuf" -y tassyklaň.
Producer-test: habar shemasyna laýyk gelýär; Ulanyjy synagy: Köne we täze wersiýalary kabul edýär.
6. 2 Testcontainers (mysal 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 Negatiwler
Dublikatlar, tertibi üýtgetmek, eltip bermegiň gijikdirilmegi, "zäherli" habarlar (dead-letter).
Uly habarlar (near-limit), shemalaryň näbelli wersiýalary.
7) Contract-aware tüpeňleri
7. 1 Pact (CDC mocks)
Consumer garaşýanlary emele getirýär → pact-faýl → provider stendde barlaýar.
Pact stub server müşderiniň integrasiýa synaglary üçin garaşylýanlary gaýtalaýar.
7. 2 OpenAPI/Protobuf → stabilleri döretmek
Aýratynlyklardan (Prism, openapi-mock, grpc-mock ýaly) mok serwerini galdyrýan gurallar.
Aýratynlyga negatiw mysallary/kodlary goşuň: bu hem şertnama.
8) Tor we bulam-bujarlyk: şowsuzlyklaryň simulýasiýasy
Gijikdirmeler we jitler: kesgitlenen/paýlanan; Möhletleri we per-try timeout.
Wagtlar/arakesmeler: half-açyk baglanyşyklar, RST, H2, 503/Retry-After akymynyň täzeden başlamagy.
Paket ýitgileri/dublikatlar: gRPC/akymlar üçin.
Gurallar: Toxiproxy, MockServer (fault injection), xk6-disruptor, CI-de netem.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) Maglumatlar, syrlar we determinizm
Redact we sintetika: fiksturalarda PII ýok; pul - decimal/berk formatlamak.
Wagt belligi: fake clock; "düýn/şu gün" - gözegçilik ediň.
Idempotentlik: şol bir 'Idempotency-Key' → şol bir jogap.
Generatorlar: aç-açan manyly zawodlar/maglumat bilderleri (e. g., `test_user_001`).
Fiksturalary (bellikleri) wersiýa ediň, "aýrylan" jogaplary araçylyksyz saklamaň.
10) CI/CD we gurşaw
Matrisa: unit (in-process fakes) → component (lokal wirtualizasiýa) → integration (minimum mokow, Testcontainers).
Artefaktlar: pact faýllary, OpenAPI snapshotlar, mok serwerleriniň ýazgylary, PCAP ýykylanda.
Meňzeşlik: özboluşly portlar/açar prefiksleri; konteýnerleriň izolýasiýasy.
Gate: Şertnama ýaşyl (CDC verify), kesgitleme walidna (lint), negatiwler geçdi.
11) Antipatternler
Moki hakyky hyzmatyň kemçiliklerini "göçürýär" → ýalan ynam. Şertnamalar we döwürleýin record/verify bilen bejerilýär.
Her synagda bütin dünýäniň "Makromoklary" → gowşaklyk, gymmat maintenans. Inçe portlary we ACL-leri ediň.
Moki hakyky integrasiýa zerur bolan E2E (esasanam HMAC/mTLS-den tölegler/webhuklar).
Wagt/random/tor ýaryşlary sebäpli fleýkler → fake clock, kesgitlenen sidleri ulanyň.
Fiksturalardaky/repozitoriýadaky syrlar. Syrlar - diňe CI gizlin ammar arkaly.
12) iGaming/Maliýe aýratynlyklary
Tölegler/netijeler: moki 'Idempotency-Key', 'Retry-After', HMAC/mTLS, sanksiýa kodlary we "uzyn" jogaplary goldamaly.
Bonus-logika/antifrod: ssenariýalar velocity/429, ATO/challenge, töwekgelçilik-çözgütler 'allow/deny/challenge' c TTL.
KYC/AML: KYC derejeleri boýunça sandbox jogaplary, negatiwler (mismatch, nädogry resminamalar), anti-replay webhukki ('X-Timestamp' penjiresi).
Ýurisdiksiýalar/tenantlar: hökmany sözbaşylar 'X-Tenant/X-Region', dürli jogap profilleri.
13) Kiçi reseptler (şpargalka)
Tölegiň gaýtalanmagy: WireMock "Scenarios" - birinjisi '201', ikinjisi '409 duplicate'.
Haýal PSP: MockServer 'responseDelay' + müşderide per-try timeout barlagy.
Webhooks: ýerli HTTP serweri + HMAC goluny barlamak; 5 sekuntdan soň gaýtalamak goşa döretmeýär.
Kafka-dublikatlar: şol bir habary iki gezek çap ediň; hendler idempotent bolmaga borçludyr.
gRPC-ýagdaýlary: 'codes' (InvalidArgument, DeadlineExceeded, ResourceExhausted).
14) Prod-taýynlyk çek-sanawy
- Portlar/adapterler saýlandy; integrasiýalar interfeýsleriň aňyrsynda gizlenýär.
- HTTP/gRPC üçin - negatiwleri bolan contract-aware bloklary (Pact/OpenAPI/Proto) bar.
- Dellallar üçin - Testcontainers + Registry; dublikat/tertip/uly habar synaglary.
- Bulam-bujarlyk: gijikdirmeler, wagtlar, gaýtadan işlemek, 429/503 s 'Retry-After'; tor emulirlenýär (Toxiproxy/netem).
- PII-siz fikstura; fake clock; idempotentlik barlanýar.
- CI matrisi: unit → component → integration; log/kontrakt artefaktlary saklanylýar.
- Üpjün edijileriň sandyk gutulary: açarlar aýryldy, endpointler konfigurasiýa edildi, runbook bar.
- Record/Replay meýilnama boýunça täzelenýär, ýollar redaktirlenýär.
- Flaky metrikleri we synaglaryň dowamlylygy gözegçilik astynda; ulalanda alertler.
15) TL; DR
Inçe portlar arkaly integrasiýalary izolirläň we ýönekeý ýagdaýlar üçin stubs, özara täsirleri barlamak üçin mocks, hakyky hereket üçin fakes, wirtualizasiýa hyzmaty we tor we seýrek ýalňyşlyklar üçin chaos meselesine dogry guraly ulanyň. Mok şertnamasyny aňly ediň (Pact/OpenAPI/Proto), fiksturalary kesgitlenen we PII-siz saklaň, gijikdirmeleri/wagtlary simulýasiýa ediň/429/5xx. CI-de piramida guruň: unit → component → integration; gyzyl şertnamalarda goýberilmegini blokirläň. Töleg/KUS-ýollar üçin HMAC/mTLS, idempotentlik we negatiw ssenariýalary göz öňünde tutuň.