Bạn có phải là người kiểm tra QA mong muốn đi sâu vào thử nghiệm hiệu suất mà không cần có kiến thức chuyên môn về lập trình sâu rộng không? Trong bài viết này, chúng ta sẽ khám phá một cách dễ tiếp cận để những người không phải lập trình viên tiến hành loại thử nghiệm tải trên API ứng dụng đám mây bằng Python . Kiểm tra tải mà không cần mã hóa phức tạp - khám phá cách ngay cả những người kiểm tra QA thông thường cũng có thể sử dụng Python để tìm ra các lỗi nghiêm trọng và phát hiện các tắc nghẽn tiềm ẩn về hiệu suất.
Kiểm tra hiệu suất là một khía cạnh quan trọng để đảm bảo ứng dụng của bạn có thể đáp ứng các nhu cầu trong thế giới thực. Tôi sẽ cố gắng giải thích cách tiếp cận của mình và các tập lệnh Python được thiết kế để kiểm tra tải một trình duyệt quản lý dịch vụ đám mây.
Kịch bản kiểm tra tải Hãy tưởng tượng một dịch vụ đám mây chịu trách nhiệm quản lý hồ sơ trình duyệt (các trình duyệt để loại bỏ web). Người dùng tương tác thông qua API với dịch vụ để tạo, bắt đầu, dừng, xóa, v.v. hồ sơ. Tập lệnh Python của tôi mô phỏng kịch bản này, áp dụng tải cho dịch vụ đám mây bằng cách thực hiện liên tục các hành động này.
# 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
truy xuất hồ sơ trình duyệt hiện có từ dịch vụ, mô phỏng tình huống trong đó người dùng yêu cầu thông tin. 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}')
Chức năng chính điều phối các chu trình kiểm tra tải, lặp qua các cấu hình và thực thi các tác vụ không đồng bộ. Mỗi chu kỳ thể hiện sự tương tác mô phỏng của người dùng, tạo, sử dụng và xóa hồ sơ trình duyệt.
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
Tập lệnh này hiển thị nền tảng để QA điều chỉnh các kịch bản kiểm tra tải cho ứng dụng của họ. Bằng cách tùy chỉnh số chu kỳ, điều chỉnh tương tác của người dùng và sửa đổi tập lệnh để phù hợp với các điểm cuối API cụ thể, người thử nghiệm có thể thu được những hiểu biết có giá trị về hiệu suất ứng dụng của họ trong các mức tải khác nhau. Tại đây, bạn sẽ cần các công cụ giám sát thiết yếu để lấy thông tin về trạng thái máy chủ, đánh giá tải máy chủ cũng như theo dõi nhật ký và sử dụng tài nguyên. Sử dụng các công cụ như Grafana, Kibana, Prometheus, v.v. để giám sát toàn diện. Ngoài ra, hãy theo dõi chặt chẽ các phản hồi mà tập lệnh của bạn nhận được, đảm bảo đánh giá kỹ lưỡng về hiệu suất ứng dụng của bạn. Cách tiếp cận này là vô giá trong việc kiểm tra tải và phân tích hiệu suất hiệu quả của bạn.
Ngoài ra, để mô phỏng tải thực tế hơn, hãy xem xét mở các trang cụ thể trong trình duyệt của bạn. Mặc dù cá nhân tôi đã sử dụng trang bắt đầu trong trình duyệt của mình, nhưng bạn cũng có thể khám phá các tùy chọn như Pyppeteer hoặc Playwright để mở nhiều tab và điều hướng qua nhiều trang khác nhau. Cách tiếp cận này nâng cao tính xác thực của kịch bản kiểm tra tải của bạn, gần giống với tương tác của người dùng với ứng dụng của bạn.
# 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)}')
Khả năng không đồng bộ của Python, kết hợp với các thư viện HTTP, khiến nó trở thành một công cụ linh hoạt để kiểm tra tải các hệ thống dựa trên đám mây. Ví dụ này đóng vai trò là điểm khởi đầu cho các kỹ sư QA muốn tìm hiểu sức mạnh của Python trong nỗ lực kiểm tra tải của họ.
GHI CHÚ
Trong kịch bản của tôi, kịch bản được mô tả tỏ ra mạnh mẽ và có tác động. Nó phục vụ như một công cụ hữu ích trong việc xác định và giải quyết nhiều vấn đề. Bản chất tích cực của tập lệnh có thể xác định chính xác các vấn đề quan trọng, tạo điều kiện gỡ lỗi hiệu quả và dẫn đầu để mang lại trải nghiệm người dùng liền mạch và được cải thiện, điều này khá tốt đối với một QA.
Tiếp theo, tôi sẽ thảo luận ngắn gọn về một tập lệnh khác sử dụng mô-đun đa xử lý của Python. Cách tiếp cận này nhằm mục đích tăng cường việc tạo tải bằng cách thực thi đồng thời nhiều phiên bản của tập lệnh thử nghiệm. Mục tiêu chính của đa xử lý là song song hóa việc thực thi tập lệnh, cho phép tương tác đồng thời với dịch vụ. Cách tiếp cận này trái ngược với cách tiếp cận không đồng bộ đã thảo luận trước đó, trong đó các nhiệm vụ được thực hiện tuần tự nhưng được quản lý đồng thời. Điều này giống như spam/ddos hơn với cùng yêu cầu nhưng cũng có thể rất hữu ích.
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()
Việc đa xử lý cung cấp một chiến lược cho các ứng dụng kiểm tra tải. Nó cho phép các kỹ sư QA thử nghiệm các phương pháp khác nhau dựa trên các đặc điểm riêng của ứng dụng của họ. Trong khi thử nghiệm không đồng bộ mang lại hiệu quả trong việc quản lý các tác vụ đồng thời, đa xử lý vượt trội trong việc song song hóa toàn bộ quá trình thử nghiệm. Bạn có thể chọn phương pháp phù hợp nhất với mục tiêu kiểm tra tải cụ thể và yêu cầu ứng dụng của họ.
Một lời nhắc nhở nhanh chóng:
Bản demo này nhằm mục đích giới thiệu các khái niệm cơ bản ở định dạng thân thiện với người mới bắt đầu, nêu bật tính đơn giản của Python dành cho những người thử nghiệm QA khi tham gia thử nghiệm hiệu suất.
Nếu bạn gặp khó khăn trong việc lập trình, đừng ngần ngại tìm kiếm nội dung trên Google và hỏi đồng nghiệp, sử dụng ChatGPT hoặc các công cụ tương tự, đồng thời sử dụng GitHub Copilot để được hỗ trợ thêm trong việc viết tập lệnh kiểm tra tải của bạn.
Cũng được xuất bản ở đây .