GH GambleHub

Mocking և stubs ինտեգրման համար

1) Ինչո՞ ւ են անհրաժեշտ կամուրջներն ու սալիկները։

Համագործակցում են հիբրիդային պրովայդերների, KYC ծառայությունների, հաղորդագրությունների բրոքերների, CRM և այլն։ Մոմերը/կոճակները թույլ են տալիս

տրամաբանությունը մեկուսացնել անկայուն միջավայրից։

հաշվել պատասխաններն ու սխալները։

վերարտադրել հազվագյուտ սահմանափակում (թայմաուտներ, 429/5xx, նեկոնսիստենտություն);

սկսել թեստերը տեղական և CI-ում արագ և կանխատեսելի։

💡 Սկզբունք 'որքան ցածր է թեստի մակարդակը (Unit/Component), այնքան ավելի շատ ենք փոխարինում։ որքան ավելի մոտ է prod իրականությանը (Integration/E2E), այնքան ավելի քիչ հալեցում։

2) Տերմիններ և տաքսոնոմիա

Stub-ը պարզ կափարիչ է ֆիքսված պատասխանով, առանց փոխազդեցության ստուգման։

Mock-ը օբյեկտ է, որը ակնկալում է զանգեր և հավատում է նրանց (կարգ/քանակություն/փաստարկներ)։

Fake-ը պարզեցված կոմպոզիա է (օրինակ, In-Memory reposoria) իրական վարքագծով։

Spy-ը իրական մարտահրավերներ է։

Express Virtualization-ը «վիրտուալ» արտաքին ծառայություն է սցենարների, վիճակի և ցանցային հատկությունների հետ։

Record/Replay-ը իրական կոդերի ձայնագրումն է և հաջորդ վերարտադրումը (ֆիլտրերով/խմբագրությամբ)։

Երբ ինչ ընտրել

ԻրավիճակըԳործիք
Մաքուր բիզնես տրամաբանությունFakes (in-memory), unit-mocks
HTTP ինտեգրումը պարզ դեպքերի հետStubs (WireMock/MockServer/HTTPServer)
Հաճախորդի պայմանագրի ստուգումը պրովայդերիCDC mocks (Pact)
Բարդ սցենարներ/վիճակներ/ցանցային սխալներService virtualization / Hoverfly / MockServer
Հաղորդագրություններ (Kafka/RabbitMQ)Testcontainers + schema-aert tubs/condubs stubs

3) Ճարտարապետական արտոնագրեր թեստավորման համար

Ports & Adapters (Hexagonal): Դիմեք ինտերֆեյսերի ինտեգրումը հեշտ է փոխարինել fake/mock-ով։

Հակակոռուպցիոն շերտը (ACL), մեկ մոդուլը փոխանցում է արտաքին մոդելը ուղղահայաց, ավելի քիչ, քան մոմի կետերը։

Euract-a.ru հաճախորդները ՝ OpenAPI/Eurobuf-ի արտադրությունը ավելի քիչ ձեռքի անհամապատասխանություններ ունի։

Feature-դրոշները և sandbox-ռեժիմները 'անվտանգ բանալիներ/էնդպոինտներ պրովայդերի համար։

4) HTTP ՝ գործիքներ և օրինակներ

4. 1 WireMock (standalone/Java DSL)

JSON-2019

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 Ռոտորի գեներացիա

Sgenerirute '.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-aron կամուրջներ

Օգտագործեք Schema Registry-ը և validirute Avro/JSON-Schema/Eurobuf թեստերում։

Exper-թեստը 'հաղորդագրությունը համապատասխանում է սխեմային։ 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) Medract-a.ru

7. 1 Pact (CDC mocks)

Consumer-ը ձևավորում է սպասումներ www.pact ֆայլ provider-ի վրա։

Pact stub-ը վերարտադրում է սպասումները հաճախորդի ինտեգրացիոն թեստերի համար։

7. 2 OpenAPI/Eurobuf-ը նկարագրում է ածխաջրածինների արտադրությունը

Գործիքները, որոնք բարձրացնում են լվացքի սերվերը (ներառյալ Prism, openapi-mock, grpc-mock)։

Միացրեք բացասական օրինակները/ճշգրտումը 'սա նաև պայմանագիր է։

8) Ցանցը և քաոսը 'մերժումների սիմուլյացիա

Ձգումներ և ջիտթեր 'ֆիքսված/բաշխված; ստուգեք dedlines և 2019-try timeout։

Թայմաուտներ/բացթողումներ ՝ half-բաց միացություններ, RST, H2 հոսքի հետազոտություն, 503/Retry-After։

Փաթեթային կորուստները/կրկնօրինակները 'gRPC/strims համար։

Գործիքներ ՝ Toxiproxy, MockServer (fultinject), xk6-medruptor, netem CI-ում։

Toxiproxy (CLI) օրինակը


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

9) Տվյալները, գաղտնիքները և դետերմինիզմը

Redact-ը և սինթեզիկան 'ոչ PII-ը ֆիքսներում։ գումարը decimal/խիստ անջատումն է։

Ժամանակի ամրագրումը 'fake clock; «Երեկ/այսօր» - վերահսկեք։

Idempotenty: Նույն «Idempotency-Key» -ը նույն պատասխանն է։

Գեներատորներ ՝ գործարաններ/տվյալների բիլդերներ, որոնք ունեն թափանցիկ արժեքներ (e. g., `test_user_001`).

Տարբերեք ֆիքստուրները (թեգերը), մի պահպանեք «նկարահանված» պատասխանները առանց միջնորդության։

10) CI/CD և շրջապատում

Մատրիցա 'unit (in-process fakes) wwww.integration (նվազագույն կամուրջներ, Testcontainers)։

Արտեֆակտներ ՝ pact ֆայլեր, OpenAPI-Supshots, mok-2019, PCAP ընկնելիս։

Զուգահեռությունը 'յուրահատուկ կոմպոզիցիաներ/նախածանցներ, տարաների մեկուսացում։

Gate: պայմանագիրը կանաչ է (CDC verify), վալիդինի (lint) ճշգրտումը, բացասականները կանցնեն։

11) Անտիպատերնի

Մոկին «պատճենում է» իրական հանցագործության թերությունները կեղծ վստահություն։ Այն բուժվում է պայմանագրերով և պարբերական record/verify-ով։

«Մակրոմոկները» ամբողջ աշխարհում յուրաքանչյուր թեստում պարունակում են փխրունություն, թանկ մայնթենանս։ Արեք բարակ կոմպոզիցիաներ և ACL-ներ։

Moki E2E-ում, որտեղ անհրաժեշտ է իրական ինտեգրում (հատկապես վճարումներ/webhuks HMAC/mTSA)։

Ֆլեյքսը ժամանակի/ռանդոմի/ցանցային մրցավազքի պատճառով օգտագործեք fake clock, դետերմինացված նստատեղեր։

Գաղտնիքները ֆիքսներում/ռեպոզորիայում։ Գաղտնիքները միայն CI գաղտնի պահեստի միջոցով են։

12) iGaming/ֆինանսական առանձնահատկությունները

Վճարումներ/եզրակացություններ. Կամուրջները պետք է աջակցեն «Idempotency-Key», «Retry-After», HMAC/mTRK, սանկցիոն և «երկար» պատասխաններ։

Բոնուս տրամաբանությունը/հակաֆրոդը 'velocity/429, ATO/chelenge, ռիսկային լուծումներ' allow/deny/challenge's TTL։

KYC/AML: sandbox պատասխանները KYC մակարդակների վրա, բացասական (mismatch, իրավաբանական փաստաթղթեր), anti-replay («X-Timestamp» պատուհան)։

Իրավասություններ/տենանտներ 'պարտադիր վերնագրեր' «X-Tenault/X-Region», տարբեր պատասխաններ։

13) Մինի բաղադրատոմսեր (լրտես)

Մրցույթի խոհարար 'WireMock «Scenarios» - առաջին' 201 «, երկրորդը '409 duplicate»։

Դանդաղ PBS: MockServer 'responseDray' + ստուգումը 2019-try timeout-ում։

Webhooks: տեղական HTTP սերվերը + ստուգում HMAC ստորագրությունը; 5 վայրկյան անց կրկնապատկիչը չի ստեղծում։

Kafka-կրկնօրինակներ. Հրապարակեք նույն հաղորդագրությունը երկու անգամ։ Հենդլերը պետք է լինի idempotent։

GRPC ստատուսներ 'mations թեստեր' codes '(MedalidArgument, Deadom Exhausted, Resourts Exhausted)։

14) Չեկ-թուղթ պատրաստակամության համար

  • Մոսկվան/ադապտերները կարևորվում են; Դուք թաքնված եք ինտերֆեյսի ետևում։
  • HTTP/gRPC-ի համար - գոյություն ունեն dract-aultus (Pact/OpenAPI/Delo), որոնք չունեն։
  • Բրոքերի համար 'Testcontainers + Registry; կրկնօրինակների/կարգի/մեծ հաղորդագրությունների թեստեր։
  • Քաոս 'ձգձգումներ, թայմաուտներ, հետազոտություններ, 429/503 s' Retry-After '; ցանցը էմուլացվում է (Toxiproxy/netem)։
  • Ֆիքսթուրներ առանց PII; fake clock; գաղափարախոսությունը ստուգվում է։
  • CI մատրիցա 'unit www.integration; Լոբի արտեֆակտներ/105 105։
  • Պրովայդերների ավազները 'բանալիները պատված են, էնդպոինտները կազմված են, կա runbook։
  • Record/Replay-ը նորարարվում է ժամանակացույցով, ցանցերը խմբագրվում են։
  • Metriki flaky և թեստերի տևողությունը վերահսկողության տակ; ալտերտերը աճելիս։

15) TL; DR

Isolirured-ը տեղադրեք բարակ պարամետրերի միջոցով և օգտագործեք ճիշտ գործիք առաջադրանքի համար 'stubs պարզ դեպքերի համար, mocks փոխազդեցությունների, fakes իրատեսական վարքի համար, www.irtualization և chaos' ցանցային և հազվագյուտ սխալների համար։ Վերցրեք մոծակները գիտակցված (Pact/OpenAPI/Pro), պահեք դետերմինացված և առանց PII, սիմուլյացիայի/timautes/429/5x։ CI-ում կառուցեք բուրգը 'unit www.integration; արգելափակում եք կարմիր պայմանագրերում։ Մետրոպոլիտենի/KUS ճանապարհների համար հաշվի առեք HMAC/mTSA-ը, գաղափարախոսությունը և բացասական սցենարները։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։