Интеграцияға арналған Mocking және stubs
1) Не үшін жуғыштар мен бітеуіштер қажет
Төлем провайдерлерімен, KYC-сервистерімен, хабарлама брокерлерімен, CRM және т.б. интеграциялар тестілерді баяу, тұрақсыз және қымбат етеді. Мойкалар/бітеуіштер:- қызмет көрсету логикасын тұрақсыз ортадан оқшаулау;
- жауаптар мен қателерді анықтауға;
- сирек кездесетін шекаралық кейстерді (таймауттар, 429/5xx, тұрақсыздық) шығару;
- тестілерді жергілікті және CI-де жылдам және болжамды түрде іске қосу.
2) Терминдер мен таксономия
Stub - өзара іс-қимылды тексерусіз, бекітілген жауабы бар қарапайым бітеуіш.
Mock - қоңырауларды күтетін және оларды тексеретін нысан (реті/саны/аргументтері).
Fake - нақты мінез-құлықты жеңілдетілген іске асыру (мысалы, In-Memory репозиторий).
Spy - нақты шақыруларды жазатын орау.
Service Virtualization - сценарийлері, жай-күйі және желілік ерекшеліктері бар «виртуалды» сыртқы сервис.
Record/Replay - нақты трафикті жазу және кейіннен шығару (сүзгілермен/редакциямен).
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 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 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, іспеттілік және теріс сценарийлерді ескеріңіз.