API टेस्टिंग क्या है? REST API कैसे टेस्ट करें
API टेस्टिंग यह जाँचती है कि कोई एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस हर रिक्वेस्ट — वैध, अवैध और दुर्भावनापूर्ण — के लिए सही डेटा, स्टेटस कोड और हेडर लौटाता है, और ऐसा भरोसेमंद तरीके से और तेज़ी से करता है। क्योंकि API यूज़र इंटरफ़ेस और डेटा के बीच बैठता है, यहाँ मिला बग आमतौर पर ठीक करने में सस्ता और छूट जाने पर ज़्यादा ख़तरनाक होता है, बनिस्बत स्क्रीन पर मिले बग के।
यह गाइड API टेस्ट के प्रकार, रिक्वेस्ट और रिस्पॉन्स की बनावट, REST एंडपॉइंट टेस्ट करने का दोहराने योग्य तरीका, सबसे ज़्यादा दिखने वाली गलतियाँ, और बिना कुछ इंस्टॉल किए ब्राउज़र से यह सब करने का तरीका बताती है।
API टेस्टिंग में क्या-क्या आता है
"API टेस्टिंग" एक गतिविधि नहीं बल्कि जाँचों का परिवार है। ज़्यादातर टीमें पहली तीन हर बदलाव पर और बाकी रिलीज़ से पहले चलाती हैं।
- फ़ंक्शनल टेस्टिंग — क्या हर एंडपॉइंट वैध इनपुट पर सही रिस्पॉन्स देता है? क्या POST रिकॉर्ड बनाता है, GET उसे लौटाता है, DELETE उसे हटाता है?
- वैलिडेशन और नेगेटिव टेस्टिंग — फ़ील्ड गायब हों, टाइप गलत हो, वैल्यू रेंज से बाहर हो, JSON बिगड़ा हो, टोकन एक्सपायर हो या रिक्वेस्ट बहुत बड़ी हो तो क्या होता है? API को साफ़ 4xx एरर देना चाहिए, कभी 500 नहीं।
- कॉन्ट्रैक्ट टेस्टिंग — क्या रिस्पॉन्स अब भी तय स्कीमा (OpenAPI, JSON Schema) से मेल खाता है? हटाए गए फ़ील्ड और बदले टाइप हर कंज़्यूमर को तोड़ते हैं।
- ऑथेंटिकेशन और ऑथराइज़ेशन — क्या प्रोटेक्टेड एंडपॉइंट अनाम रिक्वेस्ट (401) और गलत यूज़र या रोल की रिक्वेस्ट (403) को रिजेक्ट करते हैं?
- परफ़ॉर्मेंस — रिक्वेस्ट में कितना समय लगता है, पेलोड कितना बड़ा है, और कॉन्करेंट लोड में एंडपॉइंट कैसा व्यवहार करता है?
- सिक्योरिटी — हेडर, क्वेरी पैरामीटर और बॉडी में इंजेक्शन, रेट लिमिटिंग, और क्या एरर रिस्पॉन्स स्टैक ट्रेस या इंटरनल लीक करते हैं।
रिक्वेस्ट और रिस्पॉन्स की बनावट
हर HTTP एक्सचेंज के हिस्से एक जैसे होते हैं, और हर हिस्सा असर्ट करने लायक है।
- मेथड — GET पढ़ता है, POST बनाता है, PUT बदलता है, PATCH रिसोर्स का हिस्सा अपडेट करता है, DELETE हटाता है। गलत मेथड इस्तेमाल करना अपने आप में बग है।
- URL और क्वेरी स्ट्रिंग — रिसोर्स पाथ (/orders/42) और फ़िल्टर व पेजिंग (?status=paid&page=2)।
- रिक्वेस्ट हेडर — Content-Type सर्वर को बताता है आप क्या भेज रहे हैं, Accept आप क्या वापस चाहते हैं, Authorization आप कौन हैं।
- रिक्वेस्ट बॉडी — REST में आमतौर पर JSON; डॉक्यूमेंटेड स्कीमा से मेल खानी चाहिए।
- स्टेटस कोड — 2xx सफलता, 3xx रीडायरेक्ट, 4xx क्लाइंट की गलती, 5xx सर्वर फ़ेल। सटीक कोड मायने रखता है: 201 बनाया गया, 204 कोई कंटेंट नहीं, 400 ख़राब इनपुट, 404 नहीं मिला, 409 कॉन्फ़्लिक्ट, 422 वैलिडेशन एरर।
- रिस्पॉन्स हेडर — Content-Type, कैशिंग, रेट-लिमिट काउंटर, CORS और सिक्योरिटी हेडर।
- रिस्पॉन्स बॉडी — डेटा, या मशीन-रीडेबल कोड और इंसानी भाषा के मैसेज वाला एकसमान एरर ऑब्जेक्ट।
रिक्वेस्ट
भाग 1:POST भाग 2:/api/v1/orders HTTP/1.1 भाग 3:Host: api.example.com Content-Type: application/json Authorization: Bearer eyJhbGciOi... भाग 4:{"customerId": 7, "items": [{"sku": "A-100", "qty": 2}]}
रिस्पॉन्स
HTTP/1.1 भाग 5:201 Created भाग 6:Content-Type: application/json Location: /api/v1/orders/9021 भाग 7:{"id": 9021, "status": "pending", "total": 249.90}
- 1मेथड
POSTबनाता है; गलत मेथड इस्तेमाल करना अपने आप में बग है। - 2URL और क्वेरी स्ट्रिंगरिसोर्स पाथ, और फ़िल्टर व पेजिंग, जैसे:
/orders/42?status=paid&page=2 - 3रिक्वेस्ट हेडर
Content-Typeबताता है आप क्या भेज रहे हैं,Acceptआप क्या वापस चाहते हैं,Authorizationआप कौन हैं। - 4रिक्वेस्ट बॉडीREST में आमतौर पर JSON; डॉक्यूमेंटेड स्कीमा से मेल खानी चाहिए।
- 5स्टेटस कोडसटीक कोड मायने रखता है:
201बनाया गया,400ख़राब इनपुट,422वैलिडेशन एरर। - 6रिस्पॉन्स हेडरयहाँ
Content-TypeऔरLocation; साथ में कैशिंग, रेट-लिमिट काउंटर, CORS और सिक्योरिटी हेडर। - 7रिस्पॉन्स बॉडीडेटा, या मशीन-रीडेबल कोड और इंसानी भाषा के मैसेज वाला एकसमान एरर ऑब्जेक्ट।
पाठ संस्करण
POST /api/v1/orders HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOi...
{"customerId": 7, "items": [{"sku": "A-100", "qty": 2}]}
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/v1/orders/9021
{"id": 9021, "status": "pending", "total": 249.90}REST API स्टेप-बाय-स्टेप कैसे टेस्ट करें
- पहले कॉन्ट्रैक्ट पढ़ें। OpenAPI/Swagger डॉक्यूमेंट या API डॉक्स खोलें और हर एंडपॉइंट, उसके पैरामीटर, सक्सेस रिस्पॉन्स और हर डॉक्यूमेंटेड एरर की लिस्ट बनाएँ।
- हैप्पी पाथ भेजें। हर एंडपॉइंट पर एक वैध रिक्वेस्ट भेजें और स्टेटस कोड, रिस्पॉन्स स्कीमा और मुख्य वैल्यू असर्ट करें। रिस्पॉन्स सेव करें — यही आपकी बेसलाइन है।
- जानबूझकर इनपुट तोड़ें। ज़रूरी फ़ील्ड हटाएँ, गलत टाइप भेजें, लंबाई पार करें, बाउंड्री वैल्यू (0, -1, अधिकतम + 1) दें, खाली और बहुत बड़ी बॉडी भेजें, और बिगड़ा JSON भेजें। सटीक 4xx कोड और समस्या का नाम लेने वाले एरर मैसेज की उम्मीद करें।
- ऑथेंटिकेशन टेस्ट करें। प्रोटेक्टेड एंडपॉइंट को बिना टोकन, एक्सपायर्ड टोकन, दूसरे यूज़र के टोकन और गलत स्कोप वाले टोकन से कॉल करें। 401 या 403 की उम्मीद करें, डेटा की कभी नहीं।
- स्टेट बदलाव जाँचें। POST के बाद रिसोर्स GET करके पुष्टि करें कि वह मौजूद है; DELETE के बाद पुष्टि करें कि वह चला गया; PUT के बाद पुष्टि करें कि हर फ़ील्ड बदला और कुछ और नहीं बदला।
- सिर्फ़ बॉडी नहीं, हेडर पर भी असर्ट करें। Content-Type application/json होना चाहिए, प्राइवेट डेटा के लिए कैशिंग सही हो, ब्राउज़र क्लाइंट के लिए CORS सही हो।
- मापें। हर कॉल का रिस्पॉन्स टाइम रिकॉर्ड करें; रिलीज़ के बीच ऊपर जाता कोई भी टाइम रिग्रेशन है, भले ही वह अब भी "काम" करे।
- जो दोहराया, उसे ऑटोमेट करें। रिक्वेस्ट और असर्शन को कलेक्शन या स्क्रिप्ट में बदलें ताकि वे हर बिल्ड पर चलें।
आज़माएँ: REST API टेस्टर आज़माएँ: API एंडपॉइंट टेस्टर आज़माएँ: API ऑथेंटिकेशन टेस्टर
हर रिस्पॉन्स में क्या असर्ट करें
- स्टेटस कोड ठीक वही है जो डॉक्यूमेंटेड है।
- Content-Type हेडर सही है और बॉडी पार्स होती है।
- बॉडी स्कीमा से मेल खाती है: ज़रूरी फ़ील्ड मौजूद, टाइप सही, सख़्त कॉन्ट्रैक्ट में कोई अनपेक्षित फ़ील्ड नहीं।
- वैल्यू सही हैं: ID, टोटल, ISO 8601 में तारीख़ें, अनुमत सेट के भीतर enumeration।
- एरर एकसमान हैं: हर एंडपॉइंट पर एक ही शेप, स्थिर मशीन कोड, मैसेज में कोई स्टैक ट्रेस या SQL नहीं।
- रिस्पॉन्स टाइम तय बजट के भीतर है।
आज़माएँ: API रिस्पॉन्स वैलिडेटर आज़माएँ: API स्कीमा वैलिडेटर
सबसे ज़्यादा दिखने वाली गलतियाँ
- बॉडी के अंदर एरर के साथ 200 OK — क्लाइंट टेक्स्ट पार्स किए बिना सफलता और विफलता में फ़र्क़ नहीं कर सकते।
- ख़राब इनपुट पर 400/422 की जगह 500 — वैलिडेशन लेयर गायब है या क्रैश होती है।
- अलग-अलग एंडपॉइंट पर अलग-अलग एरर शेप — हर कंज़्यूमर को कस्टम हैंडलिंग चाहिए।
- चुपचाप कॉन्ट्रैक्ट बदलना — बिना वर्ज़न बढ़ाए फ़ील्ड का नाम या टाइप बदल देना।
- ऑथराइज़ेशन चेक गायब — टोकन वैध है लेकिन ऐसे यूज़र का है जिसे रिसोर्स नहीं दिखना चाहिए।
- असंगत पेजिनेशन — पेज साइज़, ऑफ़सेट और टोटल एंडपॉइंट के बीच मेल नहीं खाते।
- टाइम ज़ोन बग — बिना ऑफ़सेट के टाइमस्टैम्प, या एक दिन खिसक जाने वाली तारीख़ें।
आज़माएँ: API स्टेटस कोड सिम्युलेटर आज़माएँ: रिस्पॉन्स कॉन्ट्रैक्ट कम्पेरेटर
Webhook और कॉलबैक टेस्ट करना
Webhook दिशा उलट देते हैं: API आपको कॉल करता है। इसे टेस्ट करने के लिए आपको ऐसा URL चाहिए जो कॉल स्वीकार करे और ठीक-ठीक दिखाए कि क्या आया — हेडर, सिग्नेचर, बॉडी और टाइमिंग — ताकि आप हैंडलर कोड की एक लाइन लिखने से पहले पेलोड को डॉक्यूमेंटेशन से जाँच सकें और शेयर्ड सीक्रेट से सिग्नेचर वेरिफ़ाई कर सकें।
API टेस्टिंग टूल्स: डेस्कटॉप ऐप बनाम ब्राउज़र टूल्स
Postman, Insomnia और Bruno बड़े, लंबे समय तक चलने वाले कलेक्शन के लिए बेहतरीन हैं। रोज़ के काम के लिए — एंडपॉइंट चेक करना, बग रिप्रोड्यूस करना, रिस्पॉन्स वैलिडेट करना, webhook कैप्चर करना — ब्राउज़र टूल तेज़ है क्योंकि कुछ इंस्टॉल या साइन-इन नहीं करना पड़ता। Mutqan के API टूल्स उसी रोज़ के लूप को कवर करते हैं: रिक्वेस्ट बनाना और भेजना, नियमों या स्कीमा से रिस्पॉन्स वैलिडेट करना, स्टेटस कोड सिम्युलेट करना, webhook कैप्चर करना और सीधे OpenAPI फ़ाइल से टेस्ट केस बनाना।
आज़माएँ: OpenAPI → टेस्ट केस आज़माएँ: रिस्पॉन्स टाइम एनालाइज़र
अक्सर पूछे जाने वाले सवाल
API टेस्टिंग और यूनिट टेस्टिंग में क्या फ़र्क़ है?
यूनिट टेस्ट कोडबेस के अंदर किसी फ़ंक्शन को अलग से चलाते हैं। API टेस्ट चलती हुई सर्विस को असली HTTP रिक्वेस्ट भेजते हैं और रिस्पॉन्स जाँचते हैं, इसलिए वे राउटिंग, सीरियलाइज़ेशन, वैलिडेशन, ऑथेंटिकेशन और डेटाबेस को एक साथ कवर करते हैं।
क्या मैं Postman के बिना API टेस्ट कर सकता हूँ?
हाँ। कोई भी टूल जो HTTP रिक्वेस्ट भेज सके और रिस्पॉन्स दिखा सके, काम करता है — कमांड लाइन पर cURL, ब्राउज़र-आधारित रिक्वेस्ट बिल्डर, या स्क्रिप्ट। अहम बात यह है कि आप क्या असर्ट करते हैं, क्लाइंट नहीं।
वैलिडेशन एरर पर कौन-सा स्टेटस कोड लौटना चाहिए?
400 Bad Request सामान्य जवाब है; 422 Unprocessable Content (पहले Unprocessable Entity) तब व्यापक रूप से इस्तेमाल होता है जब JSON सही-बना हो लेकिन वैल्यू वैलिडेशन में फ़ेल हों। जो भी चुनें, पूरे API में एक जैसा इस्तेमाल करें।
ऑथेंटिकेशन वाले API को कैसे टेस्ट करें?
टोकन वैसे ही पाएँ जैसे असली क्लाइंट पाता है (लॉगिन एंडपॉइंट, OAuth फ़्लो या API key), उसे Authorization हेडर में भेजें, और नेगेटिव केस भी टेस्ट करें: बिना टोकन, एक्सपायर्ड टोकन, गलत स्कोप, दूसरे यूज़र का टोकन।
कॉन्ट्रैक्ट टेस्टिंग क्या है?
यह जाँचना कि API के असली रिस्पॉन्स उसके प्रकाशित कॉन्ट्रैक्ट — आमतौर पर OpenAPI डॉक्यूमेंट या JSON Schema — से मेल खाते हैं, ताकि कंज़्यूमर को तोड़ने वाला बदलाव रिलीज़ से पहले पकड़ा जाए।
एक एंडपॉइंट को कितने टेस्ट केस चाहिए?
कम से कम एक हैप्पी पाथ, हर डॉक्यूमेंटेड एरर के लिए एक, एक ऑथेंटिकेशन फ़ेलियर और हर पैरामीटर की बाउंड्री वैल्यू। कोई टूल OpenAPI स्पेक से यह बेसलाइन बना सकता है; फिर टेस्टर बिज़नेस-विशेष सिनेरियो जोड़ता है।
संदर्भ
- RFC 9110: HTTP SemanticsHTTP मेथड, हेडर फ़ील्ड, स्टेटस कोड और कंटेंट निगोशिएशन के अर्थ, वायर वर्ज़न से स्वतंत्र।
- OpenAPI SpecificationREST API के वर्णन का मानक: पाथ, ऑपरेशन, पैरामीटर, स्कीमा, रिस्पॉन्स और सिक्योरिटी स्कीम।
- OWASP API Security Top 10 (2023)API की दस सबसे आम कमज़ोरियाँ: ऑब्जेक्ट-लेवल ऑथराइज़ेशन का टूटना, ऑथेंटिकेशन का टूटना, अनियंत्रित रिसोर्स खपत और अन्य।
- Postman Docsरिक्वेस्ट भेजने, टेस्ट स्क्रिप्ट लिखने और कलेक्शन चलाने वाले API क्लाइंट का आधिकारिक दस्तावेज़।
अभ्यास
ऑनलाइन स्टोर के रिटर्न एंडपॉइंट को टेस्ट करें
आप staging पर एक काल्पनिक ऑनलाइन इलेक्ट्रॉनिक्स स्टोर का REST API टेस्ट करते हैं। डेवलपर ने POST /api/v1/orders/{orderId}/returns पूरा कर लिया है, जिससे कस्टमर किसी डिलीवर हो चुके ऑर्डर के आइटम का रिटर्न और रिफ़ंड माँग सकता है, और उसने सिर्फ़ हैप्पी पाथ जाँचा है। नीचे कॉन्ट्रैक्ट का अंश (अंग्रेज़ी में, जैसा टीम लिखती है), सिंथेटिक टेस्ट डेटा, डेवलपर की रिक्वेस्ट और पहले रन से तीन और जाँचों के नतीजे दिए गए हैं।
गाइड का स्टेप-बाय-स्टेप तरीका सिर्फ़ इसी एंडपॉइंट पर लागू करें। टेस्ट सेट हर टेस्ट की एक लाइन में लिखें: डेवलपर की वैध रिक्वेस्ट में आप क्या बदलते हैं, अपेक्षित स्टेटस कोड और एरर कोड, और इसके अलावा क्या असर्ट करना है। हर टेस्ट में एक ही चीज़ बदलें, ताकि फ़ेल होने पर एक ही कारण की ओर इशारा हो। फिर पहले रन के तीन नतीजों को परखें, और जो बातें कॉन्ट्रैक्ट खुली छोड़ता है उन्हें अंदाज़ा लगाने की बजाय सवालों के रूप में लिखें।
काग़ज़ और पेन काफ़ी हैं; लगभग 45 मिनट रखें। चाहें तो quantity और comment की लंबाई की values बाउंड्री वैल्यू एनालिसिस टूल से जाँचें, किसी फ़ील्ड के लिए और अवैध इनपुट नेगेटिव टेस्ट जनरेटर से लें, और किसी स्टेटस कोड का RFC 9110 में अर्थ HTTP स्टेटस कोड लुकअप से देखें।
Fictional online electronics store - Returns API on staging. Today: Thu 1 Oct 2026.
Every response is JSON (Content-Type: application/json) with Cache-Control: no-store.
Every error has the same shape ("field" is sent with VALIDATION_ERROR only):
{"error": {"code": "VALIDATION_ERROR", "message": "...", "field": "items[0].qty"}}
POST /api/v1/orders/{orderId}/returns Request a return of items from an order
Auth Bearer token of the order's customer, with the scope returns:write
Body items required, at least one entry: {"sku": string, "qty": integer}
each SKU once, and only SKUs of this order
qty: 1 to the returnable quantity of the SKU
(quantity delivered minus quantity already in returns)
reason required: DAMAGED | WRONG_ITEM | NOT_AS_DESCRIBED | CHANGED_MIND
comment optional text, at most 500 characters
id, status, refundAmount and createdAt are set by the server;
if the client sends them, they are ignored.
refundAmount = the sum of qty x unit price of the returned items.
Rule The order must be delivered, and the return requested within 14 days
of delivery.
201 Created the return; header Location: /api/v1/returns/{id}
400 MALFORMED_JSON the body is not valid JSON
401 UNAUTHENTICATED no token, or the token is invalid or expired
403 FORBIDDEN the order belongs to another customer
403 INSUFFICIENT_SCOPE the token does not have the scope returns:write
404 ORDER_NOT_FOUND no order with this id
409 ORDER_NOT_RETURNABLE the order is not delivered, or the 14 days have passed
415 UNSUPPORTED_MEDIA_TYPE Content-Type is not application/json
422 VALIDATION_ERROR a field is missing or invalid; "field" names it
Target response time on staging: under 800 ms.
GET /api/v1/orders/{orderId}/returns The returns of an order (same auth rules)
Test data (synthetic; restored before each test, after which no returns exist)
CUS-101 TOKEN_A (returns:write), TOKEN_A_EXPIRED, TOKEN_A_READ (orders:read only)
CUS-202 TOKEN_B (returns:write)
O-5001 CUS-101 delivered 24 Sep 2026 A-100 x 2 at 49.95, B-200 x 1 at 120.00
O-5002 CUS-101 shipped, not delivered A-100 x 1 at 49.95
O-5003 CUS-101 delivered 10 Sep 2026 A-100 x 1 at 49.95
O-6001 CUS-202 delivered 28 Sep 2026 C-300 x 1 at 75.00
The developer's happy-path check
POST /api/v1/orders/O-5001/returns HTTP/1.1
Host: staging-api.example.com
Content-Type: application/json
Authorization: Bearer TOKEN_A
{"items": [{"sku": "A-100", "qty": 1}], "reason": "DAMAGED"}
HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-store
Location: /api/v1/returns/R-9001
{"id": "R-9001", "orderId": "O-5001", "status": "requested",
"items": [{"sku": "A-100", "qty": 1}], "reason": "DAMAGED", "comment": null,
"refundAmount": 49.95, "createdAt": "2026-10-01T10:15:00+03:00"}
First run of three more checks (each on restored data)
R1 O-5001, TOKEN_A, items [{"sku": "A-100", "qty": 3}], reason DAMAGED
-> 500 Internal Server Error
{"error": "IllegalStateException at ReturnService.java:88"}
R2 O-5001, TOKEN_B, items [{"sku": "A-100", "qty": 1}], reason DAMAGED
-> 201 Created, Location: /api/v1/returns/R-9002, body with "orderId": "O-5001"
R3 O-5001, TOKEN_A, items [{"sku": "A-100", "qty": 1}], reason OTHER
-> 200 OK
{"success": false, "message": "Invalid reason"}- पहले कॉन्ट्रैक्ट पढ़ें: हर डॉक्यूमेंटेड रिस्पॉन्स और हर उस नियम की लिस्ट बनाएँ जिसकी कोई सीमा है, और जाँचें कि टेस्ट डेटा से हर सीमा टेस्ट हो सकती है या नहीं।
- हैप्पी पाथ: डेवलपर की रिक्वेस्ट को अपना पहला टेस्ट बनाएँ और उसके रिस्पॉन्स में जो कुछ असर्ट करना है वह लिखें, और एक दूसरी वैध रिक्वेस्ट जोड़ें जो ऑर्डर का सब कुछ रिटर्न करे।
- जानबूझकर इनपुट तोड़ें: बॉडी का फ़ॉर्मेट, हर फ़ील्ड, हर बाउंड्री और नियम में दी गई ऑर्डर की स्थितियाँ। हर टेस्ट के लिए अपेक्षित स्टेटस कोड, एरर कोड और
fieldलिखें। - ऑथेंटिकेशन: बिना टोकन, एक्सपायर्ड टोकन, दूसरे कस्टमर का टोकन और गलत स्कोप वाला टोकन।
- स्टेट बदलाव और हेडर: रिक्वेस्ट के बाद अलग
GETसे आप क्या जाँचते हैं, और हर रिस्पॉन्स में कौन-से हेडर होने चाहिए। यह भी लिखें कि सेट का टाइम कैसे मापेंगे और उसे कैसे ऑटोमेट करेंगे। - R1 से R3 को परखें: पास या फ़ेल, गाइड की कौन-सी आम गलती, और अपेक्षित रिस्पॉन्स। तय करें कि पहले किसे रिपोर्ट करेंगे, फिर product owner के लिए अपने सवाल लिखें।
मॉडल उत्तर दिखाएँ
स्टेप 1 — कॉन्ट्रैक्ट पढ़ें। कॉन्ट्रैक्ट नौ नतीजे डॉक्यूमेंट करता है: 201, 400, 401, 403 FORBIDDEN, 403 INSUFFICIENT_SCOPE, 404, 409, 415 और 422, इसलिए किसी भी बाउंड्री से पहले सेट में कम से कम नौ टेस्ट चाहिए। जिन नियमों की सीमाएँ हैं: qty (1 से रिटर्न हो सकने वाली quantity तक: O-5001 में A-100 के लिए 2 और B-200 के लिए 1), comment (500 characters), items (कम से कम एक entry, हर SKU एक बार, सिर्फ़ उसी ऑर्डर के SKU) और 14 दिन की अवधि। टेस्ट डेटा में अवधि की सीमा पर कोई ऑर्डर नहीं है, इसलिए CUS-101 के दो और सिंथेटिक ऑर्डर माँगें, जैसे 17 Sep 2026 को डिलीवर हुआ O-5004 (आज से 14 दिन पहले) और 16 Sep 2026 को डिलीवर हुआ O-5005 (15 दिन), दोनों में A-100 × 1, ताकि डेवलपर की रिक्वेस्ट बिना बदलाव उन पर चले। हर टेस्ट restore किए गए डेटा पर चलाएँ: हर सफल रिटर्न अगले टेस्ट के लिए रिटर्न हो सकने वाली quantity घटा देता है। नीचे का मॉडल सेट टेस्ट को RT-01 से RT-25 तक नंबर देता है; आपकी नंबरिंग और शब्द अलग हो सकते हैं।
स्टेप 2 — हैप्पी पाथ। RT-01 डेवलपर की रिक्वेस्ट (A-100 × 1, DAMAGED): 201; Location में /api/v1/returns/ के बाद बॉडी वाला id है; Content-Type: application/json और Cache-Control: no-store; बॉडी में रिटर्न के सभी फ़ील्ड सही टाइप के साथ हैं — refundAmount नंबर है, string नहीं, comment null है, createdAt ऑफ़सेट के साथ ISO 8601 में है — और वैल्यू सही हैं: orderId O-5001, status requested, items और reason जैसे भेजे गए, refundAmount 49.95; रिस्पॉन्स टाइम 800 ms से कम। इस रिस्पॉन्स को अपनी बेसलाइन के रूप में सेव करें। RT-02 ऑर्डर का सब कुछ: A-100 × 2 और B-200 × 1, reason WRONG_ITEM, एक छोटे comment के साथ: 201, दोनों items सूची में, comment वैसा ही लौटा जैसा भेजा, और refundAmount 219.90 (2 × 49.95 + 120.00) — ऐसी वैल्यू जिसे सिर्फ़ स्टेटस कोड जाँचना कभी नहीं पकड़ता।
स्टेप 3 — इनपुट तोड़ें; हर टेस्ट RT-01 ही है, बस एक बदलाव के साथ। RT-03 {"items": [ के बाद कटी बॉडी → 400 MALFORMED_JSON। RT-04 वही वैध बॉडी Content-Type: text/plain के साथ → 415 UNSUPPORTED_MEDIA_TYPE। RT-05 items हटाया → 422 VALIDATION_ERROR, field items। RT-06 "items": [] → 422, field items। RT-07 A-100 के लिए qty की बाउंड्री, जिसकी रिटर्न हो सकने वाली quantity 2 है (2-value boundary value analysis: हर बाउंड्री वैल्यू और बगल वाले partition में उसकी सबसे नज़दीकी वैल्यू): 0 → 422 और field items[0].qty; 1 → 201 (RT-01); 2 → 201; 3 → 422। RT-08 qty की अवैध वैल्यू और टाइप: -1, 1.5 और "1" (string) → हर एक पर 422। RT-09 SKU C-300, जो दूसरे ऑर्डर का है → 422, field items[0].sku। RT-10 items में A-100 दो बार → 422। RT-11 reason हटाया, और reason OTHER → 422, field reason। RT-12 ठीक 500 characters का comment → 201, पूरा comment लौटता है; 501 characters → 422, field comment।
RT-13 ऑर्डर O-9999 → 404 ORDER_NOT_FOUND। RT-14 O-5002, जो सिर्फ़ शिप हुआ है → 409 ORDER_NOT_RETURNABLE, जो कॉन्ट्रैक्ट डिलीवर न हुए ऑर्डर के लिए देता है (Q4 देखें)। RT-15 अवधि: O-5004 (दिन 14) → 201, अगर दिन 14 गिना जाता है (Q1); O-5005 (दिन 15) और O-5003 (दिन 21) → 409। RT-16 quotes और angle brackets वाला comment, जैसे O'Brien "test" <b>x</b> → 201, और comment ठीक वैसा ही लौटता है जैसा भेजा, बिना 500 के और किसी मैसेज में SQL या स्टैक ट्रेस के बिना। ऐसे इनपुट सिर्फ़ उन्हीं सिस्टम पर भेजें जिन्हें टेस्ट करने की आपको अनुमति है — यहाँ आपकी टीम का staging।
स्टेप 4 — ऑथेंटिकेशन। RT-17 बिना Authorization हेडर → 401 UNAUTHENTICATED और रिटर्न का कोई डेटा नहीं; RFC 9110 यह भी माँगता है कि हर 401 रिस्पॉन्स में WWW-Authenticate हेडर हो। RT-18 TOKEN_A_EXPIRED → 401 UNAUTHENTICATED। RT-19 O-5001 पर कस्टमर CUS-202 का TOKEN_B → 403 FORBIDDEN, बॉडी में O-5001 के बारे में कुछ नहीं; इसके बाद TOKEN_A के साथ GET /api/v1/orders/O-5001/returns कोई नया रिटर्न नहीं दिखाता, और TOKEN_B के साथ वही GET → 403। RFC 9110 सर्वर को ऑर्डर का अस्तित्व छिपाने के लिए इसकी जगह 404 देने की अनुमति देता है; इस कॉन्ट्रैक्ट ने 403 चुना है, इसलिए अपेक्षित परिणाम 403 है। RT-20 TOKEN_A_READ, जिसके पास सिर्फ़ orders:read है → 403 INSUFFICIENT_SCOPE।
स्टेप 5 — स्टेट बदलाव और हेडर। RT-21 RT-01 के बाद GET /api/v1/orders/O-5001/returns → 200, ठीक एक रिटर्न के साथ जिसका id, items, reason और refundAmount 201 वाली बॉडी से मेल खाते हैं। RT-22 रिटर्न हो सकने वाली quantity घटती है: RT-01 के बाद A-100 के लिए qty 2 → 422 (सिर्फ़ 1 बचा है), qty 1 → 201, फिर दोबारा qty 1 → 422। RT-23 RT-01 के साथ "status": "approved", "refundAmount": 999 → 201, status requested और refundAmount 49.95: क्लाइंट अपना रिफ़ंड ख़ुद तय न कर सके (OWASP API Security Top 10 2023 इसे API3, Broken Object Property Level Authorization के अंतर्गत रखता है)। RT-24 रिजेक्ट हुई रिक्वेस्ट कुछ नहीं बदलतीं: qty 3 वाले RT-07, RT-11 और RT-14 के बाद उस ऑर्डर के रिटर्न की सूची वैसी ही रहती है। RT-25 RT-02 वाली रिक्वेस्ट एक ही पल में दो बार भेजी गई → एक 201 और एक 422; दो 201 का मतलब है वही items दो बार रिफ़ंड होना। हर रिस्पॉन्स पर, एरर समेत, असर्ट करें: Content-Type: application/json, Cache-Control: no-store (डेटा प्राइवेट है), कॉन्ट्रैक्ट वाला एरर शेप, और Location सिर्फ़ 201 पर।
तरीके के आख़िरी दो स्टेप भी लागू होते हैं: हर टेस्ट का रिस्पॉन्स टाइम रिकॉर्ड करें और 800 ms से ऊपर वाले हर टाइम को चिह्नित करें, भले ही रिस्पॉन्स सही हो, और बिल्ड के बीच टाइम की तुलना करें: लगातार बढ़ता टाइम रिग्रेशन है, भले ही वह 800 ms से कम रहे। फिर सेट को ऐसे कलेक्शन में बदलें जो टेस्ट डेटा restore करे, हर बिल्ड पर चले और RT-01 की तुलना सेव की गई बेसलाइन से करे। एक एंडपॉइंट के लिए यह 25 टेस्ट हैं। गाइड का FAQ न्यूनतम बताता है — एक हैप्पी पाथ, हर डॉक्यूमेंटेड एरर के लिए एक, एक ऑथेंटिकेशन फ़ेलियर और हर पैरामीटर की बाउंड्री वैल्यू — और RT-21 से RT-25 वही हैं जो सिर्फ़ अलग-अलग रिस्पॉन्स से बना सेट छोड़ देता है।
स्टेप 6 — पहला रन। R1 तीन कारणों से फ़ेल है, और तीनों गाइड में बताए गए हैं: ख़राब इनपुट पर 422 की जगह 500, और कॉन्ट्रैक्ट से अलग एरर शेप (code, message और field वाले error ऑब्जेक्ट की जगह एक string) — ये गाइड की दो आम गलतियाँ हैं; और इंटरनल लीक करने वाला मैसेज (exception का नाम, सोर्स फ़ाइल और लाइन नंबर), जिसे गाइड की "हर रिस्पॉन्स में क्या असर्ट करें" वाली सूची मना करती है। अपेक्षित: field items[0].qty के साथ 422 VALIDATION_ERROR।
R2 फ़ेल है और सबसे गंभीर है: ऑथराइज़ेशन चेक गायब — टोकन वैध है लेकिन ऐसे कस्टमर का है जिसका इस ऑर्डर पर कोई हक़ नहीं। कोई भी signed-in कस्टमर किसी और के ऑर्डर पर रिटर्न, और इसलिए रिफ़ंड, माँग सकता है, और रिस्पॉन्स उस ऑर्डर का डेटा दिखाता है। OWASP API Security Top 10 2023 इसे API1, Broken Object Level Authorization कहता है। अपेक्षित: 403 FORBIDDEN, और कोई रिटर्न नहीं बनता। इसे सबसे पहले रिपोर्ट करें, severity Critical के साथ, TOKEN_B वाली सटीक रिक्वेस्ट, 201 रिस्पॉन्स और इसके बनाए रिटर्न R-9002 सहित; फ़िक्स के बाद RT-19 को confirmation testing के रूप में फिर चलाएँ, TOKEN_B वाले GET समेत। R3 फ़ेल है: बॉडी के अंदर एरर के साथ 200 OK, इसलिए स्टेटस कोड पर भरोसा करने वाला क्लाइंट कस्टमर को बताता है कि रिटर्न स्वीकार हो गया, और बॉडी में एक और अलग एरर शेप है। अपेक्षित: field reason के साथ 422 VALIDATION_ERROR, और कोई रिटर्न नहीं बनता।
Product owner और डेवलपर के लिए सवाल। Q1 क्या "within 14 days of delivery" में दिन 14 शामिल है, और क्या यह स्टोर के टाइम ज़ोन में कैलेंडर दिनों में गिना जाता है या डिलीवरी के समय से 24 घंटे की अवधियों में? Q2 अरबी टेक्स्ट और emoji के लिए comment के 500 characters कैसे गिने जाते हैं, और क्या खाली comment स्वीकार है? Q3 क्या reason case-sensitive है, यानी क्या damaged रिजेक्ट होता है? Q4 जब कोई रिक्वेस्ट दो नियम तोड़े, तो कौन-सा एरर पहले आता है? जैसे दूसरे कस्टमर का ऑर्डर और अवैध बॉडी, या O-5002, जो डिलीवर नहीं हुआ है, इसलिए उसकी कोई quantity अभी रिटर्न नहीं हो सकती (409 या 422?)। आमतौर पर उम्मीद यह है कि ऑथराइज़ेशन चेक पहले हो, ताकि वैलिडेशन मैसेज किसी और के ऑर्डर के बारे में कुछ न बताएँ।
अपना काम जाँचें: हर डॉक्यूमेंटेड स्टेटस कोड आपके सेट में कम से कम एक बार आना चाहिए; हर नेगेटिव टेस्ट RT-01 में ठीक एक चीज़ बदले; और हर अपेक्षित परिणाम स्टेटस कोड और एरर कोड का नाम ले, सिर्फ़ "एक एरर" नहीं। ISTQB की भाषा में कॉन्ट्रैक्ट test basis है, हर डॉक्यूमेंटेड रिस्पॉन्स और हर नियम एक test condition है, और RT-07, RT-12 और RT-15 2-value boundary value analysis लागू करते हैं। अगर आपके सेट में रिस्पॉन्स के बाद की जाँचें, यानी RT-21 से RT-25, नहीं थीं, तो उन्हें जोड़ें: रिस्पॉन्स सही दिख सकता है जबकि उसके पीछे का डेटा गलत हो।
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।
QA रोडमैप का हिस्सा
इस topic से पहले
अगले topics
इस गाइड में बताए गए टूल्स
HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।
method, हेडर और JSON बॉडी पर पूरे नियंत्रण के साथ REST endpoint टेस्ट करें, फिर स्टेटस, हेडर और JSON path पर assertion लगाएँ।
तुरंत जाँचें कि कोई API endpoint पहुँच में है या नहीं: स्टेटस, रिस्पॉन्स टाइम, साइज़, content type और TLS।
API रिस्पॉन्स को अपेक्षाओं के आधार पर जाँचें: स्टेटस, ज़रूरी हेडर, JSON स्कीमा और फ़ील्ड नियम।
API रिस्पॉन्स को JSON Schema या OpenAPI रिस्पॉन्स स्कीमा के आधार पर जाँचें।
ऐसा सार्वजनिक endpoint पाएँ जो कोई भी HTTP स्टेटस कोड लौटाए, वैकल्पिक देरी और कस्टम JSON बॉडी के साथ, ताकि क्लाइंट की error हैंडलिंग टेस्ट हो सके।
एक अनोखा URL पाएँ, उस पर webhook भेजें और method, हेडर, बॉडी तथा टाइमिंग रीयल टाइम में जाँचें।
OpenAPI / Swagger स्पेसिफ़िकेशन से संरचित टेस्ट-केस मैट्रिक्स (positive, negative, auth, boundary) बनाएँ।
किसी endpoint पर Bearer, Basic, API-key और कस्टम-हेडर प्रमाणीकरण टेस्ट करें और अधिकृत बनाम अनधिकृत रिस्पॉन्स की तुलना करें।
किसी endpoint का रिस्पॉन्स टाइम कई सैंपल पर मापें: न्यूनतम, अधिकतम, औसत, माध्यिका और p95।