আপনি কি একজন QA পরীক্ষক বিস্তৃত প্রোগ্রামিং দক্ষতার প্রয়োজন ছাড়াই কর্মক্ষমতা পরীক্ষায় ডুব দিতে আগ্রহী? এই নিবন্ধে, আমরা পাইথন ব্যবহার করে ক্লাউড অ্যাপ এপিআই-এ লোড পরীক্ষা করার জন্য নন-প্রোগ্রামারদের জন্য একটি সহজ উপায় অন্বেষণ করব। জটিল কোডিংয়ের প্রয়োজন ছাড়াই পরীক্ষা লোড করুন - এমনকি নিয়মিত QA পরীক্ষকরা কীভাবে গুরুতর বাগ খুঁজে পেতে এবং সম্ভাব্য কর্মক্ষমতা বাধাগুলি উন্মোচন করতে পাইথন ব্যবহার করতে পারে তা আবিষ্কার করুন।
কর্মক্ষমতা পরীক্ষা আপনার অ্যাপ্লিকেশনগুলি বাস্তব-বিশ্বের চাহিদাগুলি পরিচালনা করতে পারে তা নিশ্চিত করার একটি গুরুত্বপূর্ণ দিক। আমি একটি ক্লাউড সার্ভিস ম্যানেজিং ব্রাউজার লোড পরীক্ষার জন্য ডিজাইন করা আমার পদ্ধতি এবং পাইথন স্ক্রিপ্টগুলি ব্যাখ্যা করার চেষ্টা করব।
লোড টেস্টিং দৃশ্যকল্প কল্পনা করুন একটি ক্লাউড পরিষেবা ব্রাউজার প্রোফাইল পরিচালনার জন্য দায়ী (ওয়েব স্ক্র্যাপিংয়ের জন্য ব্রাউজার)। ব্যবহারকারীরা প্রোফাইল তৈরি, শুরু, বন্ধ, মুছে ফেলা ইত্যাদি পরিষেবার সাথে API এর মাধ্যমে ইন্টারঅ্যাক্ট করে। আমার পাইথন স্ক্রিপ্ট এই দৃশ্যের অনুকরণ করে, বারবার এই ক্রিয়াগুলি সম্পাদন করে ক্লাউড পরিষেবাতে লোড প্রয়োগ করে।
# 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
এই স্ক্রিপ্টটি তাদের অ্যাপ্লিকেশনের সাথে লোড-পরীক্ষার পরিস্থিতি তৈরি করার জন্য QA-এর একটি ভিত্তি দেখায়। চক্রের সংখ্যা কাস্টমাইজ করে, ব্যবহারকারীর ইন্টারঅ্যাকশন সামঞ্জস্য করে, এবং নির্দিষ্ট API এন্ডপয়েন্টে ফিট করার জন্য স্ক্রিপ্ট পরিবর্তন করে, পরীক্ষকরা বিভিন্ন লোডের অধীনে তাদের অ্যাপ্লিকেশনের কর্মক্ষমতা সম্পর্কে মূল্যবান অন্তর্দৃষ্টি অর্জন করতে পারে। এখানে, সার্ভারের অবস্থা সম্পর্কে তথ্য পেতে, সার্ভারের লোড মূল্যায়ন করতে এবং সম্পদের ব্যবহার এবং লগগুলি ট্র্যাক করতে আপনার প্রয়োজনীয় পর্যবেক্ষণ সরঞ্জামগুলির প্রয়োজন হবে৷ ব্যাপক পর্যবেক্ষণের জন্য Grafana, Kibana, Prometheus, ইত্যাদির মতো টুল ব্যবহার করুন। অতিরিক্তভাবে, আপনার স্ক্রিপ্ট যে প্রতিক্রিয়াগুলি পায় তার উপর ঘনিষ্ঠ নজর রাখুন, আপনার অ্যাপ্লিকেশনের কর্মক্ষমতার পুঙ্খানুপুঙ্খ মূল্যায়ন নিশ্চিত করুন৷ এই পদ্ধতিটি আপনার কার্যকর লোড পরীক্ষা এবং কর্মক্ষমতা বিশ্লেষণে অমূল্য।
উপরন্তু, আরো বাস্তবসম্মত লোড সিমুলেশনের জন্য, আপনার ব্রাউজারে নির্দিষ্ট পৃষ্ঠা খোলার কথা বিবেচনা করুন। যদিও আমি ব্যক্তিগতভাবে আমার ব্রাউজারে একটি স্টার্ট পেজ ব্যবহার করেছি, আপনি একাধিক ট্যাব খুলতে এবং বিভিন্ন পৃষ্ঠায় নেভিগেট করার জন্য Pyppeteer বা Playwright এর মত বিকল্পগুলিও অন্বেষণ করতে পারেন। এই পদ্ধতিটি আপনার লোড-পরীক্ষার দৃশ্যকল্পের সত্যতা বাড়ায়, আপনার অ্যাপ্লিকেশনের সাথে ব্যবহারকারীর মিথস্ক্রিয়া ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ।
# 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 ইঞ্জিনিয়ারদের জন্য একটি সূচনা বিন্দু হিসাবে কাজ করে যারা তাদের লোড-পরীক্ষার প্রচেষ্টায় পাইথনের শক্তি শিখতে চায়।
বিঃদ্রঃ
আমার দৃশ্যে, বর্ণিত স্ক্রিপ্ট শক্তিশালী এবং প্রভাবশালী হতে প্রমাণিত. এটি অসংখ্য সমস্যা সনাক্তকরণ এবং সমাধানে একটি দরকারী টুল হিসেবে কাজ করেছে। স্ক্রিপ্টের আক্রমনাত্মক প্রকৃতি সমালোচনামূলক সমস্যাগুলি চিহ্নিত করতে, কার্যকর ডিবাগিং সহজতর করতে এবং একটি নিরবচ্ছিন্ন এবং উন্নত ব্যবহারকারীর অভিজ্ঞতার জন্য নেতৃত্ব দেওয়ার ক্ষেত্রে ঠিক ছিল, যা একটি 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 ইঞ্জিনিয়ারদের তাদের অ্যাপ্লিকেশনের অনন্য বৈশিষ্ট্যের উপর ভিত্তি করে বিভিন্ন পদ্ধতি নিয়ে পরীক্ষা করার অনুমতি দেয়। যদিও অ্যাসিঙ্ক্রোনাস টেস্টিং সমসাময়িক কাজগুলি পরিচালনায় দক্ষতা প্রদান করে, মাল্টিপ্রসেসিং সমগ্র পরীক্ষার প্রক্রিয়াকে সমান্তরাল করার ক্ষেত্রে দক্ষতা অর্জন করে। আপনি তাদের নির্দিষ্ট লোড-পরীক্ষার লক্ষ্য এবং আবেদনের প্রয়োজনীয়তার সাথে সর্বোত্তমভাবে সারিবদ্ধ পদ্ধতি বেছে নিতে পারেন।
একটি দ্রুত অনুস্মারক:
এই ডেমোটির লক্ষ্য হল প্রাথমিক ধারণাগুলিকে একটি শিক্ষানবিস-বান্ধব বিন্যাসে প্রবর্তন করা, QA পরীক্ষকদের পারফরম্যান্স পরীক্ষায় অংশ নেওয়ার জন্য পাইথনের সরলতা তুলে ধরা।
আপনার যদি প্রোগ্রামিং চ্যালেঞ্জ থাকে, তাহলে গুগল স্টাফ করতে দ্বিধা করবেন না এবং সহকর্মীদের জিজ্ঞাসা করুন, ChatGPT বা অনুরূপ সরঞ্জামগুলি ব্যবহার করুন এবং আপনার লোড-টেস্টিং স্ক্রিপ্টগুলি লিখতে অতিরিক্ত সহায়তার জন্য GitHub Copilot ব্যবহার করুন৷
এছাড়াও এখানে প্রকাশিত.