Logo GH

Интеграция үчүн 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

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

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

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

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

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

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