paint-brush
क्यूए परीक्षकों के लिए पायथन-संचालित प्रदर्शन परीक्षण: क्लाउड एपीआई लोड परीक्षण के लिए एक शुरुआती मार्गदर्शिकाद्वारा@shad0wpuppet
27,075 रीडिंग
27,075 रीडिंग

क्यूए परीक्षकों के लिए पायथन-संचालित प्रदर्शन परीक्षण: क्लाउड एपीआई लोड परीक्षण के लिए एक शुरुआती मार्गदर्शिका

द्वारा Konstantin Sakhchinskiy8m2024/01/19
Read on Terminal Reader
Read this story w/o Javascript

बहुत लंबा; पढ़ने के लिए

क्लाउड ऐप एपीआई पर लोड परीक्षण करने वाले क्यूए परीक्षकों के लिए पायथन स्क्रिप्ट का अन्वेषण करें। लेख में एसिंक्रोनस और मल्टीप्रोसेसिंग दृष्टिकोण शामिल हैं, जो अनुकूलन, कार्यप्रणाली चयन और व्यावहारिक निगरानी युक्तियों में अंतर्दृष्टि प्रदान करते हैं। व्यापक प्रदर्शन विश्लेषण के लिए पायथन की तकनीकी क्षमताओं का लाभ उठाएं।
featured image - क्यूए परीक्षकों के लिए पायथन-संचालित प्रदर्शन परीक्षण: क्लाउड एपीआई लोड परीक्षण के लिए एक शुरुआती मार्गदर्शिका
Konstantin Sakhchinskiy HackerNoon profile picture
0-item
1-item


क्या आप एक क्यूए परीक्षक हैं जो व्यापक प्रोग्रामिंग विशेषज्ञता की आवश्यकता के बिना प्रदर्शन परीक्षण में उतरने के लिए उत्सुक हैं? इस लेख में, हम गैर-प्रोग्रामर्स के लिए पायथन का उपयोग करके क्लाउड ऐप्स एपीआई पर लोड परीक्षण करने का एक सुलभ तरीका तलाशेंगे। जटिल कोडिंग की आवश्यकता के बिना लोड परीक्षण - पता लगाएं कि नियमित क्यूए परीक्षक भी गंभीर बग ढूंढने और संभावित प्रदर्शन बाधाओं को उजागर करने के लिए पायथन का उपयोग कैसे कर सकते हैं।


प्रदर्शन परीक्षण यह सुनिश्चित करने का एक महत्वपूर्ण पहलू है कि आपके एप्लिकेशन वास्तविक दुनिया की मांगों को संभाल सकते हैं। मैं ब्राउज़रों को प्रबंधित करने वाली क्लाउड सेवा के लोड परीक्षण के लिए डिज़ाइन किए गए अपने दृष्टिकोण और पायथन स्क्रिप्ट को समझाने का प्रयास करूंगा।


लोड परीक्षण परिदृश्य ब्राउज़र प्रोफाइल (वेब स्क्रैपिंग के लिए ब्राउज़र) के प्रबंधन के लिए जिम्मेदार क्लाउड सेवा की कल्पना करें। उपयोगकर्ता प्रोफ़ाइल बनाने, प्रारंभ करने, रोकने, हटाने आदि के लिए सेवा के साथ एपीआई के माध्यम से इंटरैक्ट करते हैं। मेरी पायथन स्क्रिप्ट इस परिदृश्य का अनुकरण करती है, इन क्रियाओं को बार-बार निष्पादित करके क्लाउड सेवा पर लोड लागू करती है।


 # Dependencies import asyncio import httpx # Configuration API_HOST = 'https://cloud.io' API_KEY = 'qatest' API_HEADERS = { "x-cloud-api-token": API_KEY, "Content-Type": "application/json" } CYCLES_COUNT = 3 # Browser profile configuration data_start = { "proxy": "http://127.0.0.1:8080", "browser_settings": {"inactive_kill_timeout": 120} }

अतुल्यकालिक कार्य: मेरे लोड परीक्षणों का मूल

  • ब्राउज़र प्रोफ़ाइल प्राप्त करना: get_profiles फ़ंक्शन सेवा से मौजूदा ब्राउज़र प्रोफ़ाइल पुनर्प्राप्त करता है, एक ऐसे परिदृश्य का अनुकरण करता है जहां उपयोगकर्ता जानकारी का अनुरोध करते हैं।
 async def get_profiles(cl: httpx.AsyncClient): resp = await cl.get(f'{API_HOST}/profiles', params={'page_len': 10, 'page': 0}, headers=API_HEADERS) return resp.json()


  • ब्राउज़र प्रारंभ करना: स्क्रिप्ट चक्र प्रारंभ करती है, प्रत्येक में ब्राउज़र प्रोफ़ाइल को अतुल्यकालिक रूप से प्रारंभ करना शामिल होता है। यह एक ऐसे परिदृश्य का अनुकरण करता है जहां एक उपयोगकर्ता एक साथ कई ब्राउज़र बनाता है और ब्राउज़र प्रोफाइल का उपयोग करता है।
 async def start_profile(cl: httpx.AsyncClient, uuid): resp = await cl.post(f'{API_HOST}/profiles/{id}/start', json=data_start, headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not started with error {error}')


  • ब्राउज़र बंद करना और प्रोफ़ाइल हटाना: प्रोफ़ाइल शुरू करने के बाद, स्क्रिप्ट सक्रिय प्रोफ़ाइल लाती है और उन्हें रोक देती है, इसके बाद सभी प्रोफ़ाइल हटा देती है। यह लोड परिदृश्य गतिशील परिवर्तनों के प्रति क्लाउड सेवा की प्रतिक्रिया और संसाधन सफाई में इसकी दक्षता का आकलन करता है।
 async def stop_profile(cl: httpx.AsyncClient, uuid): resp = await cl.post(f'{API_HOST}/profiles/{id}/stop', headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not stopped with error {error}') async def delete_profile(cl: httpx.AsyncClient, uuid): resp = await cl.delete(f'{API_HOST}/profiles/{id}', headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not stopped with error {error}')


  • कनेक्शन की निगरानी: लोड प्रभाव को समझना स्क्रिप्ट सक्रिय कनेक्शन की जांच और रिपोर्ट करके समाप्त होती है। लोड प्रभाव को समझने और निगरानी से संबंधित संभावित मुद्दों की पहचान करने के लिए यह कदम महत्वपूर्ण है।
 for conn in cl._transport._pool.connections: if conn._connection._state.value != 1: continue print(f'Connection in progress: {conn}')

कार्रवाई में लोड परीक्षण

मुख्य फ़ंक्शन लोड परीक्षण चक्रों को व्यवस्थित करता है, प्रोफाइल के माध्यम से पुनरावृत्त करता है और अतुल्यकालिक कार्यों को निष्पादित करता है। प्रत्येक चक्र एक सिम्युलेटेड उपयोगकर्ता इंटरैक्शन, ब्राउज़र प्रोफ़ाइल बनाने, उपयोग करने और हटाने का प्रतिनिधित्व करता है।


 async def main(): async with httpx.AsyncClient(timeout=httpx.Timeout(timeout=300)) as cl: for _ in range(CYCLES_COUNT): profiles = await get_profiles(cl) start_tasks = [asyncio.create_task(start_profile(cl, profile['id'])) for profile in profiles] await asyncio.gather(*start_tasks) active_browsers = await get_active_profiles(cl) stop_tasks = [asyncio.create_task(stop_profile(cl, active_browser['id'])) for active_browser in active_browsers['data']] await asyncio.gather(*stop_tasks) profiles = await get_profiles(cl) del_tasks = [asyncio.create_task(delete_profile(cl, profile['id'])) for profile in profiles] await asyncio.gather(*del_tasks) # Monitor active connections for insights into load impact

अपनी आवश्यकताओं के अनुरूप लोड परीक्षण तैयार करना

यह स्क्रिप्ट QAs के लिए उनके अनुप्रयोगों के लिए लोड-परीक्षण परिदृश्यों को तैयार करने के लिए एक आधार दिखाती है। चक्रों की संख्या को अनुकूलित करके, उपयोगकर्ता इंटरैक्शन को समायोजित करके, और विशिष्ट एपीआई एंडपॉइंट्स को फिट करने के लिए स्क्रिप्ट को संशोधित करके, परीक्षक विभिन्न भार के तहत अपने एप्लिकेशन के प्रदर्शन में मूल्यवान अंतर्दृष्टि प्राप्त कर सकते हैं। यहां, आपको सर्वर स्थिति के बारे में जानकारी प्राप्त करने, सर्वर लोड का आकलन करने और संसाधन उपयोग और लॉग को ट्रैक करने के लिए आवश्यक निगरानी उपकरणों की आवश्यकता होगी। व्यापक निगरानी के लिए ग्राफाना, किबाना, प्रोमेथियस आदि जैसे उपकरणों का उपयोग करें। इसके अतिरिक्त, अपने एप्लिकेशन के प्रदर्शन का गहन मूल्यांकन सुनिश्चित करते हुए, अपनी स्क्रिप्ट को मिलने वाली प्रतिक्रियाओं पर कड़ी नज़र रखें। यह दृष्टिकोण आपके प्रभावी लोड परीक्षण और प्रदर्शन विश्लेषण में अमूल्य है।


इसके अतिरिक्त, अधिक यथार्थवादी लोड सिमुलेशन के लिए, अपने ब्राउज़र में विशिष्ट पृष्ठ खोलने पर विचार करें। जबकि मैंने व्यक्तिगत रूप से अपने ब्राउज़र में एक प्रारंभ पृष्ठ का उपयोग किया है, आप कई टैब खोलने और विभिन्न पृष्ठों के माध्यम से नेविगेट करने के लिए पिपेटियर या प्लेराइट जैसे विकल्पों का भी पता लगा सकते हैं। यह दृष्टिकोण आपके लोड-परीक्षण परिदृश्य की प्रामाणिकता को बढ़ाता है, जो आपके एप्लिकेशन के साथ उपयोगकर्ता इंटरैक्शन से काफी मिलता-जुलता है।


 # Attempt to connect to the browser using the provided profile URL try: browser = await connect({'browserWSEndpoint': browser_url, 'defaultViewport': None}) except Exception as e: # Handle connection errors and print a message print(f'Error occurred when connecting to the browser: {str(e)}') return # Create a new page in the connected browser page = await browser.newPage() # Introduce a brief delay to ensure the page is ready await asyncio.sleep(2) # Set the viewport dimensions for the page width, height = 1920, 1080 await page.setViewport({'width': width, 'height': height}) # Try to navigate to a specific URL try: await page.goto('https://{your_website}') # Wait for 10 seconds to simulate user interaction await page.waitFor(10000) # Introduce another delay for additional stability await asyncio.sleep(5) except pyppeteer.errors.PageError as e: # Handle page navigation errors and print a message print(f'Error occurred during page navigation: {str(e)}') # Attempt to take a screenshot of the page try: await page.screenshot(path='screen.png', fullPage=True) # Print a success message if the screenshot is captured successfully print('Screenshot taken successfully.') except Exception as e: # Handle screenshot capture errors and print a message print(f'Error occurred during taking a screenshot: {str(e)}')

पायथन की अतुल्यकालिक क्षमताएं, HTTP लाइब्रेरीज़ के साथ मिलकर, इसे क्लाउड-आधारित सिस्टम लोड-परीक्षण के लिए एक बहुमुखी उपकरण बनाती हैं। यह उदाहरण उन QA इंजीनियरों के लिए शुरुआती बिंदु के रूप में कार्य करता है जो अपने लोड-परीक्षण प्रयासों में पायथन की शक्ति सीखना चाहते हैं।


टिप्पणी

मेरे परिदृश्य में, वर्णित स्क्रिप्ट मजबूत और प्रभावशाली साबित हुई। इसने कई मुद्दों की पहचान करने और उनका समाधान करने में एक उपयोगी उपकरण के रूप में कार्य किया। स्क्रिप्ट की आक्रामक प्रकृति महत्वपूर्ण मुद्दों को इंगित करने, प्रभावी डिबगिंग की सुविधा प्रदान करने और एक सहज और बेहतर उपयोगकर्ता अनुभव के लिए मार्ग प्रशस्त करने में ठीक थी, जो कि क्यूए के लिए बहुत अच्छा है।



निरंतरता में, मैं पायथन के मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करने वाली एक अन्य स्क्रिप्ट पर संक्षेप में चर्चा करूंगा। इस दृष्टिकोण का उद्देश्य परीक्षण स्क्रिप्ट के कई उदाहरणों को एक साथ निष्पादित करके लोड पीढ़ी को बढ़ाना है। मल्टीप्रोसेसिंग का प्राथमिक लक्ष्य एक स्क्रिप्ट के निष्पादन को समानांतर बनाना है, जिससे सेवा के साथ एक साथ इंटरैक्शन सक्षम हो सके। यह दृष्टिकोण पहले चर्चा किए गए अतुल्यकालिक दृष्टिकोण के विपरीत है, जहां कार्यों को क्रमिक रूप से निष्पादित किया जाता है लेकिन समवर्ती रूप से प्रबंधित किया जाता है। यह समान अनुरोधों वाले स्पैम/डीडीओएस की तरह है, लेकिन यह बहुत उपयोगी भी हो सकता है।

ज़रूरी भाग

  • प्रोफ़ाइल पुनर्प्राप्त करने का कार्य: एसिंक्रोनस स्क्रिप्ट के समान, हमें अभी भी क्लाउड सेवा से मौजूदा ब्राउज़र प्रोफ़ाइल लाने की आवश्यकता है।
 def get_profiles(): response = requests.get(url=f"{api}", params=PARAMS, headers=headers) return response


  • कार्य: स्क्रिप्ट का मूल दो कार्यों के इर्द-गिर्द घूमता है: स्टार्ट_प्रोफाइल और स्टॉप_प्रोफाइल। ये फ़ंक्शन क्रमशः ब्राउज़र प्रोफ़ाइल आरंभ और समाप्त करते हैं।
 def start_profiles(list_of_profiles_uuids): for uuid in list_of_profiles_uuids: # ... (API request to start profile) def stop_profiles(internal_uuids): for uuid in internal_uuids: # ... (API request to stop profile) def run_script(): start_profiles(get_profile_ids()) stop_profiles(list_of_ids)


  • मल्टीप्रोसेसिंग निष्पादन: स्क्रिप्ट लोड परीक्षण चक्र को समानांतर में कई बार चलाने के लिए मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करती है। प्रत्येक चक्र के लिए, एक नई प्रक्रिया उत्पन्न होती है, और run_script फ़ंक्शन को समवर्ती रूप से निष्पादित किया जाता है।
 if __name__ == "__main__": for runs in range(0, 5): processes = [] for i in range(20): p = multiprocessing.Process(target=run_script) processes.append(p) p.start() for p in processes: p.join()


मल्टीप्रोसेसिंग के साथ लोड कैसे उत्पन्न करें

  1. समानांतर निष्पादन: मल्टीप्रोसेसिंग मॉड्यूल द्वारा उत्पन्न प्रत्येक प्रक्रिया स्वतंत्र रूप से संचालित होती है, run_script फ़ंक्शन को समवर्ती रूप से निष्पादित करती है। यह समानांतरीकरण एक साथ सेवा को भेजे गए अनुरोधों की संख्या में उल्लेखनीय वृद्धि करता है।
  2. उपयोगकर्ता इंटरैक्शन का अनुकरण: स्क्रिप्ट के कई उदाहरणों को समानांतर में चलाकर, हम क्लाउड सेवा के साथ समवर्ती रूप से इंटरैक्ट करने वाले उपयोगकर्ताओं की एक बड़ी संख्या का अनुकरण करते हैं। यह दृष्टिकोण उन परिदृश्यों के लिए विशेष रूप से उपयोगी है जहां वास्तविक दुनिया के उपयोग में एक साथ बड़ी संख्या में उपयोगकर्ता शामिल होते हैं।

सही दृष्टिकोण चुनना

मल्टीप्रोसेसिंग लोड-परीक्षण अनुप्रयोगों के लिए एक रणनीति प्रदान करती है। यह QA इंजीनियरों को उनके अनुप्रयोगों की अनूठी विशेषताओं के आधार पर विभिन्न पद्धतियों के साथ प्रयोग करने की अनुमति देता है। जबकि अतुल्यकालिक परीक्षण समवर्ती कार्यों को प्रबंधित करने में दक्षता प्रदान करता है, मल्टीप्रोसेसिंग संपूर्ण परीक्षण प्रक्रिया को समानांतर करने में उत्कृष्टता प्रदान करता है। आप वह दृष्टिकोण चुन सकते हैं जो उनके विशिष्ट लोड-परीक्षण लक्ष्यों और एप्लिकेशन आवश्यकताओं के साथ सर्वोत्तम रूप से मेल खाता हो।


एक त्वरित अनुस्मारक:

इस डेमो का उद्देश्य शुरुआती-अनुकूल प्रारूप में बुनियादी अवधारणाओं को पेश करना है, जो प्रदर्शन परीक्षण में उतरने वाले क्यूए परीक्षकों के लिए पायथन की सादगी को उजागर करता है।

यदि आपके पास प्रोग्रामिंग चुनौतियाँ हैं, तो Google पर सामग्री खोजने और सहकर्मियों से पूछने में संकोच न करें, ChatGPT या इसी तरह के टूल का उपयोग करें, और अपनी लोड-टेस्टिंग स्क्रिप्ट लिखने में अतिरिक्त सहायता के लिए GitHub Copilot का उपयोग करें।


यहाँ भी प्रकाशित किया गया है.