Entegrasyonlar için alay ve stoklar
1) Neden midge ve fişlere ihtiyacımız var
Ödeme sağlayıcıları, KYC hizmetleri, mesaj brokerleri, CRM vb. İle entegrasyonlar testleri yavaş, kararsız ve pahalı hale getirir. Moki/fişler izin verir:- Servis mantığını dengesiz bir ortamdan izole edin
- Yanıtları ve hataları belirleme
- Nadir sınır durumlarını çoğaltmak (zaman aşımları, 429/5xx, tutarsızlık);
- Testleri yerel olarak ve CI'da hızlı ve tahmin edilebilir bir şekilde çalıştırın.
2) Şartlar ve taksonomi
Stub, etkileşim kontrolleri olmadan sabit bir yanıta sahip basit bir saplamadır.
Mock - çağrıları bekleyen ve bunları doğrulayan bir nesne (sipariş/sayı/argümanlar).
Fake, gerçek davranışa sahip basitleştirilmiş bir uygulamadır (örneğin, bir In-Memory deposu).
Casus, gerçek aramaları kaydeden bir paket.
Hizmet Sanallaştırma, komut dosyaları, durum ve ağ özelliklerine sahip'sanal'bir harici hizmettir.
Kayıt/Yeniden Oynatma - gerçek trafiğin kaydı ve ardından oynatma (filtreler/sürüm ile).
3) Test edilebilirlik için mimari desenler
Bağlantı Noktaları ve Adaptörler (Altıgen): Entegrasyonu arayüzlerin ötesine taşır - sahte/sahte ile değiştirmek kolaydır.
Bozulmayı önleme katmanı (ACL): Bir modül harici bir modeli etki alanı modeline çevirir - daha az moka noktası.
Kontrata duyarlı istemciler: OpenAPI/Protobuf generation - daha az manuel tutarsızlık.
Özellik bayrakları ve sanal alan modları: sağlayıcının kararlılığı için güvenli anahtarlar/uç noktalar.
4) HTTP: araçlar ve örnekler
4. 1 WireMock (bağımsız/Java DSL)
JSON bıçak: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 (gövde kontrolü ve varyasyonları ile):
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 (Dinamikler/Doğrulamalar)
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, kayıt/tekrar)
Trafiği sağlayıcının sanal alanına karşı kaydedin, PII'yi temizleyin, fikstür olarak düzeltin.
Simülasyon modunda, varyasyonlar ekleyin: 200/4xx/5xx, gecikmeler ve "lapa lapa" pencereler.
4. 4 Düğüm (Nock )/Python (yanıtlar )/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
Git:
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 Bıçak üretimi
'.proto'ile bir sunucu oluşturun, kontrollü yanıtlarla yöntemler uygulayın.
Meta verileri (üstbilgiler), durumları ('kodları) denetleyin. InvalidArgument ',' kodları. 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. Negatifler için 2 grpcurl
grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create
6) Mesajlar ve akışlar: Kafka/RabbitMQ
6. 1 Şemaya duyarlı moki
Schema Registry'yi kullanın ve testlerde Avro/JSON-Schema/Protobuf'u doğrulayın.
Üretici testi: mesaj şemaya karşılık gelir; Tüketici testi: eski ve yeni sürümleri kabul eder.
6. 2 Testcontainers (Kafka + Registry örneği)
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 Negatifler
Kopyalar, siparişin yeniden düzenlenmesi, teslimat gecikmesi, "zehirli" mesajlar (ölü mektup).
Büyük mesajlar (sınıra yakın), tanınmayan şema sürümleri.
7) Sözleşmeye duyarlı fişler
7. 1 Pakt (CDC alay ediyor)
Tüketici beklentileri oluşturur - pakt dosyası - sağlayıcı standda doğrular.
Pact stub sunucusu, istemci entegrasyon testleri için beklentileri oynar.
7. 2 OpenAPI/Protobuf - kararlı nesil
Mock sunucuyu spesifikasyondan yükselten araçlar (Prism, openapi-mock, grpc-mock dahil).
Şartnameye olumsuz örnekler/kodlar ekleyin: bu da bir sözleşmedir.
8) Ağ ve kaos: başarısızlıkların simülasyonu
Gecikmeler ve titreme: sabit/dağıtılmış; Son teslim tarihlerini ve deneme başına zaman aşımını kontrol edin.
Zaman aşımları/kesmeler: yarı açık bağlantılar, RST, sıfırlama akışı H2, 503/Retry-After.
Paket kaybı/çoğaltma: gRPC/akışlar için.
Araçlar: Toxiproxy, MockServer (hata enjeksiyonu), xk6-bozucu, CI'da netem.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) Veri, sırlar ve determinizm
Redakt ve sentetikler: Düzeltmelerde PII yok; para - ondalık/katı biçimlendirme.
Zaman sabitleme: sahte saat; "Dün/bugün" - kontrol.
Idempotency: aynı 'Idempotency-Key' - aynı yanıt.
Jeneratörler: şeffaf değerlere sahip verilerin fabrikaları/inşaatçıları (örneğin, 'test _ user _ 001').
Sürüm düzeltmeleri (etiketler), "kaldırıldı" yanıtlarını aracı olmadan saklamayın.
10) CI/CD ve ortamlar
Matris: birim (işlem içi sahte) - bileşen (yerel sanallaştırma) - entegrasyon (minimum moks, Testcontainers).
Eserler: pakt dosyaları, OpenAPI anlık görüntüleri, ioc sunucu günlükleri, damlalar için PCAP.
Paralellik: benzersiz bağlantı noktaları/anahtar önekleri; konteynerlerin izolasyonu.
Kapı: sözleşme yeşili (CDC doğrulaması), şartname geçerli (tiftik), negatifler geçti.
11) Antipatterns
Gerçek hizmette Moki "kopya" kusurları - yanlış güven. Sözleşmelerle ve periyodik kayıt/doğrulama ile işlenir.
Her testte tüm dünyanın "makromokları" - kırılganlık, pahalı ana akım. İnce portlar ve ACL'ler yapın.
Gerçek entegrasyonun gerekli olduğu E2E Moki (özellikle HMAC/mTLS ile ödemeler/web kitapları).
Zaman/rastgele/ağ yarışları nedeniyle pullar - sahte saat, deterministik koltuklar kullanın.
Düzeltmelerdeki/depolardaki sırlar. Sırlar - sadece gizli depolama yoluyla CI.
12) iGaming/Finansın Özellikleri
Ödemeler/para çekme: Mokes 'Idempotency-Key', 'Retry-After', HMAC/mTLS, yaptırım kodları ve 'uzun' yanıtları desteklemelidir.
Bonus mantığı/dolandırıcılıkla mücadele: hız/429 senaryoları, ATO/challenge, TTL ile risk çözümleri 'allow/deny/challenge'.
KYC/AML: KYC seviyelerine göre sandbox yanıtları, negatifler (uyumsuzluk, geçersiz belgeler), anti-replay ('X-Timestamp' penceresi) içeren web kitapları.
Yargı Alanları/Kiracılar: Gerekli 'X-Kiracı/X-Bölgesi' başlıkları, farklı yanıt profilleri.
13) Mini tarifler (hile sayfası)
Tekrar ödeme: WireMock "Senaryolar" - ilk '201', ikinci '409 yinelenen'.
Yavaş PSP: MockServer 'responseDelay' + istemcide deneme başına zaman aşımını denetleme.
Webhooks: yerel HTTP sunucusu + HMAC imza doğrulaması; 5 saniye sonra tekrar oynatma çift oluşturmaz.
Kafka kopyalar: aynı mesajı iki kez gönderin; Handler idempotent olmalıdır.
gRPC durumları: 'kodlar' testlerinin matrisi (InvalidArgument, DeadlineExceeded, ResourceExtended).
14) Prod Hazırlık Kontrol Listesi
- Bağlantı noktaları/bağdaştırıcılar vurgulanır; Entegrasyonlar arayüzlerin arkasına gizlenmiştir.
- HTTP/gRPC için - negatifleri olan sözleşmeye duyarlı bıçaklamalar (Pact/OpenAPI/Proto) vardır.
- Brokerler için - Testcontainers + Registry; yinelenen/sipariş/büyük mesaj testleri.
- Kaos: gecikmeler, zaman aşımları, sıfırlama, 429/503 ile 'Retry-After'; Ağ taklit edilir (Toxiproxy/netem).
- PII'siz fikstürler; sahte saat; idempotency basılır.
- CI matrisi: birim> bileşen> entegrasyon; Log/sözleşme eserler korunur.
- Sağlayıcı sanal alanları: anahtarlar ayrılır, uç noktalar yapılandırılır, bir çalışma kitabı vardır.
- Kayıt/Yeniden Oynatma programa göre güncellenir, izler düzenlenir.
- kontrol altında lapa lapa metrikler ve test süreleri; büyümede uyarılar.
15) TL; DR
Entegrasyonları ince bağlantı noktalarından ayırın ve görev için doğru aracı kullanın: basit durumlar için taslaklar, etkileşimlerin doğrulanması için alaylar, gerçekçi davranış için sahte, ağ ve nadir hatalar için hizmet sanallaştırma ve kaos. Moki sözleşmesini bilinçli hale getirin (Pact/OpenAPI/Proto), düzeltmeleri deterministik ve PII'siz tutun, gecikmeleri/zaman aşımlarını/429/5xx'i simüle edin. CI'da bir piramit inşa edin: birim - bileşen - entegrasyon; Kırmızı sözleşmelerle serbest bırakma bloğu. Ödeme/CCM yolları için HMAC/mTLS, idempotans ve olumsuz senaryoları göz önünde bulundurun.