GH GambleHub

Интеграция үчүн Mocking жана stubs

1) Эмне үчүн моктор жана муфталар керек

Төлөм провайдерлери, KYC кызматтары, билдирүү брокерлери, CRM ж.б. менен интеграциялоо тесттерди жай, туруксуз жана кымбат кылат. Моки/муфталар мүмкүндүк берет:
  • кызматтын логикасын туруксуз чөйрөдөн обочолонтуу;
  • жоопторду жана каталарды аныктоо;
  • сейрек кездешүүчү чек ара учурларын ойнотуу (таймауттар, 429/5xx, ыраатсыздык);
  • сыноолорду жергиликтүү жана CI тез жана алдын ала баштоо.
💡 Принцип: тесттин деңгээли канчалык төмөн болсо (бирдик/компонент), ошончолук көп алмаштырабыз; реалдуулукка канчалык жакын болсо (Integration/E2E), ошончолук аз капкактар.

2) Терминдер жана таксономия

Stub - өз ара текшерүү жок, туруктуу жооп менен жөнөкөй штепсель.
Mock - чакырыктарды күтүп жана аларды текшерүү объект (тартиби/саны/аргументтер).
Fake - чыныгы жүрүм-туруму менен жөнөкөйлөштүрүлгөн ишке ашыруу (мисалы, In-Memory репозиторий).
Spy - иш жүзүндөгү чалууларды жаздырган ороп.
Service Virtualization - сценарийлери, абалы жана тармактык өзгөчөлүктөрү бар "виртуалдык" тышкы кызмат.
Record/Replay - чыныгы трафикти жазуу жана андан кийинки ойнотуу (чыпкалар/редакциялар менен).

Качан тандоо керек:
КырдаалКурал
Таза бизнес логикаFakes (in-memory), unit-mocks
жөнөкөй учурларда менен HTTP-бириктирүүStubs (WireMock/MockServer/HTTPServer)
Кардардын провайдерге карата келишимин текшерүүCDC mocks (Pact)
Татаал жагдайлар/шарттар/тармак каталарService virtualization / Hoverfly / MockServer
Билдирүүлөр (Kafka/RabbitMQ)Testcontainers + schema-aware продюсер/менеджер stubs

3) архитектуралык үлгүлөрү үчүн тестирлөө

Ports & Adapters (Hexagonal): Interface үчүн интеграцияны алып - fake/mock менен алмаштыруу оңой.
Антикоррупциялык катмар (ACL): бир модуль тышкы моделди домендик моделге айландырат - моктун аз чекиттери.
Contract-aware кардарлар: OpenAPI/Protobuf → аз кол айырмачылыктар боюнча генерация.
Feature-желектери жана sandbox-режими: коопсуз ачкычтар/туруктуу провайдер үчүн end-point.

4) HTTP: куралдар жана мисалдар

4. 1 WireMock (standalone/Java DSL)

JSON-штаб:
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 (денени текшерүү жана өзгөрүүлөр менен):
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 (динамикасы/текшерүү)

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)

"Sandbox" провайдерге каршы трафикти жазыңыз, PIIди тазалаңыз, fixture катары жазыңыз.
Simulate режиминде вариацияларды кошуу: 200/4xx/5xx, кечигүү жана "flaky" терезелер.

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 Туруктуу муун

'.proto' боюнча серверди түзүңүз, көзөмөлгө алынган жооптор менен ыкмаларды ишке ашырыңыз.
Мета маалыматтарды (headers), статустарды ('codes. InvalidArgument`, `codes. DeadlineExceeded`).

Go gRPC fake (фрагмент):
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 grpcurl үчүн терс


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

6) Билдирүүлөр жана агымдар: Kafka/RabbitMQ

6. 1 Schema-aware моки

Колдонуңуз Schema Registry жана тесттерде Euro/JSON-Schema/Protobuf тастыктоо.
Producer-тест: билдирүү схемасы ылайык; Колдонуучу-тест: эски жана жаңы нускасын кабыл алат.

6. 2 Testcontainers (мисал Kafka + каттоо)

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 терс

кайталанышы, тартиби, жеткирүү кечигүү, "уулуу" билдирүүлөр (dead-letter).
Чоң билдирүүлөр (near-limit), таанылбаган схемалар нускалары.

7) Contract-aware штепсели

7. 1 Pact (CDC mocks)

Consumer күтүүлөрдү түзөт → pact-file → provider текче текшерет.
Pact stub server кардарлардын интеграциялык тесттер үчүн күтүүлөрдү кайталайт.

7. 2 OpenAPI/Protobuf → туруктуу түзүү

Мок-серверди спецификациядан (анын ичинде Prism, openapi-mock, grpc-mock) көтөрүүчү куралдар.
Терс мисалдарды/коддорду спецификацияга киргизиңиз: бул да келишим.

8) Тармак жана башаламандык: ийгиликсиз симуляция

кечигүү жана Життер: белгиленген/бөлүштүрүлгөн; мөөнөтү жана per-try timeout текшерүү.
Таймауттар/тыныгуулар: half-open connection, RST, H2 агымын калыбына келтирүү, 503/Retry-After.
Пакеттик жоготуулар/дубликаттар: gRPC/агымдар үчүн.
Tools: Toxiproxy, MockServer (fault injection), xk6-disruptor, CI netem.

Toxiproxy мисал (CLI):

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

9) Маалыматтар, сырлар жана детерминизм

Redact жана синтетика: фикстураларда эч кандай PII жок; акча - decimal/катуу формат.
Убакыт бекитүү: fake clock; "кечээ/бүгүн" - көзөмөлдөө.
Idempotency: ошол эле 'Idempotency-Key' → ошол эле жооп.
Генераторлор: ачык-айкын баалуулуктар менен фабрика/маалыматтардын Bilders (e. g., `test_user_001`).
Фикстураларды (тегдерди) версиялаңыз, "алынып салынган" жоопторду медиациясыз сактабаңыз.

10) CI/CD жана айлана-чөйрө

Matrix: unit (in-process fakes) → component (жергиликтүү виртуалдаштыруу) → integration (минималдуу mokov, Testcontainers).
Артефакттар: pact-файлдар, OpenAPI-снапшоттор, мок-серверлердин логдору, жыгылганда PCAP.
Параллелдүүлүк: уникалдуу порттор/ачкыч префикстери; контейнерлерди изоляциялоо.
Gate: келишим жашыл (CDC verify), аныктамасы validna (lint), терс өттү.

11) Антипаттерндер

Моки чыныгы кызматтын кемчиликтерин "көчүрүп" → жалган ишеним. келишимдер жана мезгил-мезгили менен record/verify менен дарыланат.
"Макромоки" ар бир тестте бүт дүйнө → морт, кымбат maintenance. жука портторду жана ACL жасоо.
Moki реалдуу интеграция керек E2E (айрыкча, HMAC/mTLS менен төлөмдөр/Webhook).
Анткени убакыт/жолугушуу/тармак жарыш → Flake fake clock, determined сиддер колдонуу.
Фикстурдагы/репозиторийдеги сырлар. Сырлар - CI жашыруун сактоо аркылуу гана.

12) iGaming/каржы өзгөчөлүктөрү

Төлөмдөр/корутундулар: моктор 'Idempotency-Key', 'Retry-After', HMAC/mTLS, санкция коддору жана "узак" жоопторду колдошу керек.
Бонус-логика/антифрод: velocity/429 сценарийлери, АТО/challenge, TTL менен тобокелдик-чечимдер 'allow/deny/challenge'.
KYC/AML: sandbox-жооп KYC деңгээл, терс (mismatch, жараксыз документтер), anti-replay ('X-Timestamp' терезе) менен Webhook.
Юрисдикциялар/тенанттар: Милдеттүү аталыштар 'X-Tenant/X-Region', ар кандай жооп профилдери.

13) Mini Recipes (шпаргалка)

Төлөмдүн кайталанышы: WireMock "Scenarios" - биринчи '201', экинчи '409 duplicate'.
Жай PSP: MockServer 'responseDelay' + кардарларда per-try timeout текшерүү.
Webhooks: жергиликтүү HTTP Server + HMAC кол текшерүү; 5 секунддан кийин кайталоо дубль жаратпайт.
Kafka-дубликаттары: бир эле билдирүүнү эки жолу жарыялаңыз; хендлер демпотенттик болууга милдеттүү.
gRPC-статустары: matrix 'codes' тесттери (InvalidArgument, DeadlineExceeded, ResourceExhausted).

14) Prod-даярдык чек тизмеси

  • Порттор/адаптерлер бөлүнгөн; интеграциялар интерфейстердин артында жашырылган.
  • HTTP/gRPC үчүн - терс жактары менен contract-aware (Pact/OpenAPI/Proto) бар.
  • Брокерлер үчүн - Testcontainers + каттоо; дубликат тесттер/тартиби/чоң билдирүүлөр.
  • Башаламандык: кечигүү, убакыт, кайра, 429/503 менен 'Retry-After'; тармак эмульсиясы (Toxiproxy/netem).
  • Фикстура жок PII; fake clock; демпотенттик текшерилет.
  • CI матрицасы: unit → component → integration; логдордун/контракттардын артефакттары сакталат.
  • Sandbox провайдерлер: ачкычтар бөлүнгөн, EndPoints конфигурацияланган, runbook бар.
  • Record/Replay тартиби боюнча жаңыланып, жолдор түзөтүлөт.
  • контролдоо астында flaky жана сыноолордун узактыгы метрика; өсүү менен алерт.

15) TL; DR

жука порттор аркылуу интеграциялоо жана тапшырма үчүн туура куралды колдонуу: жөнөкөй учурларда үчүн stubs, өз ара текшерүү үчүн mocks, реалдуу жүрүм-турум үчүн fakes, кызмат virtualization жана chaos - тармактык жана сейрек каталар үчүн. Мокторду контракт-аң-сезимдүү кылыңыз (Pact/OpenAPI/Proto), фикстураларды детерминацияланган жана PIIсиз сактаңыз, кечигүүлөрдү/таймауттарды/429/5хх симуляциялаңыз. CI пирамида куруу: unit → component → integration; кызыл келишимдер боюнча бөгөт коюу. Төлөм/KUS жолдору үчүн HMAC/mTLS, демпотенттик жана терс сценарийлерди эске алыңыз.

Contact

Биз менен байланышыңыз

Кандай гана суроо же колдоо керек болбосун — бизге кайрылыңыз.Биз дайым жардам берүүгө даярбыз!

Интеграцияны баштоо

Email — милдеттүү. Telegram же WhatsApp — каалооңузга жараша.

Атыңыз милдеттүү эмес
Email милдеттүү эмес
Тема милдеттүү эмес
Билдирүү милдеттүү эмес
Telegram милдеттүү эмес
@
Эгер Telegram көрсөтсөңүз — Emailден тышкары ошол жактан да жооп беребиз.
WhatsApp милдеттүү эмес
Формат: өлкөнүн коду жана номер (мисалы, +996XXXXXXXXX).

Түшүрүү баскычын басуу менен сиз маалыматтарыңыздын иштетилишине макул болосуз.