API टेस्टिंग के तरीक़ों की तुलना
API को कोई व्यक्ति अनुरोध भेजकर टेस्ट कर सकता है, स्क्रिप्ट रिस्पॉन्स पर एसर्ट करके, हर रिस्पॉन्स की प्रकाशित कॉन्ट्रैक्ट से तुलना करके, API की जगह मॉक खड़ी करके ताकि उसके उपभोक्ता टेस्ट हों, और उसे तब तक लोड करके जब तक वह धीमा या विफल न हो। हर तरीक़ा एक अलग सवाल का जवाब देता है, और जो टीम सिर्फ़ एक — आमतौर पर पहला — इस्तेमाल करती है, वह बाक़ी चार सवालों के बिना जवाब के शिप करती है।
यह गाइड पाँचों तरीक़ों को आमने-सामने रखती है: हर एक क्या पकड़ता है, क्या छोड़ता है, क्या लागत लेता है, और कौन-से प्रोटोकॉल नियम बदलते हैं। यह ऐसे मिश्रण पर ख़त्म होती है जो ज़्यादातर उत्पादों को सूट करता है, और उससे हटने के कारणों पर।
पाँच तरीक़े
- एक्सप्लोरेटरी अनुरोध — एक व्यक्ति क्लाइंट (Postman, cURL, ब्राउज़र टूल) में अनुरोध बनाता है, रिस्पॉन्स पढ़ता है और उन पर फ़ैसला करता है। शुरू करने में तेज़, अप्रत्याशित पकड़ता है, सेशन ख़त्म होने के बाद कुछ साबित नहीं करता।
- स्क्रिप्टेड फ़ंक्शनल टेस्ट — कोड जो अनुरोध भेजता है और स्टेटस, हेडर और बॉडी पर एसर्ट करता है, CI में चलता है। हर बार वही चीज़ें साबित करता है; सिर्फ़ वही पकड़ता है जिसके लिए लिखा गया।
- कॉन्ट्रैक्ट टेस्टिंग — हर रिस्पॉन्स API की स्पेसिफ़िकेशन (OpenAPI दस्तावेज़, JSON Schema, GraphQL स्कीमा) के विरुद्ध जाँचा जाता है, इसलिए जो फ़ील्ड टाइप बदले या ग़ायब हो, वह बिना किसी के एसर्शन लिखे टेस्ट फ़ेल करता है।
- मॉकिंग और सर्विस वर्चुअलाइज़ेशन — एक स्टैंड-इन चुने हुए रिस्पॉन्स लौटाता है ताकि API के बनने से पहले उसके उपभोक्ता टेस्ट हों, और त्रुटि-पथ (500, 429, टाइमआउट, विकृत बॉडी) माँग पर पैदा किए जा सकें।
- लोड और परफ़ॉर्मेंस टेस्टिंग — यथार्थ डेटासेट के साथ कॉन्करेंट अनुरोध, ताकि लोड में लेटेंसी, थ्रूपुट और एरर रेट मापा जाए — JMeter या k6 जैसे टूल से।
आज़माएँ: API रिक्वेस्ट बिल्डर आज़माएँ: REST API टेस्टर आज़माएँ: API रिस्पॉन्स वैलिडेटर
हर एक क्या पकड़ता है — और क्या छोड़ता है
ये तरीक़े प्रतिद्वंद्वी नहीं हैं; ये अलग-अलग विफलता-वर्ग ढकते हैं। एक्सप्लोरेटरी टेस्टिंग ग़लत बिज़नेस लॉजिक, भ्रामक एरर मैसेज और अनडॉक्यूमेंटेड व्यवहार पकड़ती है, और रिग्रेशन छोड़ देती है क्योंकि उसे कोई दोबारा नहीं चलाता। स्क्रिप्टेड टेस्ट स्क्रिप्ट किए गए पथों पर रिग्रेशन पकड़ते हैं और बाक़ी सब छोड़ देते हैं। कॉन्ट्रैक्ट टेस्टिंग API के आकार में ब्रेकिंग बदलाव पकड़ती है — वह दोष-वर्ग जो उपयोगकर्ताओं के हाथों में पहले से मौजूद मोबाइल ऐप तोड़ देता है — और सही आकार के भीतर ग़लत मान छोड़ देती है। मॉक उपभोक्ताओं को अलग से टेस्ट करने और त्रुटि-पथ मजबूर करने देते हैं, और असली API का वास्तविक व्यवहार छोड़ देते हैं — इसीलिए कॉन्ट्रैक्ट को मॉक को सच से बाँधना चाहिए। लोड टेस्टिंग क्षमता और कॉन्करेंसी की समस्याएँ पकड़ती है और फ़ंक्शनल समस्याएँ पूरी तरह छोड़ देती है।
- नए एंडपॉइंट में ग़लत बिज़नेस लॉजिक → एक्सप्लोरेटरी, फिर पता चलने पर स्क्रिप्टेड।
- किसी रिलीज़ में फ़ील्ड का नाम या टाइप बदला → कॉन्ट्रैक्ट टेस्टिंग।
- उपभोक्ता जो 429 या टाइमआउट को ग़लत संभालता है → मॉकिंग।
- क्वेरी जो एक उपयोगकर्ता के लिए ठीक है और सौ पर फ़ेल → लोड टेस्टिंग।
- ऐसी चीज़ में रिग्रेशन जो पिछले महीने काम करती थी → CI में स्क्रिप्टेड टेस्ट।
| तरीक़ा | पकड़ता हैएक उदाहरण विफलता के साथ | छोड़ता है |
|---|---|---|
| एक्सप्लोरेटरी टेस्टिंग | ग़लत बिज़नेस लॉजिक, भ्रामक एरर मैसेज, अनडॉक्यूमेंटेड व्यवहारनए एंडपॉइंट में ग़लत बिज़नेस लॉजिक (पता चलने पर फिर स्क्रिप्टेड) | रिग्रेशन, क्योंकि उसे कोई दोबारा नहीं चलाता |
| स्क्रिप्टेड टेस्ट | स्क्रिप्ट किए गए पथों पर रिग्रेशनऐसी चीज़ में रिग्रेशन जो पिछले महीने काम करती थी, CI में पकड़ा गया | बाक़ी सब |
| कॉन्ट्रैक्ट टेस्टिंग | API के आकार में ब्रेकिंग बदलावरिलीज़ में फ़ील्ड का नाम या टाइप बदला | सही आकार के भीतर ग़लत मान |
| मॉकिंग | उपभोक्ता के दोष, उपभोक्ताओं को अलग से टेस्ट करके और त्रुटि-पथ मजबूर करकेउपभोक्ता जो 429 या टाइमआउट को ग़लत संभालता है | असली API का वास्तविक व्यवहार, इसलिए कॉन्ट्रैक्ट को मॉक को सच से बाँधना चाहिए |
| लोड टेस्टिंग | क्षमता और कॉन्करेंसी की समस्याएँक्वेरी जो एक उपयोगकर्ता के लिए ठीक है और सौ पर फ़ेल | फ़ंक्शनल समस्याएँ, पूरी तरह |
कॉन्ट्रैक्ट टेस्टिंग: स्पेसिफ़िकेशन ही ऑरेकल
API कॉन्ट्रैक्ट हर ऑपरेशन का मशीन-पठनीय विवरण है: पाथ और मेथड, पैरामीटर, अनुरोध और रिस्पॉन्स स्कीमा, स्टेटस कोड, ऑथेंटिकेशन। HTTP API के लिए OpenAPI आम फ़ॉर्मेट है; GraphQL अपना स्कीमा साथ रखता है; SOAP के पास WSDL है। कॉन्ट्रैक्ट होने पर टेस्ट को हर फ़ील्ड के लिए हाथ से लिखे एसर्शन नहीं चाहिए — वैलिडेटर जाँचता है कि रिस्पॉन्स उस स्टेटस कोड के स्कीमा से मेल खाता है, और कोई भी बहाव विफलता है।
कॉन्ट्रैक्ट टेस्टिंग दो दिशाओं में काम करती है। प्रोवाइडर-साइड, API के रिस्पॉन्स उसकी अपनी स्पेसिफ़िकेशन के विरुद्ध वैलिडेट होते हैं, जिससे वह मामला पकड़ा जाता है जहाँ इम्प्लीमेंटेशन दस्तावेज़ से भटक गया। कंज़्यूमर-साइड (कंज़्यूमर-ड्रिवन कॉन्ट्रैक्ट), हर उपभोक्ता API का वह उपसमुच्चय दर्ज करता है जिस पर वह निर्भर है, और बदलाव शिप होने से पहले प्रोवाइडर हर उपभोक्ता की अपेक्षाओं के विरुद्ध टेस्ट होता है। पहला सस्ता है और ज़्यादातर टूट पकड़ता है; दूसरा वह है जिसमें कई क्लाइंट वाला प्लेटफ़ॉर्म बढ़ता है।
- पहले स्पेसिफ़िकेशन को ही वैलिडेट करें — अमान्य OpenAPI दस्तावेज़ अर्थहीन टेस्ट परिणाम देता है।
- एरर रिस्पॉन्स भी कॉन्ट्रैक्ट के विरुद्ध टेस्ट करें; 4xx और 5xx बॉडी 200 से ज़्यादा भटकती हैं।
- पहले टेस्ट केस स्पेसिफ़िकेशन से जनरेट करें, फिर वे बिज़नेस-नियम केस जोड़ें जो जनरेटर नहीं जान सकता।
आज़माएँ: OpenAPI वैलिडेटर आज़माएँ: API कॉन्ट्रैक्ट वैलिडेटर आज़माएँ: रिस्पॉन्स कॉन्ट्रैक्ट कम्पेरेटर आज़माएँ: OpenAPI → टेस्ट केस
मॉकिंग: उपभोक्ता और त्रुटि-पथों की टेस्टिंग
मॉक असली API का स्टैंड-इन है जो आपके चुने रिस्पॉन्स लौटाता है। इसी से असली API बनने से पहले फ़्रंट-एंड या निर्भर सर्विस टेस्ट होती है, इसी से वह थर्ड-पार्टी सर्विस बदली जाती है जिसे टेस्ट में कॉल नहीं किया जा सकता (पेमेंट गेटवे, सरकारी रजिस्ट्री), और — सबसे मूल्यवान — इसी से त्रुटि-पथ इच्छानुसार पैदा होते हैं: Retry-After हेडर के साथ 503, 429, 30 सेकंड बाद आने वाला रिस्पॉन्स, ऐसी बॉडी जो वैध JSON है पर ग़लत आकार की।
मॉक का जोखिम यह है कि वह उपभोक्ता से सहमत हो, वास्तविकता से नहीं। दो आदतें इसे सीमित रखती हैं: मॉक उसी कॉन्ट्रैक्ट से जनरेट करें जिसके विरुद्ध प्रोवाइडर टेस्ट होता है, और रिलीज़ से पहले स्टेजिंग एनवायरनमेंट में असली API के विरुद्ध कम से कम एक टेस्ट चलाएँ।
आज़माएँ: Mock API रिस्पॉन्स जनरेटर आज़माएँ: Mock एरर पेलोड जनरेटर आज़माएँ: API स्टेटस कोड सिम्युलेटर
REST, GraphQL, SOAP और वेबहुक: क्या बदलता है
- HTTP पर REST — स्टेटस कोड अर्थ रखते हैं (RFC 9110), इसलिए टेस्ट उन पर एसर्ट करता है; रिसोर्स के URL होते हैं, इसलिए कैशिंग और आइडेम्पोटेंसी हर मेथड के लिए टेस्ट हो सकती है; एरर एक दस्तावेज़ीकृत आकार में हों, आदर्शतः RFC 9457 का Problem Details फ़ॉर्मेट।
- GraphQL — एक एंडपॉइंट, आमतौर पर एक स्टेटस कोड (200) एरर के लिए भी, जो बॉडी के errors ऐरे में रहते हैं। टेस्ट को स्टेटस पर नहीं, बॉडी पर एसर्ट करना होगा; कॉन्ट्रैक्ट टेस्टिंग के लिए स्कीमा हमेशा उपलब्ध है; और क्वेरी की गहराई व जटिलता को लोड टेस्ट चाहिए क्योंकि एक अनुरोध मनमाने ढंग से महँगा हो सकता है।
- SOAP — WSDL से वर्णित XML एनवलप; XSD के विरुद्ध वैलिडेशन ही कॉन्ट्रैक्ट टेस्ट है; फ़ॉल्ट संरचित हैं; टूलिंग पुरानी है पर कॉन्ट्रैक्ट-अनुशासन चारों में सबसे सख़्त है।
- वेबहुक — API आपको कॉल करता है, इसलिए टेस्टिंग को ऐसा रिसीवर चाहिए जो आया हुआ दर्ज करे, सिग्नेचर जाँचे (आमतौर पर साझा सीक्रेट से बॉडी पर HMAC), और रीट्राई व क्रम सत्यापित करे। उपभोक्ता को डुप्लिकेट डिलीवरी के लिए भी टेस्ट करना होगा, क्योंकि at-least-once ही सामान्य है।
आज़माएँ: GraphQL क्वेरी टेस्टर आज़माएँ: SOAP रिक्वेस्ट टेस्टर आज़माएँ: Webhook टेस्टर आज़माएँ: Webhook सिग्नेचर एनालाइज़र
मिश्रण चुनना
ज़्यादातर उत्पादों के लिए मिश्रण है: API स्तर पर CI में चलने वाला कॉन्ट्रैक्ट-वैलिडेटेड स्क्रिप्टेड सूट (रीढ़), हर नए या बदले एंडपॉइंट पर एक्सप्लोरेटरी सेशन, हर बाहरी निर्भरता और त्रुटि-पथों के लिए मॉक, और लॉन्च से पहले व किसी हॉट पाथ के बदलाव के बाद असली संख्याओं के साथ लोड टेस्ट। अकेले एक्सप्लोरेटरी अनुरोध — जिनसे व्यवहार में ज़्यादातर API टेस्टिंग शुरू होती है — उस मिश्रण का एक हिस्सा हों, पूरा नहीं।
डिफ़ॉल्ट से तब हटें जब API सार्वजनिक उत्पाद हो (कंज़्यूमर-ड्रिवन कॉन्ट्रैक्ट और वर्ज़निंग टेस्ट जोड़ें), जब वह किसी विनियमित प्रक्रिया के सामने हो (OWASP API Security Top 10 से सुरक्षा टेस्ट जोड़ें, ख़ासकर ऑब्जेक्ट-लेवल ऑथराइज़ेशन), या जब वह आंतरिक हो और रोज़ बदलता हो (कॉन्ट्रैक्ट टेस्ट पर ज़्यादा और हाथ से लिखे एसर्शन पर कम झुकें, क्योंकि वे बदलाव में टिकते हैं)।
आज़माएँ: Concurrent रिक्वेस्ट टेस्ट जनरेटर आज़माएँ: API ऑथेंटिकेशन टेस्टर
अक्सर पूछे जाने वाले सवाल
क्या API टेस्टिंग के लिए Postman काफ़ी है?
Postman और ऐसे क्लाइंट एक्सप्लोरेटरी अनुरोधों के लिए उत्कृष्ट हैं और सेव किए कलेक्शन को एसर्शन के साथ CI में चला सकते हैं, जो पहले दो तरीक़े कवर करता है। वे अपने आप स्पेसिफ़िकेशन के विरुद्ध कॉन्ट्रैक्ट वैलिडेशन, बड़े पैमाने पर त्रुटि-पथों की मॉकिंग या यथार्थ कॉन्करेंसी पर लोड टेस्टिंग नहीं देते; उनके लिए साथ में स्पेसिफ़िकेशन, मॉक लेयर और लोड टूल चाहिए।
कॉन्ट्रैक्ट टेस्टिंग और इंटीग्रेशन टेस्टिंग में क्या अंतर है?
इंटीग्रेशन टेस्टिंग असली API को कॉल करती है और डेटा व साइड-इफ़ेक्ट समेत असली व्यवहार एंड-टू-एंड जाँचती है। कॉन्ट्रैक्ट टेस्टिंग सिर्फ़ यह जाँचती है कि अनुरोध और रिस्पॉन्स सहमत आकार से मेल खाते हैं, और असली निर्भरता के बिना चल सकती है। कॉन्ट्रैक्ट टेस्ट तेज़ और ज़्यादा स्थिर हैं; इंटीग्रेशन टेस्ट वह पकड़ते हैं जो कॉन्ट्रैक्ट नहीं पकड़ सकते — ग़लत मान, ग़लत डेटा, ग़लत साइड-इफ़ेक्ट। ज़्यादातर सूट को दोनों चाहिए, पहले वाले कहीं ज़्यादा।
अगर हमारे पास स्टेजिंग एनवायरनमेंट है तो क्या फिर भी मॉक चाहिए?
हाँ, दो कारणों से। स्टेजिंग माँग पर त्रुटि-पथ नहीं दे सकता — आप असली पेमेंट गेटवे से नहीं कह सकते कि ठीक उसी क्षण टाइमआउट हो जब आपके टेस्ट को चाहिए — और स्टेजिंग की निर्भरताएँ साझा और धीमी हैं, जो टेस्ट को फ़्लेकी बनाती हैं। मॉक निश्चित, तेज़ टेस्ट देते हैं; स्टेजिंग वास्तविकता के विरुद्ध एक अंतिम पुष्टि देता है।
API एरर कैसे टेस्ट करने चाहिए?
हर दस्तावेज़ीकृत एरर रिस्पॉन्स का टेस्ट हो: स्टेटस कोड, बॉडी का आकार (आदर्शतः RFC 9457 Problem Details), और यह कि कोई संवेदनशील विवरण लीक न हो — कोई स्टैक ट्रेस, SQL या आंतरिक होस्टनेम नहीं। फिर अनडॉक्यूमेंटेड: विकृत JSON, ग़लत कंटेंट टाइप, बहुत बड़ी बॉडी, गुम ऑथेंटिकेशन, समाप्त टोकन। त्रुटि-पथ ही वह जगह है जहाँ ज़्यादातर सुरक्षा निष्कर्ष मिलते हैं।
टीम किस तरीक़े से शुरू करे?
कॉन्ट्रैक्ट से। पहले OpenAPI दस्तावेज़ लिखना या वैलिडेट करना हर दूसरे तरीक़े को टेस्ट करने के लिए कुछ देता है, पहले स्क्रिप्टेड केस और मॉक जनरेट करता है, और डिज़ाइन के सवालों — स्टेटस कोड, एरर के आकार, पेजिनेशन — का जवाब तीन अलग तरीक़ों से लागू होने से पहले देने को मजबूर करता है।
संदर्भ
- RFC 9110: HTTP SemanticsHTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
- OpenAPI SpecificationREST API के वर्णन का मानक: पाथ, ऑपरेशन, पैरामीटर, स्कीमा, रिस्पॉन्स और सिक्योरिटी स्कीम।
- GraphQL SpecificationGraphQL क्वेरी भाषा और टाइप सिस्टम, वैलिडेशन नियम और एक्ज़ीक्यूशन सेमांटिक्स।
- RFC 9457: Problem Details for HTTP APIsमशीन-रीडेबल API एरर के लिए application/problem+json फ़ॉर्मेट (type, title, status, detail, instance)।
- Postman Docsरिक्वेस्ट भेजने, टेस्ट स्क्रिप्ट लिखने और कलेक्शन चलाने वाले API क्लाइंट का आधिकारिक दस्तावेज़।
- OWASP API Security Top 10 (2023)API की दस सबसे आम कमज़ोरियाँ: ऑब्जेक्ट-लेवल ऑथराइज़ेशन का टूटना, ऑथेंटिकेशन का टूटना, अनियंत्रित रिसोर्स खपत और अन्य।
- Apache JMeter User's ManualJMeter से लोड टेस्ट कैसे बनाएँ, पैरामीटराइज़ करें और चलाएँ, और उसके लिसनर व रिपोर्ट कैसे पढ़ें।
अभ्यास
डिलीवरी प्लेटफ़ॉर्म के API के लिए टेस्टिंग का मिश्रण चुनें
आप एक काल्पनिक ग्रॉसरी डिलीवरी प्लेटफ़ॉर्म की API टीम में अकेले टेस्टर हैं। इसके REST API को तीन तरह के क्लाइंट कॉल करते हैं: Android और iOS ऐप, GraphQL एंडपॉइंट के ज़रिए पार्टनर दुकानों का डैशबोर्ड, और एक थर्ड-पार्टी पेमेंट गेटवे जो वेबहुक भेजता है। पिछली तिमाही में आठ समस्याएँ टेस्टिंग से बचकर निकल गईं, और एक राष्ट्रीय प्रमोशन कैंपेन पाँच हफ़्ते से थोड़ा ज़्यादा समय में शुरू होता है। नीचे के material में है कि API को कौन कॉल करता है, आज वह कैसे टेस्ट होता है, आठ समस्याएँ I1 से I8, और टीम लीड का एक सवाल।
गाइड के पाँच तरीक़ों — एक्सप्लोरेटरी अनुरोध, स्क्रिप्टेड फ़ंक्शनल टेस्ट, कॉन्ट्रैक्ट टेस्टिंग, मॉकिंग और लोड टेस्टिंग — और REST, GraphQL व वेबहुक के बारे में उसकी बातों के साथ काम करें। काग़ज़ और पेन काफ़ी हैं; 30–45 मिनट रखें। अगर आप I7 का मतलब ख़ुद देखना चाहें, तो HMAC जनरेटर में किसी भी सीक्रेट से एक छोटी sample बॉडी साइन करें, बॉडी का एक अक्षर बदलें, और गाइड के Webhook सिग्नेचर एनालाइज़र से दोनों वर्ज़न जाँचें।
Grocery delivery प्लेटफ़ॉर्म (काल्पनिक) - REST API v2, छह developers और एक tester
आज: सोमवार 5 अक्टूबर 2026। एक राष्ट्रीय promotion campaign गुरुवार 12 नवंबर 2026
को शुरू होता है।
API को कौन कॉल करता है
Android और iOS ऐप ग्राहक धीरे-धीरे update करते हैं; पिछले छह महीनों के ऐप
versions अब भी इस्तेमाल में हैं
Partner dashboard दुकानों की order स्क्रीन; GraphQL एंडपॉइंट POST /graphql
इस्तेमाल करता है
Payment gateway हमारा API भुगतान लेने के लिए इसे कॉल करता है। यह हमें
(third party) POST /webhooks/payments पर payment.succeeded या
payment.failed के साथ वापस कॉल करता है; हर event की एक
unique id और एक X-Signature header (shared secret से
बॉडी का HMAC-SHA256) होता है। इसके documentation के
अनुसार events कम से कम एक बार (at least once) deliver
होते हैं।
API आज कैसे टेस्ट होता है
हर दो हफ़्ते की रिलीज़ से पहले tester एक Postman collection के अनुरोध हाथ से
भेजता है और रिस्पॉन्स पढ़ता है। CI में कोई API टेस्ट नहीं चलता।
एक OpenAPI दस्तावेज़ है; उसे आख़िरी बार पाँच महीने पहले update किया गया था।
Gateway का sandbox हर test payment को तुरंत approve कर देता है।
पिछली तिमाही में क्या ग़लत हुआ (I7 code review में मिला, बाक़ी production में)
I1 Release 2.14 ने GET /api/v2/cart का एक field rename किया और उसी release में
web front end बदला। इसके बाद Android 5.2 हर delivery fee को 0.00 दिखाने लगा।
2.13 {"subtotal": 84.50, "deliveryFee": 9.00, "total": 93.50}
2.14 {"subtotal": 84.50, "delivery_fee": 9.00, "total": 93.50}
I2 Gateway ने 40 सेकंड बाद जवाब दिया। हमारे API ने 30 सेकंड बाद इंतज़ार बंद कर
500 लौटाया, और ऐप ने "Payment failed" दिखाया। ग्राहकों ने फिर भुगतान किया,
लेकिन पहला भुगतान हो चुका था: उनसे दो बार पैसा कटा।
I3 2.15 में नया: POST /api/v2/cart/promo। Code WELCOME50 हर ग्राहक के लिए एक बार
valid है, लेकिन किसी ग्राहक के दूसरे order पर वह फिर स्वीकार हो गया।
I4 पिछले campaign की शाम की peak पर GET /api/v2/orders (order history) को 20
सेकंड से ज़्यादा लगे, फिर उसने 25 मिनट तक 504 लौटाया। हर test ग्राहक के लगभग
30 orders हैं; production में पुराने ग्राहकों के 2,000 तक orders हैं।
I5 एक बदलाव के बाद dashboard ने 100 से ज़्यादा open orders वाली हर दुकान को दो
दिन तक ख़ाली order सूची दिखाई। Dashboard का health check सिर्फ़ status code
देखता है:
HTTP/1.1 200 OK
{"data": {"storeOrders": null},
"errors": [{"message": "Result too large", "path": ["storeOrders"]}]}
I6 Gateway ने वही payment.succeeded event दो बार deliver किया (एक retry)। Order
दो बार paid mark हुआ और दो invoices बने।
I7 POST /webhooks/payments बिना X-Signature header वाला अनुरोध भी स्वीकार करता है:
URL जानने वाला कोई भी व्यक्ति किसी order को paid mark कर सकता है।
I8 GET /api/v2/stores/{id}/products का filter inStock=true 2.12 में काम करता था
और 2.13 में टूट गया: sold-out products सूची में आए। उस release के हाथ से चले
पास में filters शामिल नहीं थे।
टीम लीड पूछते हैं
"Campaign से पहले, क्या हम Postman में हाथ से टेस्टिंग जारी रखें और बस एक
दूसरा tester जोड़ लें?"- I1 से I8 तक हर समस्या के लिए वह तरीक़ा बताइए जो रिलीज़ से पहले उसे सबसे ज़्यादा संभावना से पकड़ता, और एक वाक्य में बताइए कि Postman का हाथ से चलाया गया पास उसे क्यों चूक गया।
- GraphQL वाली समस्या और दोनों वेबहुक समस्याओं के लिए लिखें कि टेस्ट को क्या एसर्ट करना या पैदा करना होगा, जो REST का साधारण स्टेटस-कोड चेक नहीं करता।
- आपके चुने हर तरीक़े के लिए एक चीज़ बताइए जो वह इस उत्पाद में फिर भी छोड़ देगा, और मिश्रण का कौन-सा दूसरा हिस्सा वह कमी पूरी करता है।
- टीम का मिश्रण प्रस्तावित करें: हर बिल्ड पर क्या चलता है, हर नए या बदले एंडपॉइंट के लिए, हर रिलीज़ से पहले और कैंपेन से पहले क्या; यह उत्पाद गाइड के डिफ़ॉल्ट मिश्रण से कहाँ हटता है; और आज से आप सबसे पहले क्या करेंगे।
- टीम लीड के सवाल का जवाब तीन-चार वाक्यों में दें।
मॉडल उत्तर दिखाएँ
पहले पैटर्न। आज API को एक ही तरीक़ा मिलता है — एक्सप्लोरेटरी अनुरोध — और वह भी असली exploration नहीं: हर रिलीज़ से पहले वही collection हाथ से दोहराया जाता है। ज़्यादा से ज़्यादा यह I3, I7 और, काफ़ी बड़ी test दुकान हो तो, I5 पकड़ सकता था। बाक़ी हर समस्या के लिए ऐसा तरीक़ा चाहिए था जो टीम इस्तेमाल नहीं करती। नीचे का मॉडल जवाब हर समस्या के लिए वह तरीक़ा बताता है जो रिलीज़ से पहले उसे सबसे ज़्यादा संभावना से पकड़ता, और यह कि हाथ से चला पास उसे क्यों चूका; फिर यह कि हर तरीक़ा क्या छोड़ता है, मिश्रण, और टीम लीड को जवाब।
I1 — कॉन्ट्रैक्ट टेस्टिंग, प्रोवाइडर-साइड। अगर GET /api/v2/cart का हर रिस्पॉन्स CI में OpenAPI दस्तावेज़ के विरुद्ध वैलिडेट हो, तो deliveryFee के ग़ायब होते ही बिल्ड फ़ेल हो जाता है — बशर्ते स्कीमा deliveryFee को required बताता हो; यह जाँच लें, क्योंकि जिस स्कीमा के सभी फ़ील्ड optional हैं वह rename के बाद का रिस्पॉन्स स्वीकार कर लेता है। हाथ से चला पास इसे इसलिए चूका कि "delivery_fee": 9.00 किसी व्यक्ति को बिल्कुल ठीक लगता है, और उसी रिलीज़ में बदले web front end में कोई समस्या नहीं दिखी। इंस्टॉल हुए ऐप ही वजह हैं कि इस टीम को कंज़्यूमर-ड्रिवन कॉन्ट्रैक्ट भी चाहिए: इस्तेमाल में मौजूद हर ऐप वर्ज़न वे फ़ील्ड दर्ज करता है जिन्हें वह पढ़ता है, और प्रोवाइडर का जो बदलाव उनमें से किसी को तोड़े, वह शिप होने से पहले फ़ेल होता है। जिस फ़ील्ड का नाम बदलना ज़रूरी हो, उसे तब तक दोनों नामों से, या API के नए वर्ज़न में, भेजा जाता है जब तक पुराने ऐप इस्तेमाल से बाहर न हो जाएँ।
I2 — मॉकिंग। गेटवे का sandbox हर भुगतान तुरंत approve करता है, इसलिए न हाथ से भेजा अनुरोध और न स्टेजिंग पर चला टेस्ट ऐसा गेटवे पैदा कर सकता है जो 40 सेकंड बाद जवाब दे। गेटवे का मॉक यह कर सकता है, और साथ में बाक़ी त्रुटि-पथ भी: कोई जवाब ही नहीं, Retry-After हेडर के साथ 503, 429, और ऐसी बॉडी जो वैध JSON है पर ग़लत आकार की। भुगतान का नतीजा अज्ञात होने पर API क्या करे, यह टीम के साथ तय होना चाहिए — जैसे भुगतान को pending बताए और विफलता बताने के बजाय गेटवे से उसकी स्थिति पूछे — और टेस्ट वही एसर्ट करता है जो ग्राहक के लिए मायने रखता है: एक order, एक बार पैसा कटना। फिर टेस्ट हर बिल्ड पर CI में मॉक के विरुद्ध चलता है। हर रिलीज़ से पहले, स्टेजिंग से असली sandbox के विरुद्ध एक रन पुष्टि करता है कि मॉक अब भी गेटवे जैसा व्यवहार करता है।
I3 — एक्सप्लोरेटरी टेस्टिंग, फिर स्क्रिप्टेड टेस्ट। कॉन्ट्रैक्ट टेस्ट दूसरी छूट को पास कर देता है, क्योंकि रिस्पॉन्स का आकार बिल्कुल सही है: यह नए एंडपॉइंट में ग़लत बिज़नेस लॉजिक है। जो टेस्टर "हर ग्राहक के लिए एक बार वाला नियम तोड़ो" जैसे charter के साथ POST /api/v2/cart/promo को explore करता है, वह code को दूसरे order पर, पहला order रद्द करने के बाद, एक ही पल में दो devices से, और छोटे अक्षरों (welcome50) में आज़माता है। हाथ से चला पास एक तय collection दोहराता है, और नया नियम ठीक वही है जो उसमें नहीं होता: हाथ से अनुरोध भेजना explore करना नहीं है। मिला हर केस स्क्रिप्टेड टेस्ट बनता है, ताकि नियम ठीक बना रहे।
I4 — यथार्थ डेटासेट के साथ लोड टेस्टिंग। हाथ से भेजे अनुरोध इसे नहीं दिखा सकते: एक व्यक्ति एक बार में एक अनुरोध भेजता है, लगभग 30 orders वाले test ग्राहकों के लिए, जबकि इस failure के लिए एक ही समय पर ऐसे बहुत-से ग्राहक चाहिए जिनके 2,000 तक orders हों। Production जैसी order संख्या वाला test data बनाएँ, टेस्ट से पहले product owner के साथ लक्ष्य तय करें (अपेक्षित peak पर एक response time और एक error rate), और टेस्ट इतनी जल्दी चलाएँ कि जो मिले उसे ठीक करके 12 नवंबर से पहले दोबारा चलाया जा सके — और order history में किसी भी बदलाव के बाद फिर, क्योंकि वह हॉट पाथ है। लोड टेस्ट यह नहीं बताता कि सूची में दिखे orders सही हैं या नहीं।
I5 — स्क्रिप्टेड टेस्ट जो GraphQL बॉडी पर एसर्ट करें। GraphQL सर्वर किसी फ़ील्ड के फ़ेल होने पर भी आमतौर पर 200 देता है और failure को errors ऐरे में रखता है, इसलिए स्टेटस कोड का चेक — डैशबोर्ड का health check हो या कोई टेस्ट — हरा ही रहता है। टेस्ट एसर्ट करता है कि errors मौजूद नहीं है और data.storeOrders अपेक्षित orders वाली सूची है, और वह उस बिंदु के दोनों ओर की test दुकानों के साथ चलता है जहाँ यह टूटा: 100 और 101 open orders (2-value boundary value analysis)। सिर्फ़ GraphQL स्कीमा के विरुद्ध कॉन्ट्रैक्ट चेक यह रिस्पॉन्स पास कर देगा: storeOrders error के साथ null लौटा, और GraphQL ऐसा सिर्फ़ उसी फ़ील्ड के लिए करता है जिसे स्कीमा nullable घोषित करता है। Health check को भी इसी तरह ठीक करें, और सबसे बड़े यथार्थ आकार की एक दुकान लोड टेस्ट में जोड़ें, क्योंकि GraphQL का एक अनुरोध बहुत महँगा हो सकता है।
I6 — वेबहुक टेस्ट जिसमें टेस्ट गेटवे की भूमिका निभाता है। "कम से कम एक बार deliver" का मतलब है कि डुप्लिकेट सामान्य हैं, गेटवे की ख़राबी नहीं, इसलिए रिसीवर को उन्हें संभालना होगा। टेस्ट वही साइन किया हुआ payment.succeeded event, उसी event id के साथ, दो बार भेजता है और एसर्ट करता है कि order एक बार paid हुआ और एक ही invoice बना; दूसरा टेस्ट events को अलग क्रम में भेजता है, जैसे उसी भुगतान के लिए payment.succeeded के बाद payment.failed, और टीम द्वारा तय नतीजा जाँचता है (लिखा न हो तो पूछें)। Sandbox से ठीक उसी पल retry नहीं करवाया जा सकता जब टेस्ट को चाहिए, इसलिए यह मॉकिंग है — गेटवे का व्यवहार माँग पर पैदा करना — जो CI में स्क्रिप्टेड टेस्ट के रूप में चलती है।
I7 — वेबहुक रिसीवर के स्क्रिप्टेड नेगेटिव टेस्ट, और एक सुरक्षा defect। तीन अनुरोध उस error status के साथ reject होने चाहिए जो टीम दस्तावेज़ में लिखे (जैसे 401), और order में कोई बदलाव न हो: बिना X-Signature हेडर, ग़लत सीक्रेट से बना सिग्नेचर, और सही तरह साइन की गई बॉडी जो साइन करने के बाद बदली गई। आख़िरी वाला वही है जो HMAC जनरेटर वाला अभ्यास दिखाता है: एक अक्षर बदलने से सिग्नेचर बदल जाता है। Collection में सिर्फ़ गेटवे की वैध कॉल थीं, इसलिए हाथ से चले पास ने ऐसा अनुरोध कभी भेजा ही नहीं; जिस code review ने इसे पकड़ा वह static testing है, और स्क्रिप्टेड टेस्ट इसे ठीक बनाए रखता है। क्योंकि यह API पैसे का लेन-देन करता है और ग्राहकों का निजी डेटा रखता है, मिश्रण में OWASP API Security Top 10 2023 से टेस्ट जोड़ें, सबसे पहले ऑब्जेक्ट-लेवल ऑथराइज़ेशन: एक ग्राहक दूसरे ग्राहक का cart या orders न पढ़ सके, न बदल सके। सिर्फ़ उन्हीं सिस्टम को टेस्ट करें जिनकी आपको अनुमति है — यहाँ आपकी टीम का स्टेजिंग।
I8 — CI में स्क्रिप्टेड फ़ंक्शनल टेस्ट। यह रिग्रेशन है: 2.12 में काम करने वाला filter 2.13 में टूट गया, ऐसी रिलीज़ में जिसके हाथ से चले पास में संयोग से filters नहीं थे। एक टेस्ट कि inStock=true शून्य stock वाला कोई product नहीं लौटाता, हर बिल्ड पर चलने वाले सूट में, उसी बदलाव पर फ़ेल हो जाता जिसने इसे तोड़ा। कॉन्ट्रैक्ट टेस्ट इसे पास कर देता है, क्योंकि सूची में sold-out product का आकार सही है।
इस उत्पाद में हर तरीक़ा फिर भी क्या छोड़ता है, और कमी कौन पूरी करता है। कॉन्ट्रैक्ट टेस्टिंग सही आकार के भीतर ग़लत मान छोड़ती है — I3, I8 और I5 का null — इसलिए स्क्रिप्टेड टेस्ट बिज़नेस नियमों पर एसर्ट करते हैं। स्क्रिप्टेड टेस्ट सिर्फ़ वही पकड़ते हैं जिसके लिए लिखे गए, और I3 जैसा नया नियम उनमें नहीं होता, इसलिए हर नए या बदले एंडपॉइंट पर एक्सप्लोरेटरी सेशन होता है। एक्सप्लोरेटरी सेशन ख़त्म होने के बाद कुछ साबित नहीं करता, इसलिए हर finding स्क्रिप्टेड टेस्ट बनती है। गेटवे का मॉक आपकी टीम से सहमत होता है, ज़रूरी नहीं कि गेटवे से, इसलिए वह गेटवे के अपने API documentation से बनाया जाता है और हर रिलीज़ से पहले स्टेजिंग से असली sandbox के विरुद्ध जाँचा जाता है। लोड टेस्ट फ़ंक्शनल सही-ग़लत के बारे में कुछ नहीं बताता — order history तेज़ और ग़लत दोनों हो सकती है — यह CI सूट कवर करता है।
मिश्रण। CI में हर बिल्ड पर: स्क्रिप्टेड API सूट, जिसके पहले रिग्रेशन टेस्ट में I1 से I8 हों; हर रिस्पॉन्स, एरर रिस्पॉन्स समेत, OpenAPI दस्तावेज़ के विरुद्ध वैलिडेट; बॉडी पर एसर्ट करने वाले GraphQL टेस्ट; I6 और I7 के वेबहुक टेस्ट; और त्रुटि-पथों के लिए गेटवे का मॉक। हर नए या बदले एंडपॉइंट के लिए: एक छोटा एक्सप्लोरेटरी सेशन, जिसकी findings स्क्रिप्टेड टेस्ट बनती हैं। हर रिलीज़ से पहले: स्टेजिंग से असली गेटवे sandbox के विरुद्ध एक रन। कैंपेन से पहले, और order history जैसे किसी हॉट पाथ के बदलाव के बाद: production जैसे डेटा के साथ लोड टेस्ट। यह गाइड का डिफ़ॉल्ट मिश्रण है, दो बदलावों के साथ। इंस्टॉल हुए ऐप API के साथ-साथ update नहीं किए जा सकते — पिछले छह महीनों के वर्ज़न अब भी इस्तेमाल में हैं — इसलिए उनके लिए API सार्वजनिक उत्पाद जैसा व्यवहार करता है और उसे कंज़्यूमर-ड्रिवन कॉन्ट्रैक्ट और अब भी supported हर ऐप वर्ज़न के टेस्ट चाहिए। और वह पैसा और निजी डेटा संभालता है, इसलिए उसे OWASP API Security Top 10 के टेस्ट चाहिए।
आज सबसे पहले: कॉन्ट्रैक्ट। पाँच महीने पुराने OpenAPI दस्तावेज़ को API के अनुसार update करें और वैलिडेट करें — पुराना या अमान्य दस्तावेज़ कॉन्ट्रैक्ट टेस्ट के हर नतीजे को अर्थहीन बना देता है — फिर उससे पहले स्क्रिप्टेड केस जनरेट करें (गाइड का OpenAPI → टेस्ट केस टूल मदद करता है) और वे बिज़नेस-नियम केस जोड़ें जो जनरेटर नहीं जान सकता, जैसे I3। 12 नवंबर तक लगभग पाँच हफ़्ते हैं, तो एक व्यावहारिक क्रम है: कॉन्ट्रैक्ट और CI में कॉन्ट्रैक्ट चेक; फिर I1 से I8, गेटवे मॉक और वेबहुक टेस्ट वाला स्क्रिप्टेड सूट; फिर लोड टेस्ट, इतनी जल्दी कि जो मिले उसे ठीक करके कैंपेन से पहले दोबारा चलाया जा सके।
टीम लीड को जवाब: "नहीं, क्योंकि हाथ से अनुरोध भेजने वाले और लोग पाँच में से सिर्फ़ एक सवाल का जवाब देते हैं। पिछली तिमाही की आठ समस्याओं में से हाथ से भेजे अनुरोध ज़्यादा से ज़्यादा I3, I7 और शायद I5 पकड़ सकते थे; वे I1 नहीं दिखा सकते थे, क्योंकि rename हुआ फ़ील्ड व्यक्ति को ठीक लगता है, न I2 और I6, क्योंकि sandbox धीमा जवाब या retry पैदा नहीं कर सकता, न I4, क्योंकि एक व्यक्ति कैंपेन की peak पैदा नहीं कर सकता — और वे जो पकड़ते हैं, उसकी बाद में दोबारा जाँच नहीं होती; I8 इसी तरह हुआ। Postman सेव किए collections को एसर्शन के साथ CI में चला सकता है, जो स्क्रिप्टेड टेस्ट कवर करता है, लेकिन कॉन्ट्रैक्ट वैलिडेशन, गेटवे के मॉक और लोड टेस्ट के लिए साथ में स्पेसिफ़िकेशन, मॉक लेयर और लोड टूल चाहिए। दूसरे टेस्टर का सबसे अच्छा इस्तेमाल नए एंडपॉइंट पर एक्सप्लोरेटरी सेशन और उनकी findings को स्क्रिप्टेड टेस्ट में बदलना है।"
अपना काम जाँचें। हर समस्या का एक तरीक़ा हो और यह कारण भी कि मौजूदा तरीक़ा उसे क्यों चूका। कारण लिखा हो तो दूसरी mapping भी ठीक हैं — जैसे I7 को एक्सप्लोरेटरी टेस्टिंग में रखना, बशर्ते आप जोड़ें कि सिर्फ़ स्क्रिप्टेड टेस्ट उसे ठीक बनाए रखता है, या I6 को स्क्रिप्टेड टेस्ट में, बशर्ते आप लिखें कि डुप्लिकेट delivery माँग पर पैदा करनी होगी। आपके मिश्रण में लिखा हो कि हर तरीक़ा कब चलता है (हर बिल्ड, हर नया एंडपॉइंट, हर रिलीज़, कैंपेन से पहले) और हर एक क्या छोड़ता है। ISTQB CTFL v4.0 की भाषा में: OpenAPI दस्तावेज़ test basis है और कॉन्ट्रैक्ट टेस्ट के लिए test oracle; एक्सप्लोरेटरी टेस्टिंग एक experience-based test technique है; CI सूट regression testing है, और I1 से I8 में से हर fix को पहले confirmation testing चाहिए; लोड टेस्ट performance efficiency (ISO/IEC 25010) की non-functional testing है; और स्टेजिंग से असली गेटवे के विरुद्ध रन system integration testing है।
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।
QA रोडमैप का हिस्सा
इस गाइड में बताए गए टूल्स
HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।
method, हेडर और JSON बॉडी पर पूरे नियंत्रण के साथ REST endpoint टेस्ट करें, फिर स्टेटस, हेडर और JSON path पर assertion लगाएँ।
API रिस्पॉन्स को अपेक्षाओं के आधार पर जाँचें: स्टेटस, ज़रूरी हेडर, JSON स्कीमा और फ़ील्ड नियम।
OpenAPI 3.x और Swagger 2.0 दस्तावेज़ों में संरचना की ग़लतियाँ तथा best-practice समस्याएँ जाँचें।
जाँचें कि कोई API रिक्वेस्ट/रिस्पॉन्स जोड़ा अपने OpenAPI कॉन्ट्रैक्ट का पालन करता है या नहीं: path, method, पैरामीटर, बॉडी और रिस्पॉन्स स्कीमा।
किसी असली API रिस्पॉन्स की तुलना अपेक्षित कॉन्ट्रैक्ट (उदाहरण या स्कीमा) से करें और breaking बनाम non-breaking अंतर देखें।
OpenAPI / Swagger स्पेसिफ़िकेशन से संरचित टेस्ट-केस मैट्रिक्स (positive, negative, auth, boundary) बनाएँ।
success, list, detail, error और empty केस के लिए पूरे mock API रिस्पॉन्स (स्टेटस, हेडर, JSON बॉडी) बनाएँ।
UI की एरर स्थितियाँ टेस्ट करने के लिए फ़ॉर्म और API हेतु फ़ील्ड-स्तरीय validation एरर पेलोड थोक में बनाएँ।
किसी भी endpoint पर variables और हेडर के साथ GraphQL क्वेरी तथा mutation चलाएँ और रिस्पॉन्स जाँचें।
SOAPAction हेडर के साथ SOAP 1.1 / 1.2 envelope भेजें और फ़ॉर्मेट किया हुआ XML रिस्पॉन्स देखें।
एक अनोखा URL पाएँ, उस पर webhook भेजें और method, हेडर, बॉडी तथा टाइमिंग रीयल टाइम में जाँचें।
अपने secret से webhook signature (HMAC-SHA256/SHA1, Stripe, GitHub, Shopify, Slack शैली) सत्यापित करें — लोकल रूप से।
किसी लक्षित endpoint के लिए सुरक्षित डिफ़ॉल्ट वाली concurrency टेस्ट स्क्रिप्ट बनाएँ (k6, JMeter JMX, Locust, Artillery, Node.js)।
ऐसा सार्वजनिक endpoint पाएँ जो कोई भी HTTP स्टेटस कोड लौटाए, वैकल्पिक देरी और कस्टम JSON बॉडी के साथ, ताकि क्लाइंट की error हैंडलिंग टेस्ट हो सके।