अनुबंध परीक्षण
1) अनुबंध कहां लागू करें
HTTP REST/JSON: संसाधन, पृष्ठभूमि, फिल्टर, पहचान, त्रुटि कोड।
gRPC/Protobuf: संदेश प्रकार, स्थिति, 'समय सीमा' शब्दार्थ, पिछड़े-कॉम्पैट v.proto।
GraphQL: स्कीमा, गैर-शून्य, निर्देश, क्षेत्रों के लिए अनुमति।
संदेश/धाराएँ (काफ्का/पल्सर/एसक्यूएस): घटना योजनाएं (एवरो/जेसन/प्रोटोबुफ), विभाजन कुंजी, आदेश, पहचान कुंजियाँ।
आंतरिक एसडीके/पुस्तकालय: सार्वजनिक विशेषताएं/अपवाद/प्रदर्शन अनुबंध।
2) सीडीसी मॉडल: भूमिकाएँ और कलाकृतियाँ
उपभोक्ता अपेक्षाओं अनुबंध (नमूना अनुरोध/प्रतिक्रियाएं, प्रकार मिलान, अपरिवर्तनीय) प्रकाशित करता है।
आपूर्तिकर्ता अपनी सेवा/एडाप्टर/हैंडलर के विरुद्ध संविदा सत्यापन चलाता है।
अनुबंध ब्रोकर (पैक्ट ब्रोकर/बैकस्टेज/रेपो आर्टिफैक्ट) संस्करण, टैग ('प्रॉड', 'स्टेजिंग', 'कैनरी') और 'उपभोक्ता @ v → प्रदाता @ v' संगतता मैट्रिक्स को संग्रहीत करता है।
रिलीज नीति: किसी प्रदाता को भेजना निषिद्ध है यदि किसी "प्रोड-प्रासंगिक" अनुबंध का उल्लंघन किया जाता है।
3) अनुबंध में क्या ठीक करना है (HTTP उदाहरण)
न्यूनतम:- विधि/पथ/पैरामीटर/शीर्षक (incl. Auth, idempotent कुंजी).
- शरीर और विशिष्ट मिलान (प्रकार/प्रारूप/regexp/रेंज)।
- त्रुटि कोड और संरचना; स्थिर 'error _ code'।
- शब्दार्थ अपरिवर्तनीय: छंटाई, विशिष्टता, एकरसता 'निर्मित _ at'।
- गैर-कार्यात्मक अपेक्षाएं (वैकल्पिक): p95, आकार सीमा, दर-सीमा हेडर।
json
{
"interaction": "GET /v1/users/{id}",
"request": { "method": "GET", "path": "/v1/users/123", "headers": {"Accept":"application/json"} },
"matchers": {
"response.body.id": "type:number",
"response.body.email": "regex:^.+@.+\\..+$",
"response.body.created_at": "format:rfc3339"
},
"response": {
"status": 200,
"headers": {"Content-Type":"application/json"},
"body": {"id": 123, "email": "alice@example.com", "created_at": "2025-10-31T12:00:00Z"}
},
"error_cases": [
{
"name":"not_found",
"request":{"path":"/v1/users/9999"},
"response":{"status":404, "body":{"error_code":"USER_NOT_FOUND"}}
}
]
}
4) घटना-संचालित अनुबंध
इवेंट स्कीमा: 'type', 'version', 'id', 'hestive _ at _ utc', 'productor', 'suption', 'पेलोड'.
Invariants: invariance 'id' और '(प्रकार, id)' द्वारा पहचान, भाग की कुंजी के भीतर क्रम, एकरसता 'अनुक्रम'।
स्कीमा रजिस्ट्री-स्टोर विकास और संगतता नियम (पीछे/आगे/पूर्ण)।
उपभोक्ता अनुबंध परीक्षण: "सुनहरा" घटनाओं और नकारात्मक चरणों (अज्ञात क्षेत्र, शून्य) के चरणों को फिर से भरना।
एवरो आरेख उदाहरण (टुकड़ा):json
{
"type":"record","name":"UserRegistered","namespace":"events.v1",
"fields":[
{"name":"id","type":"string"},
{"name":"occurred_at_utc","type":{"type":"long","logicalType":"timestamp-millis"}},
{"name":"email","type":"string"},
{"name":"marketing_opt_in","type":["null","boolean"],"default":null}
]
}
5) विकास और संगतता
अनुबंध संस्करण: 'मेजर' शब्दार्थ। माइनर। PATCH '(मेजर - ब्रेकिंग)।
REST के लिए नियम:- नहीं तोड़ें: क्षेत्र मिटाएँ नहीं, प्रकार/मान 'त्रुटि _ कोड' नहीं बदलें.
- डिफ़ॉल्ट के साथ वैकल्पिक क्षेत्र जोड "जादू" के बजाय नए समापन बिंदु।
- Decrement: घोषणा, समवर्ती समर्थन, मेट्रिक्स द्वारा विलोपन।
- ग्राफक्यूएल: ऐड-ओनली फ़ील्ड, नॉन-नल एंटर चरणों के माध्यम से; निर्देश निर्धारित कर
- gRPC/Proto: फ़ील्ड संख्याओं का पुन: उपयोग न करें; केवल वैकल्पिक के साथ नए जोड़ें।
- घटनाएँ: योजना 'वीएन'; उपभोक्ताओं को अज्ञात क्षेत्रों (उदारता) की अनदेखी करनी होती है।
6) नकारात्मक और अपरिवर्तनीय जाँच
नकारात्मक: गलत प्रकार, निषिद्ध मान, परस्पर विरोधी मापदंड, सीमा से अधिक।
इनवेरिएंट्स: प्रतिक्रियाओं की छंटाई, 'आईडी' की विशिष्टता, 'नेक्स्ट _ कर्सर' की शुद्धता, दोहराए जाने पर अज्ञात प्रतिक्रिया की स्थिरता।
अस्थायी पहलुओं के अनुबंध: 'क्रिएट _ एट', स्थानीय दिनों का सही प्रक्षेपण परिवहन अनुबंध का हिस्सा नहीं है - व्यावसायिक अपरिवर्तनों को प्रस्तुत किया जाता है।
7) स्टैब पीढ़ी और स्थानीय विकास
अनुबंधों से, उपभोक्ता विकास के लिए प्रदाता ढेर उत्पन्न होते हैं।
योजना के अनुसार "वैध/सीमावर्ती" संदेशों की घटनाओं के लिए।
कर्मचारियों को अनुबंध संस्करण और निर्माण तिथि के साथ चिह्नित प्रोड में प्रकाशन।
8) सीआई/सीडी में एम्बेडिंग (संदर्भ पाइपलाइन)
1. उपभोक्ता सीआई:
लिंट/बिल्ड कॉन्ट्रैक्ट जनरेशन यूनिट/टेस्ट कॉन्ट्रैक्ट - कॉन्ट्रैक्ट-ब्रोकर में प्रकाशन (टैग: ' 7. 0`).
2. प्रदाता सीआई:
स्थानीय स्तर पर/कंटेनर में सेवा बढ़ाना संबंधित अनुबंध ('प्रोड '/' स्टेजिंग') सत्यापन - दलाल में स्थिति का प्रकाशन।
3. रिलीज़ गेट:
बकाया अनुबंध होने पर प्रदाता की तैनाती अवरुद्ध है।
4. नाइटली मैट्रिक्स:
संगतता मैट्रिक्स 'उपभोक्ता संस्करण × प्रदाता संस्करण'; रिपोर्ट और अलार्म।
9) डोमेन द्वारा प्रथाओं के उदाहरण
9. 1 REST: कर्सर पैगिनेशन (अनुबंध अपरिवर्तनीय)
प्रतिक्रिया में 'आइटम []', 'अगला _ कर्सर' (nullable), 'सीमा', 'कुल' (वैकल्पिक) शामिल हैं।
इनवेरिएंट्स: 'लेन (आइटम) लिमिट', उसी 'कर्सर' के साथ बार-बार कॉल करें - पहचान सेट।
त्रुटि अगर 'cursor' और 'page' दोनों निर्दिष्ट हैं.
9. 2 POST idempotency
अनुबंध के लिए 'Idempotency-Key' हेडर की आवश्यकता होती है।
Invariant: एक ही कुंजी के साथ एक दोहराया क्वैरी समान 'id '/स्थिति लौटाता है.
9. 3 घटनाएँ: आदेश की गारंटी
संविदा में विभाजन कुंजी है 'पार्टीशन _ key = user_id'।
अपरिवर्तनीय: 'अनुक्रम' कुंजी के भीतर नीरस रूप से बढ़ ता है; उपभोक्ता को रिप्ले को संभालना चाहिए।
10) अनुबंधों में सुरक्षा और गोपनीयता
उदाहरणों में व्यक्तिगत डेटा/रहस्य शामिल न करें - केवल सिंथेटिक्स।
अनिवार्य सुरक्षा हेडर ठीक करें: 'प्राधिकरण', 'एक्स-सिग्नेचर', 'रिप्ले-प्रिवेंशन'।
वेबहुक के लिए - हस्ताक्षर और प्रतिक्रिया अनुबंध '2xx '/रिट्रे।
संविदा परीक्षणों के लॉग में - संवेदनशील क्षेत्रों का मुखौटा।
11) उपकरण
पैक्ट/पैक्टफ्लो/पैक्ट ब्रोकर - एचटीटीपी/संदेश अनुबंध, संगतता मैट्रिक्स।
OpenAPI/AsyncAPI - विनिर्देश + परीक्षण जनरेटर (Dredd, Schemathesis)।
कराटे/REST आश्वासन - REST अनुबंधों की परिदृश्य जाँच।
प्रोटोबुफ/जीआरपीसी - 'बफ', 'प्रोटोलिंट', संगतता परीक्षण; धाराओं में एवरो/JSON/प्रोटो के लिए स्कीमा रजिस्ट्री।
ग्राफक्यूएल (ग्राफकल-कॉम्पैट), स्नैपशॉट सर्किट परीक्षणों के लिए अनुरूपता परीक्षण।
12) प्रदाता सत्यापन का छद्म कोड (सरलीकृत)
python def verify_contract(provider, contract):
for case in contract["cases"]:
req = build_request(case["request"])
res = provider.handle(req) # локально/контейнер assert match_status(res.status, case["response"]["status"])
assert match_headers(res.headers, case["response"].get("headers", {}))
assert match_body(res.body, case["matchers"], allow_extra_fields=True)
for neg in contract.get("error_cases", []):
res = provider.handle(build_request(neg["request"]))
assert res.status == neg["response"]["status"]
assert res.json.get("error_code") == neg["response"]["body"]["error_code"]
13) एंटी-पैटर्न
"पोस्टमैन स्क्रीनशॉट एक अनुबंध है": कोई संस्करण/विशिष्ट मिलान/स्वचालित सत्यापन नहीं।
ओवरस्नैपिंग: अनुबंध प्रकार/पैटर्न के बजाय सटीक मूल्यों को ठीक करता है - गलत गिरता है।
विभिन्न क्षेत्रों/चैनलों के लिए एक सामान्य अनुबंध: परिवर्तनशीलता (झंडे, भू-नियम) की अनदेखी करता है
ब्रोकर/मैट्रिक्स के बिना अनुबंध: यह समझना असंभव है कि कौन से संस्करण संगत हैं।
अनुबंधों के बजाय e2e पर शर्त: धीमी, महंगी, अस्थिर।
कोई नकारात्मक/अपरिवर्तनीय मामले: केवल "ग्रीन ट्रैक" का परीक्षण किया जाता है।
14) अवलोकन और संचालन
ब्रोकर + डैशबोर्ड को निर्यात की स्थिति "स्वास्थ्य अनुबंध"।
अलर्ट: 'प्रॉड' अनुबंधों के खिलाफ प्रदाता में नई बूंदें, घटनाओं में "अज्ञात क्षेत्र" में वृद्धि।
ट्रेस: 'contract _ id', 'version', 'disection _ id' सत्यापन लॉग में।
15) अवसाद प्रक्रिया
1. एक क्षेत्र/समापन बिंदु (नॉन-ब्रेकिंग) जोड़ें।
2. पुराने को विनिर्देश के रूप में चिह्नित करें, तारीखों की घोषणा करें।
3. उपभोक्ताओं को लॉग/ब्रोकर द्वारा ट्रैक करना; माइग्रेशन गाइड।
4. स्टेज (ड्राई-रन) में "छाया" इनकार सक्षम करें, फिर लागू करें।
5. शून्य उपयोग और संगतता के बाद मिटाएँ।
16) आर्किटेक्ट चेकलिस्ट
1. उपभोक्ताओं और उनके मालिकों ने पहचान की? अनुबंध किए जा रहे हैं?
2. क्या पर्यावरण टैग के साथ एक दलाल और एक संगतता मैट्रिक्स है?
3. क्या अनुबंध में नकारात्मक और आक्रमणकारी (मूर्खता, संकेतक, छंटनी) शामिल हैं?
4. क्या स्कीमा रजिस्ट्री और संगतता मोड घटनाओं के लिए कॉन्फ़िगर किया गया है?
5. पाइपलाइन उत्पादन संविदाओं के उल्लंघन के मामले में प्रदाता की रिहाई को अवरुद्ध करती है?
6. क्या मूल्यह्रास प्रक्रिया और विकास नीति का वर्णन किया गया
7. स्टैब अनुबंधों से उत्पन्न होते हैं, क्या स्थानीय घटना जनरेटर हैं?
8. क्या पीडी मास्किंग और अनिवार्य सुरक्षा शीर्षक प्रलेखित है?
9. संविदाओं पर मेट्रिक्स/अलर्ट जुड़े हुए हैं, क्या बहाव रिपोर्ट हैं?
10. CI में दोनों पक्षों (उपभोक्ता और प्रदाता) द्वारा संविदाओं की समीक्षा की जाती है?
निष्कर्ष
अनुबंध परीक्षण लंबवत कलाकृतियों में बातचीत के बारे में "सच्चाई" को स्थानांतरित करता है और एकीकरण को अनुमानित करता है। सीडीसी, अनुबंध ब्रोकर और योजना विकास अनुशासन एक प्रबंधित प्रक्रिया के साथ "ब्रेकिंग आश्चर्य" की जगह ले रहे हैं: त्वरित जांच, स्पष्ट आक्रमणकारी और पारदर्शी संस्करण संगतता। यह e2e की लागत को कम करता है, रिलीज को गति देता है और पूरे प्लेटफॉर्म की गुणवत्ता में सुधार करता है।