Integratsiya uchun Mocking va stubs
1) Nima uchun moki va qulflar kerak?
To’lov provayderlari, KYC-servislar, xabar brokerlari, CRM va boshqalar bilan integratsiyalashuv testlarni sekin, beqaror va qimmat qiladi. Moki/zagushki imkonini beradi:- servis mantig’ini beqaror muhitdan ajratish;
- javoblar va xatolarni aniqlash;
- kamdan-kam uchraydigan chegara keyslarini (taymautlar, 429/5xx, nomutanosiblik) takrorlash;
- testlarni lokal va CIda tez va oldindan aytib bo’ladigan tarzda ishga tushirish.
2) Atamalar va taksonomiya
Stub - o’zaro munosabatlarni tekshirmasdan, o’rnatilgan javobga ega bo’lgan oddiy qulf.
Mock - qoʻngʻiroqlarni kutayotgan va ularni tekshiradigan obʼekt (tartib/miqdor/dalillar).
Fake - haqiqiy xulq-atvorli soddalashtirilgan amalga oshirish (masalan, In-Memory repozitoriyasi).
Spy - haqiqiy qoʻngʻiroqlarni yozib oluvchi oʻrov.
Service Virtualization - ssenariy, holat va tarmoq xususiyatlariga ega «virtual» tashqi xizmat.
Record/Replay - haqiqiy trafikni yozib olish va keyinchalik takrorlash (filtrlar/tahrirlar bilan).
3) Test topshirish uchun arxitektura patternlari
Ports & Adapters (Hexagonal): integratsiyani interfeyslardan olib tashlang - uni fake/mock bilan almashtirish oson.
Korrupsiyaga qarshi qatlam (ACL): bitta modul tashqi modelni domenga aylantiradi - mok nuqtalaridan kamroq.
Contract-aware mijozlari: OpenAPI/Protobuf → qo’l nomuvofiqliklari kamroq.
Feature-bayroqlar va sandbox-rejimlar: stab provayder uchun xavfsiz kalitlar/endpointlar.
4) HTTP: asboblar va misollar
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 (tana tekshiruvi va oʻzgarishlar bilan):
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/verifikatsiya)
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)
Provayderning «qum qutisi» ga qarshi trafikni yozib oling, PIIni tozalang, fixture sifatida tuzating.
Simulate rejimida 200/4xx/5xx, kechikishlar va «flaky» oynalarini qoʻshing.
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 generatsiyasi
’.proto’ serverini yarating, nazorat qilinadigan javoblar bilan usullarni amalga oshiring.
Meta maʼlumotlar (headers), holatlar (’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. Negativlar uchun 2 grpcurl
grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create
6) Xabarlar va oqimlar: Kafka/RabbitMQ
6. 1 Schema-aware moki
Testlarda Schema Registry va Euro/JSON-Schema/Protobuf dan foydalaning.
Producer-test: xabar sxemaga mos keladi; Consumer-test: eski va yangi versiyalarni qabul qiladi.
6. 2 Testcontainers (Kafka + Registry misoli)
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 Negativlar
Dublikatlar, tartibni o’zgartirish, yetkazib berishni kechiktirish, «zaharli» xabarlar (dead-letter).
Katta xabarlar (near-limit), sxemalarning noma’lum versiyalari.
7) Contract-aware
7. 1 Pact (CDC mocks)
Consumer kutishni shakllantiradi → pact-fayl → provider stendda tekshiradi.
Pact stub server mijozning integratsiya testlari uchun kutilgan vaqtlarni takrorlaydi.
7. 2 OpenAPI/Protobuf → barqaror ishlab chiqarish
Mok-serverni spetsifikatsiyadan ko’taradigan asboblar (shu jumladan Prism, openapi-mock, grpc-mock).
Salbiy misollar/kodlarni spetsifikatsiyaga kiriting: bu ham shartnoma.
8) Tarmoq va xaos: muvaffaqiyatsizliklarni simulyatsiya qilish
Kechikishlar va jitter: belgilangan/taqsimlangan; muddatlar va per-try timeout’ni tekshiring.
Vaqt/uzilishlar: half-open ulanish, RST, H2, 503/Retry-After oqimining reseti.
Paket yoʻqotishlar/dublikatlar: gRPC/oqimlar uchun.
Tools: Toxiproxy, MockServer (fault injection), xk6-disruptor, netem in CI.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) Ma’lumotlar, sirlar va determinizm
Redact va sintetika: fiksturlarda PII yo’q; pul - decimal/qat’iy formatlash.
Vaqtni belgilash: fake clock; «kecha/bugun» - nazorat qiling.
Idempotentlik: bir xil’Idempotency-Key’→ javob.
Generatorlar: shaffof qiymatli fabrika/bilderlar (e. g., `test_user_001`).
Fiksturlarni (teglarni) versiya qiling, «olib tashlangan» javoblarni mediatsiyasiz saqlamang.
10) CI/CD va atrof-muhit
Matrix: unit (in-process fakes) → component (lokal virtualizatsiya) → integration (minimum mokov, Testcontainers).
Artefaktlar: pact fayllar, OpenAPI snapshotlar, mok-serverlar loglari, yiqilganda PCAP.
Parallellik: noyob portlar/kalitlar prefikslari; konteynerlarni izolyatsiya qilish.
Gate: kontrakt yashil (CDC verify), spetsifikatsiya validna (lint), negativlar o’tdi.
11) Antipatternlar
Moq haqiqiy servis nuqsonlarini «ko’chiradi» → yolg’on ishonch. Kontraktlar va davriy record/verify bilan davolanadi.
Har bir testda butun dunyoning «makromoklari» → mo’rt, qimmat meyntenans. Yupqa portlar va ACLlarni yarating.
Moki real integratsiya kerak bo’lgan E2E (ayniqsa HMAC/mTLS to’lovlari/vebxuklari).
Vaqt/random/tarmoq poygalari tufayli fleykalar → fake clock, determinirlangan sidlardan foydalaning.
Fikstura/repozitoriyadagi sirlar. Sirlar faqat CI maxfiy ombori orqali.
12) iGaming/Moliya xususiyatlari
To’lovlar/xulosalar: moki’Idempotency-Key’,’Retry-After’, HMAC/mTLS, sanksiya kodlari va «uzoq» javoblarni qo’llab-quvvatlashi kerak.
Bonus-mantiq/antifrod: velocity/429 ssenariylari, ATO/challenge, risk-echimlar’allow/deny/challenge’s TTL.
KYC/AML: KYC darajalari bo’yicha sandbox javoblar, negativlar (mismatch, haqiqiy bo’lmagan hujjatlar), anti-replay vebxuklari (’X-Timestamp’oyna).
Yurisdiksiyalar/tenantlar: «X-Tenant/X-Region» majburiy sarlavhalari, turli javob profillari.
13) Mini-retseptlar (shpargalka)
To’lov takrorlanishi: WireMock «Scenarios» - birinchi’201’, ikkinchi’409 duplicate’.
Sekin PSP: MockServer’responseDelay’+ mijozda per-try timeout tekshiruvi.
Webhooks: lokal HTTP server + HMAC imzosini tekshirish; 5 soniyadan keyin takrorlash dubl yaratmaydi.
Kafka-dublikatlar: bir xil xabarni ikki marta e’lon qiling; xendler idempotent bo’lishi shart.
gRPC holatlari: matrix testlar’codes’(InvalidArgument, DeadlineExceeded, ResourceExhausted).
14) Prod-tayyorlik chek-varaqasi
- Portlar/adapterlar ajratilgan; integratsiyalar interfeyslar ortida yashiringan.
- HTTP/gRPC uchun - negativlarga ega contract-aware bloklari (Pact/OpenAPI/Proto) mavjud.
- Brokerlar uchun - Testcontainers + Registry; dublikat/tartib/katta xabarlar testlari.
- Xaos: kechikishlar, taymautlar, reset, 429/503 s’Retry-After’; tarmoq emulatsiya qilinadi (Toxiproxy/netem).
- PIIsiz fikstura; fake clock; idempotentlik tekshiriladi.
- CI matritsasi: unit → component → integration; loglar/kontraktlar artefaktlari saqlanadi.
- Provayderlarning qum qutilari: kalitlar ajratilgan, endpointlar konfiguratsiya qilingan, runbook mavjud.
- Record/Replay jadval boʻyicha yangilanadi, tras tahrirlanadi.
- Flaky metrikasi va nazorat ostidagi testlarning davomiyligi; o’sishda alertlar.
15) TL; DR
Nozik portlar orqali integratsiyalashuvlarni izolyatsiya qiling va oddiy holatlar uchun stubs, oʻzaro munosabatlarni tekshirish uchun mocks, real xulq-atvor uchun fakes, tarmoq va kamdan-kam xatolar uchun service virtualization va chaos kabi vazifalarni bajaring. (Pact/OpenAPI/Proto), determinik va PII bo’lmagan fiksturlarni saqlang, kechikishlarni/taymautlarni simulyatsiya qiling/429/5xx. CI da piramida quring: unit → component → integration; qizil kontraktlarda chiqarishni blokirovka qiling. To’lov/KS-yo’llar uchun HMAC/mTLS, idempotentlik va salbiy stsenariylarni hisobga oling.