Wyśmiewanie i wycinki do integracji
1) Dlaczego potrzebujemy półpasiec i wtyczek
Integracja z dostawcami płatności, usługami KYC, brokerami wiadomości, CRM itp. sprawia, że testy są powolne, niestabilne i drogie. Moki/wtyczki umożliwiają:- Izolacja logiki usług z niestabilnego środowiska
- Określanie odpowiedzi i błędów
- odtworzyć rzadkie przypadki graniczne (terminy, 429/5xx, niespójność);
- przeprowadzać testy lokalnie i w CI szybko i przewidywalnie.
2) Pojęcia i taksonomia
Stub to prosty stub ze stałą odpowiedzią, bez kontroli interakcji.
Mock - obiekt, który czeka na połączenia i je weryfikuje (kolejność/liczba/argumenty).
Fałszywa to uproszczona implementacja (na przykład repozytorium In-Memory) z prawdziwym zachowaniem.
Szpieg to opakowanie rejestrujące rzeczywiste połączenia.
Wirtualizacja usług to „wirtualna” usługa zewnętrzna ze skryptami, statusem i funkcjami sieciowymi.
Rekord/Powtórka - nagrywanie rzeczywistego ruchu, a następnie odtwarzanie (z filtrami/edycją).
3) Wzory architektoniczne do testowania
Porty i adaptery (sześciokątne): zabrać integrację poza interfejsy - łatwo wymienić ją na fałszywą/mock.
Warstwa antykorupcyjna (ACL): jeden moduł przekłada model zewnętrzny na model domeny - mniej punktów moka.
Klienci świadomi kontraktów: OpenAPI/Protobuf generacji → mniejsza liczba manualnych niespójności.
Funkcja flagi i tryby piaskownicy: bezpieczne klucze/punkty końcowe dla stabilnego dostawcy.
4) HTTP: narzędzia i przykłady
4. 1 WireMock (samodzielny/Java DSL)
Pchnięcie 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 (z kontroli ciała i zmian):
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 (dynamika/weryfikacje)
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)
Zarejestruj ruch na piaskownicy dostawcy, wyczyść PII, naprawić go jako oprawę.
W trybie symulacji dodaj warianty: 200/4xx/5xx, opóźnienia i „płatkowe” okna.
4. 4 węzeł (Nock )/Python (odpowiedzi )/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
Idź:
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 Wytwarzanie pchnięcia
Generowanie serwera przez '.proto', wdrożenie metod z kontrolowanymi odpowiedziami.
Sprawdź metadane (nagłówki), statusy ('kody. InwencjArgument ',' kody. Przekroczone ").
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 dla negatywów
grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create
6) Posty i strumienie: Kafka/RabbitMQ
6. 1 Schemat-świadomy moki
Użyj Schema Registry i zwaliduj Avro/JSON-Schema/Protobuf w testach.
Test producenta: komunikat odpowiada schematowi; Test konsumencki: akceptuje stare i nowe wersje.
6. 2 Testcontainers (przykład rejestru 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 Negatywy
Duplikaty, przegrupowanie zamówienia, opóźnienie dostawy, „trujące” wiadomości (martwe litery).
Duże wiadomości (near-limit), nierozpoznane wersje schematu.
7) Wtyczki uświadamiające umowę
7. 1 pakt (kpiny CDC)
Konsument generuje oczekiwania → plik pact → dostawca weryfikuje na stoisku.
Pact stub serwer gra oczekiwania dla testów integracji klienta.
7. 2 OpenAPI/Protobuf → stabilna generacja
Narzędzia, które podnoszą serwer makietowy ze specyfikacji (w tym Prism, openapi-mock, grpc-mock).
Podaj negatywne przykłady/kody w specyfikacji: jest to również umowa.
8) Sieć i chaos: symulacja awarii
Opóźnienia i jitter: stałe/rozproszone; sprawdź terminy i czas na próbę.
Timeouts/breaks: połowa otwarte połączenia, RST, reset stream H2, 503/Retry-After.
Utrata pakietu/duplikat: dla gRPC/strumieni.
Narzędzia: Toksyproksy, MockServer (wtrysk usterki), xk6-disruptor, netem w CI.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) Dane, tajemnice i determinizm
Redakcja i syntetyka: brak PII w poprawkach; pieniądze - formatowanie dziesiętne/ścisłe.
Utrwalenie czasu: fałszywy zegar; „wczoraj/dzisiaj” - kontrola.
Idempotencja: ta sama 'Idempotency-Key' → ta sama odpowiedź.
Generatory: fabryki/konstruktory danych o przezroczystych wartościach (np. „test _ user _ 001”).
Poprawki do wersji (tagi), nie przechowywać „usuniętych” odpowiedzi bez mediacji.
10) CI/CD i środowiska
Matrix: unit (in-process fakes) → komponent (lokalna wirtualizacja) → integracja (minimum moks, Testcontainers).
Artefakty: pliki paktowe, migawki OpenAPI, dzienniki serwerów ioc, PCAP dla kropli.
Paralelizm: unikalne porty/przedrostki kluczy; izolacja pojemników.
Brama: kontrakt zielony (CDC zweryfikować), specyfikacja ważny (lint), negatywy przeszedł.
11) Antypattery
Moki „kopiować” wady prawdziwej usługi → fałszywe zaufanie. Traktowane za pomocą umów i okresowego zapisu/zweryfikować.
„Makarony” całego świata w każdym teście → kruchość, drogi nurt. Tworzyć cienkie porty i ACL.
Moki w E2E, gdzie potrzebna jest prawdziwa integracja (zwłaszcza płatności/haki internetowe z HMAC/mTLS).
Płatki ze względu na czas/losowe/wyścigi sieciowe → używać fałszywego zegara, miejsc deterministycznych.
Sekrety w poprawkach/repozytoriach. Sekrety - tylko za pośrednictwem tajnego magazynu CI.
12) Szczegóły dotyczące iGaming/Finance
Płatności/wypłaty: Mokes musi wspierać „Idempotency-Key”, „Retry-After”, HMAC/mTLS, kody sankcji i „długie” odpowiedzi.
Logika bonusowa/przeciwdziałanie oszustwom: prędkość/429 scenariusze, ATO/challenge, rozwiązania ryzyka 'allow/deny/challenge' z TTL.
KYC/AML: odpowiedzi z piaskownicy według poziomów KYC, negatywy (niedopasowanie, nieprawidłowe dokumenty), haki internetowe z anty-repliką (okno „X-Timestamp”).
Jurysdykcja/Najemcy: Wymagane pozycje 'X-Najemca/X-Region', różne profile odpowiedzi.
13) Mini przepisy kulinarne (arkusz cheat)
Powtórna płatność: WireMock „Scenariusze” - pierwszy '201', drugi '409 duplikat'.
Powolny PSP: MockServer 'keyDelay' + sprawdzanie na wypróbowanie czasu na kliencie.
Webhooks: lokalny serwer HTTP + weryfikacja podpisu HMAC; powtórka po 5 sekundach nie tworzy podwójnego.
Kafka duplikaty: wyślij tę samą wiadomość dwa razy; Opiekun musi być idempotentny.
Statusy gRPC: matryca testów 'kodów' (Inv, Argument, Exceeded, Wyczerpany).
14) Lista kontrolna gotowości Prod
- Zaznaczono porty/adaptery; integracje są ukryte za interfejsami.
- Dla HTTP/gRPC - istnieją pchnięcia uświadamiające umowę (Pact/OpenAPI/Proto) z negatywami.
- Dla maklerów - Testcontainers + Registry; duplikat/order/large message tests.
- Chaos: opóźnienia, timeouts, reset, 429/503 z „Retry-After”; sieć jest emulowana (Toxiproxy/netem).
- Osprzęt bez PII; fałszywy zegar; Idempotencja jest bita.
- Macierz CI: jednostka → komponent → integracja; przechowywane są artefakty logarytmiczne/kontraktowe.
- Piaskownice dostawcy: klucze są oddzielone, punkty końcowe są skonfigurowane, istnieje książka startowa.
- Rekord/Powtórka jest aktualizowany w harmonogramie, ślady są edytowane.
- mierniki płatków i okresy trwania badań pod kontrolą; alerty na wzrost.
15) TL; DR
Izoluj integracje poprzez cienkie porty i użyj odpowiedniego narzędzia do zadania: kijów do prostych przypadków, kpin do weryfikacji interakcji, fałszywek do realistycznego zachowania, wirtualizacji usług i chaosu dla sieci i rzadkich błędów. Uświadomić sobie kontrakt moki (Pact/OpenAPI/Proto), zachować poprawki deterministyczne i PII-free, symulować opóźnienia/timeouts/429/5xx. W CI, zbuduj piramidę: jednostka → komponent → integracja; blok zwolnień z czerwonymi kontraktami. W przypadku ścieżek płatności/CCM należy rozważyć HMAC/mTLS, idempotencję i negatywne scenariusze.