السخرية وأماكن التكامل
1) لماذا نحتاج إلى البراغيش والسدادات
التكامل مع مقدمي الدفع وخدمات KYC ووسطاء الرسائل و CRM وما إلى ذلك يجعل الاختبارات بطيئة وغير مستقرة ومكلفة. يسمح الموكي/المقابس بما يلي:- عزل منطق الخدمة عن بيئة غير مستقرة
- تحديد الردود والأخطاء
- إعادة إنتاج الحالات الحدودية النادرة (المهلة، 429/5xx، عدم الاتساق) ؛
- إجراء الاختبارات محليًا وفي CI بسرعة وبشكل متوقع.
2) المصطلحات والتصنيف
Stub عبارة عن كعب بسيط مع استجابة ثابتة، بدون فحوصات تفاعل.
Mock - كائن ينتظر المكالمات ويتحقق منها (طلب/رقم/حجج).
Fake هو تنفيذ مبسط (على سبيل المثال، مستودع In-Memory) بسلوك حقيقي.
الجاسوس هو غلاف يسجل المكالمات الفعلية.
افتراضية الخدمة هي خدمة خارجية «افتراضية» مع نصوص وحالة وميزات الشبكة.
التسجيل/إعادة التشغيل - تسجيل حركة المرور الحقيقية والتشغيل اللاحق (مع المرشحات/الإصدار).
3) الأنماط المعمارية للاختبار
المنافذ والمحولات (سداسي): خذ التكامل إلى ما وراء الواجهات - من السهل استبداله بمزيف/وهمي.
طبقة مكافحة الفساد (ACL): وحدة واحدة تترجم نموذجًا خارجيًا إلى نموذج مجال - عدد أقل من نقاط moka.
العملاء المدركون للعقد: → توليد OpenAPI/Protobuf عددًا أقل من التناقضات اليدوية.
تتميز بالأعلام وأوضاع الصندوق الرملي: مفاتيح/نقاط نهاية آمنة لإسطبل المزود.
4) HTTP: أدوات وأمثلة
4. 1 WireMock (مستقل/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 (برنامج وسيط، سجل/إعادة تشغيل)
قم بتسجيل حركة المرور مقابل صندوق الرمل الخاص بالمزود، وقم بمسح PII، وقم بإصلاحه باعتباره عنصرًا ثابتًا.
في وضع المحاكاة، أضف الاختلافات: 200/4xx/5xx، والتأخير والنوافذ «القشرية».
4. 4 العقدة (Nock )/Python (الردود )/Go ('httptt')
نوك: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 توليد الطعنات
قم بإنشاء خادم بواسطة «.proto»، وتنفيذ الطرق باستخدام الاستجابات الخاضعة للرقابة.
تحقق من البيانات الوصفية (الرؤوس)، والحالات ('الرموز. InvalidArgument ',' codes. الموعد النهائي تجاوزه).
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) المشاركات والجداول: كافكا/RabbitMQ
6. 1 موكي الواعي بالمخطط
استخدم سجل المخطط والتحقق من صحة 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)
يولد المستهلك توقعات → يتحقق → ملف الاتفاقية على الحامل.
يلعب خادم Pact stub التوقعات لاختبارات تكامل العملاء.
7. 2 OpenAPI/Protobuf → جيل مستقر
الأدوات التي ترفع الخادم الوهمي من المواصفات (بما في ذلك Prism، openapi-mock، grpc-mock).
إدراج أمثلة/رموز سلبية في المواصفات: هذا أيضًا عقد.
8) الشبكة والفوضى: محاكاة الإخفاقات
حالات التأخير والترفيه: ثابتة/موزعة ؛ التحقق من المواعيد النهائية وفترة الاستراحة لكل تجربة.
المهلات/الفواصل: اتصالات نصف مفتوحة، RST، إعادة ضبط البث H2، 503/Retry-After.
فقدان/تكرار العبوة: لـ gRPC/تيارات.
الأدوات: Toxiproxy، MockServer (حقن الخطأ)، xk6-disruptor، netem in CI.
toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100
9) البيانات والأسرار والحتمية
التنقيح والمواد التركيبية: لا يوجد مؤشر استثمار دولي في الإصلاحات ؛ المال - كسر عشري/تنسيق صارم.
تحديد الوقت: ساعة مزيفة ؛ «أمس/اليوم» - السيطرة.
الفراغ: نفس رد «Idempotency-Key» → نفس الرد.
المولدات: مصانع/بناة بيانات ذات قيم شفافة (على سبيل المثال، «الاختبار _ المستخدم _ 001»).
إصلاحات الإصدار (العلامات)، لا تخزن الإجابات «المحذوفة» دون وساطة.
10) CI/CD والبيئات
المصفوفة: الوحدة (المزيفة أثناء العملية) → المكون (الافتراضية المحلية) → التكامل (الحد الأدنى من moks، Testcontainers).
القطع الأثرية: ملفات ميثاق، لقطات OpenAPI، سجلات خادم ioc، PCAP للقطرات.
التوازي: الموانئ/البادئات الرئيسية الفريدة ؛ عزل الحاويات.
البوابة: العقد الأخضر (التحقق من مركز السيطرة على الأمراض)، المواصفات صالحة (الوبر)، السلبيات مرت.
11) أنتيباترن
موكي «نسخ» عيوب في الخدمة الحقيقية → ثقة زائفة. يعامل بالعقود والسجل الدوري/التحقق.
«الماكروموكس» للعالم بأسره في كل اختبار → الهشاشة، الاتجاه السائد باهظ الثمن. اصنع موانئ رقيقة و ACLs.
Moki في E2E التي تحتاج إلى تكامل حقيقي (لا سيما المدفوعات/الخطابات الشبكية مع HMAC/mTLS).
الرقائق بسبب الوقت/السباق العشوائي/الشبكة → استخدام ساعة مزيفة، مقاعد حتمية.
أسرار في الإصلاحات/المستودعات. الأسرار - فقط من خلال التخزين السري CI.
12) تفاصيل iGaming/Finance
المدفوعات/عمليات السحب: يجب على Mokes دعم «Idempotency-Key» و «Retry-After» و HMAC/mTLS ورموز العقوبات والردود «الطويلة».
منطق المكافأة/مكافحة الاحتيال: سيناريوهات السرعة/429، ATO/التحدي، حلول المخاطر «تسمح/تنكر/تتحدى» باستخدام TTL.
KYC/AML: استجابات الصندوق الرملي حسب مستويات KYC، السلبيات (عدم التطابق، المستندات غير الصالحة)، خطافات الويب مع إعادة التشغيل المضادة (نافذة «X-Timestamp»).
الولايات القضائية/المستأجرون: عناوين «X-Tenant/X-Region» المطلوبة، وملامح استجابة مختلفة.
13) وصفات صغيرة (ورقة غش)
تكرار الدفع: WireMock «سيناريوهات» - الأول «201» والثاني «409 مكرر».
PSP البطيء: MockServer «الاستجابة التأخير» + التحقق من المهلة لكل تجربة على العميل.
خطوط الويب: خادم HTTP المحلي + التحقق من توقيع HMAC ؛ إعادة التشغيل بعد 5 ثوانٍ لا تخلق ضعف.
يكرر كافكا: انشر نفس الرسالة مرتين ؛ يجب أن يكون المعالج أبله.
حالات gRPC: مصفوفة اختبارات «الرموز» (InvalidArgument، DeadlineExceded، ResourceExhauted).
14) قائمة التحقق من الاستعداد
- تسليط الضوء على الموانئ/المحولات ؛ التكامل مخفي خلف الواجهات.
- بالنسبة لـ HTTP/gRPC - هناك طعنات مدركة للعقد (Pact/OpenAPI/Proto) ذات سلبيات.
- للسماسرة - Testcontainers + Registry ؛ تكرار/طلب/اختبارات الرسائل الكبيرة.
- الفوضى: التأخير، المهلة، إعادة الضبط، 429/503 مع «إعادة التجربة بعد» ؛ يتم محاكاة الشبكة (Toxiproxy/netem).
- التجهيزات الثابتة بدون PII ؛ الساعة المزيفة ؛ سك الفراغ.
- مصفوفة CI: وحدة → عنصر → التكامل ؛ يتم الحفاظ على القطع الأثرية/العقد.
- صناديق الرمل الخاصة بالمزود: يتم فصل المفاتيح، ويتم تكوين نقاط النهاية، وهناك دفتر تشغيل.
- يتم تحديث Record/Replay في الموعد المحدد، ويتم تحرير الآثار.
- المقاييس المتقلبة ومدد الاختبار الخاضعة للمراقبة ؛ تنبيهات النمو.
15) TL ؛ د
عزل عمليات التكامل من خلال الموانئ الرقيقة واستخدام الأداة المناسبة للمهمة: الأذرع للحالات البسيطة، والسخرية للتحقق من التفاعلات، والتزييف للسلوك الواقعي، وافتراضية الخدمة والفوضى للشبكة والأخطاء النادرة. اجعل عقد moki واعيًا (Pact/OpenAPI/Proto)، واحتفظ بالإصلاحات حتمية وخالية من PII، وقم بمحاكاة التأخيرات/المهلات/429/5xx. في CI، بناء هرم: وحدة → عنصر → التكامل ؛ كتلة إطلاق مع عقود حمراء. بالنسبة لمسارات الدفع/CCM، ضع في اعتبارك HMAC/mTLS، والخصوصية والسيناريوهات السلبية.