GH GambleHub

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.
💡 Prinsip: synag derejesi (Unit/Component) näçe pes bolsa, şonça-da köp çalyşýarys; proto-hakykata (Integration/E2E) näçe ýakyn bolsa, şonça-da az dyknyşyk bolýar.

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

Haçan näme saýlamaly:
ÝagdaýGural
Arassa iş logikasyFakes (in-memory), unit-mocks
Ýönekeý hadysalar bilen HTTP integrasiýasyStubs (WireMock/MockServer/HTTPServer)
Müşderiniň üpjün ediji bilen baglaşan şertnamasyny barlamakCDC mocks (Pact)
Çylşyrymly ssenariler/ýagdaýlar/ulgam ýalňyşlyklaryService virtualization / Hoverfly / MockServer
Habarlar (Kafka/RabbitMQ)Testcontainers + schema-aware prodýuser/konsumer stubs

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 gRPC fake (bölek):
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) mysaly:

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

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.