लोड टेस्टिंग टूल्स की श्रेणियाँ
स्क्रिप्ट-फ़र्स्ट। आप सिनेरियो को कोड में लिखते हैं और उसे लोकली या डिस्ट्रिब्यूटेड चलाते हैं। लचीला, रिव्यू करने लायक़, और मेंटेन करने की ज़िम्मेदारी आपकी।
प्लान-आधारित। सिनेरियो UI में बनाइए और उसे प्रोजेक्ट फ़ाइल की तरह रखिए। प्रोटोकॉल सपोर्ट व्यापक, लेकिन pull request में रिव्यू करना असुविधाजनक।
होस्टेड। जनरेटर कोई और, कई रीजन से चलाता है। मेंटेन करने के लिए कोई इन्फ़्रास्ट्रक्चर नहीं, और भुगतान हर रन के हिसाब से।
ज़्यादातर टीमों के लिए यह चुनाव इस बात से कम अहम है कि टेस्ट कोई सार्थक चीज़ नाप भी रहा है या नहीं।
लोड टेस्ट शुरू करने से पहले तीन जाँचें
क्या एक रिक्वेस्ट प्रति सेकंड पर नतीजे सही आते हैं? टूटे हुए endpoint पर लोड टेस्ट करना यह नापता है कि आप कितनी तेज़ी से ग़लत हो सकते हैं। परफ़ॉर्मेंस के काम में सबसे आम तरीक़े से बर्बाद होने वाली तिमाही यही है।
क्या रन अपने पीछे सफ़ाई कर जाता है? जो लोड टेस्ट रिकॉर्ड बनाकर उन्हें छोड़ देता है, वह अगले रन का — और उस एनवायरनमेंट पर चल रही बाक़ी हर चीज़ का — व्यवहार बदल देता है।
क्या एनवायरनमेंट असल जैसा है? जिस एनवायरनमेंट में डेटा असल का दसवाँ हिस्सा भर हो, उससे मिले नतीजे बस एक नंबर हैं, कोई भविष्यवाणी नहीं।
वह सेटिंग जिसे लगभग कोई चालू नहीं करता
रिस्पॉन्स बॉडी पर assert कीजिए, कम से कम कुछ रिक्वेस्ट के सैंपल पर। ज़्यादातर लोड टूल्स इसे सपोर्ट करते हैं और ज़्यादातर टीमें इसे बंद रखती हैं, क्योंकि इससे जनरेटर का थ्रूपुट घटता है। नतीजा यह होता है कि लोड रिपोर्ट पूरी हरी और साफ़ आती है, जबकि हर रिस्पॉन्स में खाली लिस्ट होती है।
तेज़ और ग़लत होना, धीमे और सही होने से बुरा है, क्योंकि उसकी जाँच कोई नहीं करता।
असली क़ीमत सिनेरियो में है
टीमें लोड टूल्स में से एक चुनने में लंबा वक़्त लगाती हैं और सिनेरियो पर बहुत कम — यह उलटा है, क्योंकि नंबर का कोई मतलब है भी या नहीं, यह सिनेरियो ही तय करता है।
एक हज़ार वर्चुअल यूज़र्स का किसी एक endpoint पर टूट पड़ना बनाना आसान है और असल से इसका मेल शायद ही कभी बैठता है। असली ट्रैफ़िक एक मिश्रण होता है: ज़्यादातर रीड, कुछ राइट, बीच-बीच में कोई महँगी रिपोर्ट — और यह सब ऐसे डेटासेट पर जिसमें पहले से साल भर का इतिहास पड़ा है। कोई सिस्टम बनावटी वर्ज़न को आराम से झेल सकता है और असल जैसे वर्ज़न पर ढेर हो सकता है, क्योंकि contention वहाँ होती है जहाँ सीधा-सादा सिनेरियो कभी पहुँचा ही नहीं।
अपने असली ट्रैफ़िक जैसा मिश्रण बनाने में लॉग देखते हुए एक दोपहर लगती है, और इसकी क़ीमत उन टूल्स के बीच के किसी भी फ़ीचर-फ़र्क़ से ज़्यादा है जिनकी आप तुलना कर रहे हैं।
फ़ंक्शनल वेरिफ़िकेशन कहाँ बैठता है
जेनरेट किए गए API प्लान में boundary और स्ट्रेस जैसे केस शामिल होते हैं, जो उन इनपुट कॉम्बिनेशन को सामने लाते हैं जिनकी वजह से कोई endpoint संरचनात्मक कारणों से धीमा पड़ता है। बड़ी page size पर बिगड़ने वाली query यहाँ कैपेसिटी टेस्ट के पकड़ने से बहुत पहले, और उसकी लागत के एक छोटे से हिस्से में दिख जाती है।
यह लोड टेस्टिंग नहीं है और न ही उसकी जगह लेता है। यह नीचे की सस्ती परत है, और लोड जनरेटर ख़रीदने की राह में ज़्यादातर टीमें इसी परत को छोड़ देती हैं।
टर्मिनल
npm install -g @testsprite/testsprite-cli
testsprite setup
अगर आप कुछ भी इंस्टॉल नहीं करना चाहते, तो डैशबोर्ड भी यही काम करता है। कमांड लाइन जो कुछ और कर सकती है, वह सब यहाँ मौजूद है: CLI रिपॉज़िटरी।
कार्यप्रणाली यहाँ दी गई है: API टेस्टिंग डॉक्युमेंटेशन।
कितनी बार
लोड टेस्ट रिलीज़ से पहले और आर्किटेक्चर में बदलाव के बाद। सही नतीजों की जाँच हर pull request पर, क्योंकि regression को ठीक करना उसी वक़्त सबसे सस्ता पड़ता है।
GitHub App एक webhook है जिसे आप TestSprite डैशबोर्ड में सेट करते हैं। यह उसी deployment इवेंट को सुनता है जो आपकी पाइपलाइन पहले से पैदा करती है, इसलिए आपकी रिपॉज़िटरी में कुछ भी नहीं बदलता।
GitHub Actions इस स्टेप को आपके अपने वर्कफ़्लो के अंदर रखता है, जिसे टर्मिनल से कॉन्फ़िगर किया जाता है।
लोड रन से पहले TestSprite क्या कवर करता है
इस पेज की तीनों जाँचें, प्रोडक्ट के रूप में। एक रिक्वेस्ट प्रति सेकंड पर सही नतीजे — ऐसी जेनरेट की गई कवरेज से जो स्टेटस कोड नहीं, बॉडी पर assert करती है। सफ़ाई, क्योंकि Auto-Cleanup नाम से मिलान करने के बजाय ठीक वही हटाता है जो उस रन ने बनाया था। और वे boundary केस जो संरचनात्मक सुस्ती सामने लाते हैं, जो यहाँ कैपेसिटी टेस्ट के उन तक पहुँचने से बहुत पहले दिख जाते हैं।
कवरेज API Discovery और आपके स्पेसिफ़िकेशन से बनती है। Auto-Authentication सेशन को ज़िंदा रखता है, Dynamic Variables एक कॉल से दूसरी कॉल तक वैल्यू ले जाती हैं, और Dependency Chains एक सुरक्षित एक्ज़िक्यूशन क्रम निकालती हैं।
आपका लोड जनरेटर जहाँ है वहीं रहता है। फ़ायदा यह होता है कि वह जो नंबर देता है, वह ऐसी सर्विस का ब्योरा होता है जो सही चीज़ लौटा रही है — और यही फ़र्क़ है एक असली माप में और ऐसे भरोसेमंद दिखने वाले आँकड़े में जिसका कोई मतलब नहीं।
क्या TestSprite लोड जेनरेट करता है?
नहीं। यह boundary केस समेत सही व्यवहार की पुष्टि करता है। लगातार बनी रहने वाली concurrency के लिए अलग से समर्पित जनरेटर चाहिए।
हमें कौन-सा लोड टेस्टिंग टूल चुनना चाहिए?
वही जिसे आपकी टीम सचमुच मेंटेन करेगी। मुख्य विकल्पों के बीच के फ़र्क़ इस बात से कम मायने रखते हैं कि सिनेरियो सार्थक है या नहीं।
हमें कितनी बार लोड टेस्ट करना चाहिए?
रिलीज़ से पहले और आर्किटेक्चर में बदलाव के बाद। लगातार लोड टेस्टिंग महँगी पड़ती है और बीच के समय में शायद ही कुछ नया बताती है।
क्या हम CI में लोड टेस्ट कर सकते हैं?
स्मोक जितनी छोटी जाँच, हाँ। CI में पूरी कैपेसिटी टेस्टिंग का मतलब है या तो बेमानी लोड लेवल या फिर बेहद धीमी पाइपलाइन।
सबसे आम ग़लती क्या है?
सही नतीजों की पुष्टि से पहले लोड टेस्टिंग करना। खाली नतीजे लौटाने वाले endpoint का भरोसेमंद दिखता थ्रूपुट नंबर, किसी नंबर के न होने से भी बुरा है।
टूल चुनने से पहले तीन जाँचें।
लोड टेस्टिंग टूल्स कैपेसिटी का जवाब देते हैं और मान लेते हैं कि सर्विस पहले से सही है। एक रिक्वेस्ट प्रति सेकंड पर सही नतीजों की पुष्टि कीजिए, पक्का कीजिए कि रन अपने पीछे सफ़ाई करते हैं, असल जैसा एनवायरनमेंट इस्तेमाल कीजिए, और बॉडी असर्शन चालू रखिए।