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