API परफ़ॉर्मेंस टेस्टिंग के भीतर छिपे तीन सवाल
| कैपेसिटी | लेटेंसी बिगड़ने से पहले कितना concurrent ट्रैफ़िक झेला जा सकता है। इसके लिए लोड जेनरेटर चाहिए। रिलीज़ से पहले और आर्किटेक्चर बदलने के बाद चलाएँ। |
| रिग्रेशन | क्या इस pull request ने किसी कॉल को पहले से धीमा कर दिया। इसके लिए बेसलाइन और तुलना चाहिए, ज़्यादा concurrency नहीं। |
| करेक्टनेस | क्या रिस्पॉन्स सही है, अटपटे इनपुट पर भी। इसके लिए बॉडी पर assertions चाहिए। तीनों में सबसे सस्ता, और सबसे ज़्यादा छोड़ा जाने वाला। |
सबसे पहले ऑटोमेट करने लायक रिग्रेशन ही क्यों है
कैपेसिटी टेस्टिंग चलाना महँगा है और रिलीज़ दर रिलीज़ यह शायद ही बदलती है। परफ़ॉर्मेंस रिग्रेशन इसका उल्टा है: यह धीरे-धीरे होता है, एक-एक pull request करके, और जब तक कोई कैपेसिटी टेस्ट इसे पकड़ता है, तब तक आपके सामने छह महीने के जमा हुए बदलाव होते हैं और यह अंदाज़ा भी नहीं होता कि इनमें से किसने यह किया।
हर बदलाव पर चलने वाली, बेसलाइन से प्रति-कॉल टाइमिंग की एक सीधी तुलना उस दस गुना धीमी क्वेरी को उसी दिन पकड़ लेती है जिस दिन वह आई थी। यह किसी तिमाही कैपेसिटी रिपोर्ट से कहीं ज़्यादा काम की है।
करेक्टनेस की बुनियाद
अगर रिस्पॉन्स ही गलत हैं तो टाइमिंग के आँकड़ों का कोई मतलब नहीं। खाली array लौटाने वाला endpoint बेहद तेज़ होता है। यह बात ज़ाहिर लगती है, और ठीक इसी तरह कोई सर्विस टूटे हुए फ़िल्टर और शानदार लेटेंसी ग्राफ़ के साथ रिलीज़ हो जाती है।
तो क्रम यह है: पहले करेक्टनेस, फिर रिग्रेशन, फिर कैपेसिटी। ज़्यादातर टीमें इसे उल्टा करती हैं, क्योंकि कैपेसिटी टेस्टिंग ही वह चीज़ है जो देखने में परफ़ॉर्मेंस का काम लगती है।
जेनरेट की गई कवरेज क्या जोड़ती है
API टेस्ट प्लान में boundary और stress जैसी शक्ल वाले केस शामिल होते हैं, जो उन इनपुट संयोजनों को सामने लाते हैं जिनसे कोई endpoint लोड की वजह से नहीं, बल्कि स्ट्रक्चरल वजह से धीमा पड़ता है। बड़े page size पर बिगड़ने वाली क्वेरी यहाँ किसी कैपेसिटी टेस्ट के पकड़ने से बहुत पहले दिख जाएगी।
यह लोड टेस्टिंग नहीं है, और न ही उसका विकल्प है। यह उसके नीचे की सस्ती परत है।
टर्मिनल
npm install -g @testsprite/testsprite-cli
testsprite setup
अगर आप कुछ भी इंस्टॉल नहीं करना चाहते, तो डैशबोर्ड से भी यही काम होता है। कमांड लाइन और जो कुछ कर सकती है, उस सबके लिए देखें CLI रिपॉज़िटरी।
सेशन, स्टेट, ऑर्डरिंग और क्लीनअप को कवर करता है API टेस्टिंग डॉक्युमेंटेशन।
रिग्रेशन आमतौर पर कहाँ छिपा होता है
जब कोई endpoint एक रिलीज़ से दूसरी रिलीज़ के बीच धीमा पड़ता है, तो वजह लगभग हमेशा तीन में से एक होती है, और इन्हें जान लेने से खोज काफ़ी छोटी हो जाती है।
कोई क्वेरी जिसका index चला गया, या जिसमें ऐसी शर्त जुड़ गई जिसे index कवर नहीं करता। यह बाकी सबसे काफ़ी आगे, सबसे आम वजह है, और इससे होने वाला बदलाव diff में दिखाई नहीं देता क्योंकि SQL देखने में ठीक ही लगता है।
कोई कॉल जो पहले एक राउंड ट्रिप थी और अब कई है, आमतौर पर इसलिए कि कोई helper लूप के अंदर जुड़े हुए रिकॉर्ड एक-एक करके लाने लगा। कोड पहले से बेहतर पढ़ा जाता है, और इसी वजह से वह रिव्यू पास कर जाता है।
कुछ जो बढ़ गया। ऐसा रिस्पॉन्स जिसमें एक collection शामिल है, जिसमें पहले पाँच एंट्री होती थीं और अब पाँच सौ हैं, क्योंकि प्रोडक्ट कामयाब हो गया। कुछ टूटा नहीं, और endpoint अब सबके लिए धीमा है।
आवृत्ति
दो रास्ते हैं, और चुनाव असल में इस बात का है कि पाइपलाइन किसके पास है। डैशबोर्ड से GitHub App जोड़ने में आपकी रिपॉज़िटरी में कोई बदलाव नहीं करना पड़ता, क्योंकि यह उसी deployment पर प्रतिक्रिया देता है जो आपका बिल्ड पहले से भेजता है। कोई GitHub Actions स्टेप जोड़ने पर यह जाँच रिपो के अंदर आ जाती है, जहाँ बाकी बिल्ड की तरह इसका भी रिव्यू होता है।
इन तीनों में से TestSprite क्या कवर करता है
तीसरा वाला, यानी करेक्टनेस, और वे boundary केस जो स्ट्रक्चरल सुस्ती को सामने लाते हैं। बड़े page size पर बिगड़ने वाली क्वेरी किसी कैपेसिटी टेस्ट के वहाँ तक पहुँचने से बहुत पहले एक फेल होते या धीमे boundary केस के रूप में दिख जाती है, और उसकी लागत के एक छोटे से हिस्से में।
कवरेज API Discovery और आपके स्पेसिफिकेशन से बनती है, और प्लान functional, schema, authorization, error-handling तथा boundary श्रेणियों में फैले होते हैं। Auto-Authentication पूरे रन के दौरान सेशन ज़िंदा रखता है, Dynamic Variables कॉल्स के बीच वैल्यू ले जाते हैं, Dependency Chains हर केस को क्या चाहिए और वह क्या पैदा करता है, उसी से execution order तय करते हैं, और Auto-Cleanup ठीक वही हटाता है जो उस रन ने बनाया था।
इससे आपको वह परत मिलती है जो ज़्यादातर परफ़ॉर्मेंस प्रोग्राम में नहीं होती: कुछ ऐसा जो हर pull request पर चलता है और यह पकड़ लेगा कि कोई endpoint खाली नतीजे लौटा रहा है — वही खराबी जिसे throughput ग्राफ़ शानदार बताकर दिखाता है।
क्या TestSprite लेटेंसी मापता है?
यह कैपेसिटी नहीं, करेक्टनेस की जाँच करता है। लगातार बनी रहने वाली concurrency के तहत टाइमिंग और throughput के लिए एक अलग परफ़ॉर्मेंस टूल चाहिए।
एक वाजिब बेसलाइन क्या है?
उसी एनवायरनमेंट पर आपके अपने पिछले आँकड़े। दूसरे प्रोडक्ट से उधार लिए गए एब्सोल्यूट टारगेट बहुत कम बताते हैं।
क्या परफ़ॉर्मेंस टेस्ट को merge रोकना चाहिए?
किसी अहम रास्ते पर बड़ा रिग्रेशन हो, तो हाँ। छोटा उतार-चढ़ाव हो, तो नहीं — वरना आपका समय शिपिंग के बजाय थ्रेशोल्ड ट्यून करने में जाएगा।
हमारे आँकड़े इतने बदलते क्यों रहते हैं?
आमतौर पर वजह होती है साझा एनवायरनमेंट, ठंडा कैश या अलग डेटा वॉल्यूम। किसी भी तुलना पर भरोसा करने से पहले इन्हें काबू में करें।
क्या एक ही टूल तीनों काम कर सकता है?
कुछ टूल दावा तो करते हैं। व्यवहार में कैपेसिटी वाले सवाल के लिए लोड जेनरेटर चाहिए और करेक्टनेस वाले सवाल के लिए बॉडी पर assertions, और एक ही रन में दोनों को अच्छे से कर पाना उतना आम नहीं है जितना मार्केटिंग बताती है।
पहले करेक्टनेस, फिर रिग्रेशन, फिर कैपेसिटी।
API परफ़ॉर्मेंस टेस्टिंग तीन सवाल हैं जिनके तीन अलग जवाब हैं। हर बदलाव पर ऑटोमेट करने लायक रिग्रेशन है, करेक्टनेस इन सबके नीचे की बुनियाद है, और कैपेसिटी वह महँगा काम है जिससे ज़्यादातर टीमें शुरुआत कर देती हैं।