क्या आप एक क्यूए परीक्षक हैं जो व्यापक प्रोग्रामिंग विशेषज्ञता की आवश्यकता के बिना प्रदर्शन परीक्षण में उतरने के लिए उत्सुक हैं? इस लेख में, हम गैर-प्रोग्रामर्स के लिए पायथन का उपयोग करके क्लाउड ऐप्स एपीआई पर लोड परीक्षण करने का एक सुलभ तरीका तलाशेंगे। जटिल कोडिंग की आवश्यकता के बिना लोड परीक्षण - पता लगाएं कि नियमित क्यूए परीक्षक भी गंभीर बग ढूंढने और संभावित प्रदर्शन बाधाओं को उजागर करने के लिए पायथन का उपयोग कैसे कर सकते हैं।
प्रदर्शन परीक्षण यह सुनिश्चित करने का एक महत्वपूर्ण पहलू है कि आपके एप्लिकेशन वास्तविक दुनिया की मांगों को संभाल सकते हैं। मैं ब्राउज़रों को प्रबंधित करने वाली क्लाउड सेवा के लोड परीक्षण के लिए डिज़ाइन किए गए अपने दृष्टिकोण और पायथन स्क्रिप्ट को समझाने का प्रयास करूंगा।
लोड परीक्षण परिदृश्य ब्राउज़र प्रोफाइल (वेब स्क्रैपिंग के लिए ब्राउज़र) के प्रबंधन के लिए जिम्मेदार क्लाउड सेवा की कल्पना करें। उपयोगकर्ता प्रोफ़ाइल बनाने, प्रारंभ करने, रोकने, हटाने आदि के लिए सेवा के साथ एपीआई के माध्यम से इंटरैक्ट करते हैं। मेरी पायथन स्क्रिप्ट इस परिदृश्य का अनुकरण करती है, इन क्रियाओं को बार-बार निष्पादित करके क्लाउड सेवा पर लोड लागू करती है।
# 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)
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()
मल्टीप्रोसेसिंग लोड-परीक्षण अनुप्रयोगों के लिए एक रणनीति प्रदान करती है। यह QA इंजीनियरों को उनके अनुप्रयोगों की अनूठी विशेषताओं के आधार पर विभिन्न पद्धतियों के साथ प्रयोग करने की अनुमति देता है। जबकि अतुल्यकालिक परीक्षण समवर्ती कार्यों को प्रबंधित करने में दक्षता प्रदान करता है, मल्टीप्रोसेसिंग संपूर्ण परीक्षण प्रक्रिया को समानांतर करने में उत्कृष्टता प्रदान करता है। आप वह दृष्टिकोण चुन सकते हैं जो उनके विशिष्ट लोड-परीक्षण लक्ष्यों और एप्लिकेशन आवश्यकताओं के साथ सर्वोत्तम रूप से मेल खाता हो।
एक त्वरित अनुस्मारक:
इस डेमो का उद्देश्य शुरुआती-अनुकूल प्रारूप में बुनियादी अवधारणाओं को पेश करना है, जो प्रदर्शन परीक्षण में उतरने वाले क्यूए परीक्षकों के लिए पायथन की सादगी को उजागर करता है।
यदि आपके पास प्रोग्रामिंग चुनौतियाँ हैं, तो Google पर सामग्री खोजने और सहकर्मियों से पूछने में संकोच न करें, ChatGPT या इसी तरह के टूल का उपयोग करें, और अपनी लोड-टेस्टिंग स्क्रिप्ट लिखने में अतिरिक्त सहायता के लिए GitHub Copilot का उपयोग करें।
यहाँ भी प्रकाशित किया गया है.