לועגים וגושים לאינטגרציה
1) מדוע אנו זקוקים לקצוות ואטמים
אינטגרציה עם ספקי תשלומים, שירותי KYC, ברוקרים, CRM וכו 'עושים בדיקות איטיות, לא יציבות ויקרות. מוקי/אטמים מאפשרים:- בידוד היגיון השירות מסביבה לא יציבה
- קביעת תגובות ושגיאות
- לשחזר מקרי גבול נדירים (פסקי זמן, 429/5xx, חוסר עקביות);
- הרץ בדיקות באופן מקומי ובמודיע במהירות ובצפוי.
2) מונחים וטקסונומיה
Stub הוא תלוש פשוט עם תגובה קבועה, ללא בדיקות אינטראקציה.
Mock - אובייקט הממתין לקריאות ומאמת אותן (סדר/מספר/ארגומנטים).
זיוף הוא יישום פשוט (לדוגמה, מאגר In-Memory) עם התנהגות אמיתית.
מרגל הוא עטיפה שמקליט שיחות בפועל.
וירטואליזציה של שירות (באנגלית: Service Virtualization) הוא שירות חיצוני וירטואלי עם תסריטים, מאפייני סטטוס ורשת.
תקליט/הילוך חוזר - הקלטה של תנועה אמיתית וניגון לאחר מכן (עם פילטרים/מהדורה).
3) תבניות ארכיטקטוניות לבדיקות
Ports & Adapters (הקסגונלי): קח את האינטגרציה מעבר לממשקים - קל להחליף אותה בזיוף/דמה.
שכבת אנטי-שחיתות (ACL): מודול אחד מתרגם מודל חיצוני למודל דומיין - פחות נקודות מוקה.
לקוחות מודעים לחוזה: OpenAPI/Protobuf generation # פחות חוסר עקביות ידנית.
מאפיין דגלים ומצבי ארגז חול: מפתחות מאובטחים/נקודות קצה עבור היציבה של הספק.
4) HTTP: כלים ודוגמאות
4. 1 ציתות (סטנדלוני/Java DSL)
דקירה של ג 'סון: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 (Dynamics/Verientations)
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 (תוכנות ביניים, תקליט/שידור חוזר)
להקליט את התנועה נגד ארגז החול של הספק, לנקות את המח "ש, לתקן את זה כקיבוע.
במצב הדמיה, הוסף וריאציות: 200/4xx/5xx, עיכובים וחלונות ”מקולקלים”.
4. 4 Node (Nock )/Python (תגובות )/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 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
צור שרת על ידי 'פרוטו', יישם שיטות עם תגובות מבוקרות.
בדוק metadata (כותרות), סטטוסים ('קודים. ביטול הטיעון ',' קודים. עלה על ".
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 -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create
6) עמודים ונחלים: Kafka/RabbitMQ
6. 1 סכימה מודעת למוקי
השתמש ב ־ Schema Registry ותן תוקף ל ־ Avro/JSON-Schema/Protobuf במבחנים.
מבחן מפיק: ההודעה מתאימה לסכימה; מבחן צרכנים: מקבל גרסאות ישנות וחדשות.
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 תשלילים
שכפולים, סידור מחדש של הסדר, עיכוב משלוח, הודעות ”רעילות” (אות מתה).
מסרים גדולים (כמעט גבול), גרסאות סכימה לא מזוהות.
7) תקעים מודעים לחוזה
7. ברית 1 (לועג CDC)
הצרכן מייצר ציפיות * backet file ach description מאמת על הדוכן.
שרת pact stub משחק ציפיות עבור מבחני שילוב לקוח.
7. 2 OpenAPI/Protobuf # דור יציב
כלים המעלים את השרת המדומה מהמפרט (כולל פריזמה, openapi-mock, grpc-mock).
כלול דוגמאות/קודים שליליים במפרט: זהו גם חוזה.
8) רשת וכאוס: סימולציה של כשלונות
עיכובים וריגושים: קבוע/מבוזר; בדוק מועדים ולנסות את הזמן.
פסקי זמן/שברים: חיבורים חצי פתוחים, RST, איפוס זרם H2, 503/Retry-After.
אובדן/שכפול: עבור gRPC/streams.
כלים: Toxiproxy, MockServer (הזרקת פגמים), xk6-משבש, netem in CI.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) נתונים, סודות ודטרמיניזם
עריכה וסינתטיים: אין מח "ש בתיקונים; כסף - תבנית עשרונית/קפדנית.
קיבעון זמן: שעון מזויף; ”אתמול/היום” - שליטה.
אידמפוטנטיות: 'Idempotency-Key' = תגובה זהה.
גנרטורים: מפעלים/בונים נתונים עם ערכים שקופים (למשל, ”test _ user _ 001”).
תיקוני ורסיונינג (תגיות), אינם מאחסנים תשובות ”מוסרות” ללא תיווך.
10) CI/CD וסביבות
מטריצה: יחידה (process-fakes) = רכיב (local virtualization) = אינטגרציה (minimum moks, testcontainers).
חפצים: קבצי ברית, תצלומי OpenAPI, רישומי שרת ioc, PCAP לטיפות.
מקביליות: נמלים ייחודיים/קידומות מפתח; בידוד של מיכלים.
שער: חוזה ירוק (CDC לוודא), מפרט תקף (מוך), תשלילים עברו.
11) תרופות אנטי ־ פטריות
מוקי ”להעתיק” פגמים בשירות אמיתי. מטופל בחוזים ורישום תקופתי/לאמת.
”מקרומוקים” של העולם כולו בכל מבחן שבריריות, מיינסטרים יקר. הכן נמלים דקים ואזיקים.
Moki in E2E שבו יש צורך באינטגרציה אמיתית (במיוחד תשלומים/אינטרנט עם HMAC/mTLS).
פתיתים בשל זמן/אקראי/מרוצי רשת "השתמש בשעון מזויף, מושבים דטרמיניסטיים.
סודות בתיקונים/מאגרים. סודות - רק דרך מודיע אחסון סודי.
12) פרטים של iGaming/Finance
תשלומים/משיכות: Mokes חייב לתמוך ב ”Idempotency-Key”, ”Retry-After”, HMAC/mTLS, קודי סנקציה ותגובות ארוכות.
לוגיקה/אנטי-הונאה בונוס: תרחישי מהירות/429, ATO/אתגר, פתרונות סיכון ”לאפשר/להכחיש/לאתגר” עם TTL.
KYC/AML: תגובות מארגז חול על ידי רמות KYC, תשלילים (חוסר התאמה, מסמכים לא תקפים), חוברות אינטרנט עם אנטי-שידור חוזר (”X-Timestamp” window).
תחום שיפוט/דיירים: ראשי תיבות 'X-Tenant/X-Region', פרופילי תגובה שונים.
13) מתכונים מיני (גיליון רמאות)
תשלומים חוזרים: ”תרחישים” - ראשון 201, שני 409 שכפול.
Slow PSP: MockServer ' Helief' + בדיקת זמן נסיון על הלקוח.
Webhooks: שרת HTTP מקומי + אימות חתימה של HMAC; שידור חוזר אחרי 5 שניות לא יוצר כפול.
קפקא כפילים: לפרסם את אותה הודעה פעמיים; המטפל חייב להיות מפוקפק.
סטטוסים של GRPC: מטריצה של מבחני 'קודים' (Invalidage, GointExted, Missifted).
14) רשימת מוכנות תומכת
[ ] נמלים/מתאמים מודגשים; אינטגרציות מוסתרות מאחורי ממשקים.
[ ] עבור HTTP/gRPC - יש דקירות בעלות מודעות חוזה (Pact/OpenAPI/Proto) עם תשלילים.
[ ] לברוקרים - Testcontainers + Registry; שכפול/סדר/בדיקות מסרים גדולות.
[ ] כאוס: עיכובים, פסקי זמן, איפוס, 429/503 עם ”Retry-After”; הרשת מחקה (Toxiproxy/netem).
[ ] תיקונים ללא מח "ש; שעון מזויף; אידמפוטנטיות מוטבעת.
[ ] מטריצת CI: רכיב יחידה * אינטגרציה; פריטי לוג/חוזה נשמרים.
[ ארגזי חול מספקים ]: מפתחות מופרדים, נקודות קצה מוגדרות,
[ ] שיא/הילוך חוזר מתעדכן בלוח הזמנים, עקבות נערכים.
[ ] מדדים רעועים ומשכי בדיקה תחת שליטה; התראות על צמיחה.
15) TL; DR
לבודד אינטגרציה דרך נמלים דקים ולהשתמש בכלי המתאים למשימה: תלושים עבור מקרים פשוטים, לועגים לאימות של אינטראקציות, זיופים עבור התנהגות מציאותית, וירטואליזציה שירות ותוהו ובוהו עבור רשת ושגיאות נדירות. הפוך את ה-moki contract (Pact/OpenAPI/Proto), שמור את התיקונים דטרמיניסטיים ו-PII-free, תדמה עיכובים/פסקי זמן/429/5xx. ב-CI, לבנות פירמידה: רכיב יחידה * אינטגרציה; בלוק שחרור עם חוזים אדומים. עבור נתיבי תשלום/CCM, שקול HMAC/mTLS, idempotence ותרחישים שליליים.