paint-brush
Kiểm tra hiệu suất dựa trên Python dành cho người kiểm tra QA: Hướng dẫn cho người mới bắt đầu về kiểm tra tải API trên đám mâytừ tác giả@shad0wpuppet
27,041 lượt đọc
27,041 lượt đọc

Kiểm tra hiệu suất dựa trên Python dành cho người kiểm tra QA: Hướng dẫn cho người mới bắt đầu về kiểm tra tải API trên đám mây

từ tác giả Konstantin Sakhchinskiy8m2024/01/19
Read on Terminal Reader
Read this story w/o Javascript

dài quá đọc không nổi

Khám phá các tập lệnh Python dành cho người kiểm tra QA tiến hành kiểm tra tải trên API ứng dụng đám mây. Bài viết đề cập đến các phương pháp tiếp cận không đồng bộ và đa xử lý, cung cấp thông tin chuyên sâu về tùy chỉnh, lựa chọn phương pháp và các mẹo giám sát thực tế. Tận dụng khả năng kỹ thuật của Python để phân tích hiệu suất toàn diện.
featured image - Kiểm tra hiệu suất dựa trên Python dành cho người kiểm tra QA: Hướng dẫn cho người mới bắt đầu về kiểm tra tải API trên đám mây
Konstantin Sakhchinskiy HackerNoon profile picture
0-item
1-item


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} }

Các hàm không đồng bộ: Trọng tâm của các bài kiểm tra tải của tôi

  • Tìm nạp hồ sơ trình duyệt: Hàm 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()


  • Khởi động trình duyệt: Tập lệnh bắt đầu các chu kỳ, mỗi chu kỳ liên quan đến việc khởi động cấu hình trình duyệt một cách không đồng bộ. Điều này mô phỏng một kịch bản trong đó người dùng tạo đồng thời nhiều trình duyệt và sử dụng hồ sơ trình duyệt.
 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}')


  • Dừng trình duyệt và xóa hồ sơ: Sau khi khởi động hồ sơ, tập lệnh sẽ tìm nạp các hồ sơ đang hoạt động và dừng chúng, sau đó xóa tất cả hồ sơ. Kịch bản tải này đánh giá khả năng đáp ứng của dịch vụ đám mây trước những thay đổi linh hoạt và hiệu quả của nó trong việc dọn dẹp tài nguyên.
 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}')


  • Giám sát kết nối: hiểu tác động của tải Tập lệnh kết thúc bằng cách kiểm tra và báo cáo về các kết nối đang hoạt động. Bước này rất quan trọng để hiểu tác động của tải trọng và xác định các vấn đề tiềm ẩn liên quan đến giám sát.
 for conn in cl._transport._pool.connections: if conn._connection._state.value != 1: continue print(f'Connection in progress: {conn}')

Kiểm tra tải đang hoạt động

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

Điều chỉnh tải thử nghiệm theo nhu cầu của bạn

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.

Thành phần chính

  • Chức năng truy xuất hồ sơ: Tương tự như tập lệnh không đồng bộ, chúng ta vẫn cần tìm nạp hồ sơ trình duyệt hiện có từ dịch vụ đám mây.
 def get_profiles(): response = requests.get(url=f"{api}", params=PARAMS, headers=headers) return response


  • Chức năng: Cốt lõi của tập lệnh xoay quanh hai chức năng: start_profiles và stop_profiles. Các chức năng này bắt đầu và kết thúc hồ sơ trình duyệt tương ứng.
 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)


  • Thực thi đa xử lý: Tập lệnh sử dụng mô-đun đa xử lý để chạy song song chu trình kiểm tra tải nhiều lần. Đối với mỗi chu kỳ, một quy trình mới sẽ được sinh ra và hàm run_script được thực thi đồng thời.
 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()


Cách tạo tải với đa xử lý

  1. Thực thi song song: Mỗi quy trình do mô-đun đa xử lý tạo ra hoạt động độc lập, thực thi đồng thời hàm run_script. Sự song song hóa này làm tăng đáng kể số lượng yêu cầu được gửi đến dịch vụ cùng một lúc.
  2. Mô phỏng tương tác của người dùng: Bằng cách chạy song song nhiều phiên bản của tập lệnh, chúng tôi mô phỏng lượng người dùng tương tác đồng thời với dịch vụ đám mây cao hơn. Cách tiếp cận này đặc biệt hữu ích cho các tình huống trong đó việc sử dụng trong thế giới thực có sự tham gia của một số lượng lớn người dùng đồng thời.

Lựa chọn cách tiếp cận phù hợp

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 .