GH GambleHub

Интеграцияға арналған Mocking және stubs

1) Не үшін жуғыштар мен бітеуіштер қажет

Төлем провайдерлерімен, KYC-сервистерімен, хабарлама брокерлерімен, CRM және т.б. интеграциялар тестілерді баяу, тұрақсыз және қымбат етеді. Мойкалар/бітеуіштер:
  • қызмет көрсету логикасын тұрақсыз ортадан оқшаулау;
  • жауаптар мен қателерді анықтауға;
  • сирек кездесетін шекаралық кейстерді (таймауттар, 429/5xx, тұрақсыздық) шығару;
  • тестілерді жергілікті және CI-де жылдам және болжамды түрде іске қосу.
💡 Принцип: тест деңгейі (Unit/Component) неғұрлым төмен болса, соғұрлым көп алмастырамыз; прод-шындыққа (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): интеграцияны интерфейстерден шығарыңыз - оны fake/mock-пен ауыстыру оңай.
Сыбайлас жемқорлыққа қарсы қабат (ACL): бір модуль сыртқы модельді домендік модельге ауыстырады - мо нүктесінен аз.
Contract-aware клиенттер: OpenAPI/Protobuf → бойынша генерация аз қолмен сәйкессіздіктер.
Feature-жалаулар және sandbox-режимдері: тұрақты провайдер үшін қауіпсіз кілттер/эндпоинттер.

4) HTTP: құралдар мен мысалдар

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 (денені тексеру және вариациялармен):
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)

Провайдердің «құмсалғышына» қарсы трафикті жазыңыз, 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-тест: хабарлама схемаға сәйкес келеді; Consumer-тест: ескі және жаңа нұсқаларын қабылдайды.

6. 2 Testcontainers (мысалы, 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 Негативтер

Телнұсқалар, тәртіпті ауыстыру, жеткізуді кешіктіру, «улы» хабарлар (dead-letter).
Үлкен хабарлар (near-limit), схемалардың танылмаған нұсқалары.

7) Contract-aware бітеуіштер

7. 1 Pact (CDC mocks)

Consumer күтулерді қалыптастырады → pact-файл → provider стендте тексереді.
Pact stub server клиенттің интеграциялық сынақтары үшін күткендерді ойнатады.

7. 2 OpenAPI/Protobuf → тұрақтылық генерациясы

Спецификациядан мок-серверін көтеретін құралдар (оның ішінде Prism, openapi-mock, grpc-mock).
Спецификацияға теріс мысалдар/кодтар қосыңыз: бұл да келісімшарт.

8) Желі және хаос: істен шығу симуляциясы

Кідірістер және джиттер: тіркелген/бөлінген; мерзімін және per-try timeout.
Таймауттар/үзілімдер: half-open қосылыстары, RST, H2 ағынының reset, 503/Retry-After.
gRPC/ағымдар үшін пакеттік шығындар/қайталаулар.
Құралдар: 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-Key' → сол жауап.
Генераторлар: мөлдір мәндері бар фабрикалар/деректер билдері (е. g., `test_user_001`).
Фикстураларды (тегтерді) нұсқалаңыз, «алынған» жауаптарды медиациясыз сақтамаңыз.

10) CI/CD және қоршаған орта

Матрица: unit (in-process fakes) → component (жергілікті виртуализация) → integration (минимум моков, Testcontainers).
Артефакттар: pact-файлдар, OpenAPI-снапшоттар, мок-серверлердің логтары, құлаған кездегі PCAP.
Параллельділік: бірегей порттар/кілттердің префикстері; контейнерлерді оқшаулау.
Gate: келісімшарт жасыл (CDC verify), спецификация валидна (lint), негативтер өтті.

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

Моки нақты қызмет ақауларын «көшіреді» → жалған сенімділік. Келісімшарттармен және мерзімді record/verify.
Әрбір тестідегі бүкіл әлемнің «макромокалары» → нәзіктігі, қымбат мейнтенанс. Жіңішке порттар мен ACL жасаңыз.
Моки нақты интеграция қажет E2E (әсіресе HMAC/mTLS-тен төлемдер/вебхукилер).
Уақыт/рандом/желілік жарыстарға байланысты флейкалар → fake clock, детерминирленген сидтерді пайдаланыңыз.
Фикстуралардағы/репозиторийдегі құпиялар. Құпиялар - тек CI құпия-қоймасы арқылы.

12) iGaming/Қаржы ерекшелігі

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

13) Шағын рецептілер (шпаргалка)

Төлемнің қайталануы: WireMock «Scenarios» - бірінші '201', екінші '409 duplicate'.
Баяу PSP: MockServer 'responseDelay' + клиентке per-try timeout тексеру.
Webhooks: жергілікті HTTP сервер + HMAC қолтаңбасын тексеру; 5 секундтан кейін қайталау қайталанбайды.
Kafka-дубликаттары: бір хабарды екі рет жариялаңыз; хендлер іспеттес болуға міндетті.
gRPC-мәртебелері: 'codes' (InvalidArgument, DeadlineExceeded, ResourceExhausted) бойынша тесттердің matrix.

14) Prod-дайындық чек-парағы

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

15) TL; DR

Жұқа порттар арқылы интеграцияларды оқшаулаңыз және қарапайым жағдайларға арналған stubs, өзара әрекеттестікті тексеру үшін mocks, шынайы мінез-құлық үшін fakes, сервистік virtualization және chaos - желілік және сирек қателер үшін дұрыс құралды пайдаланыңыз. Келісімшарт-саналы (Pact/OpenAPI/Proto) мойындарды жасаңыз, фикстураларды детерминирленген және PII-сіз ұстаңыз, кідірістерді/таймауттарды/429/5хх имитациялаңыз. CI-де пирамида жасаңыз: unit → component → integration; қызыл келісімшарттар кезінде релизді бұғаттаңыз. Төлем/ҚЖЖ-жолдары үшін HMAC/mTLS, іспеттілік және теріс сценарийлерді ескеріңіз.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.