paint-brush
QA 테스터를 위한 Python 기반 성능 테스트: Cloud API 부하 테스트 초보자 가이드~에 의해@shad0wpuppet
27,062 판독값
27,062 판독값

QA 테스터를 위한 Python 기반 성능 테스트: Cloud API 부하 테스트 초보자 가이드

~에 의해 Konstantin Sakhchinskiy8m2024/01/19
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

클라우드 앱 API에서 부하 테스트를 수행하는 QA 테스터를 위한 Python 스크립트를 살펴보세요. 이 기사에서는 비동기식 및 다중 처리 접근 방식을 다루며 사용자 정의, 방법론 선택 및 실용적인 모니터링 팁에 대한 통찰력을 제공합니다. 포괄적인 성능 분석을 위해 Python의 기술 기능을 활용하세요.
featured image - QA 테스터를 위한 Python 기반 성능 테스트: Cloud API 부하 테스트 초보자 가이드
Konstantin Sakhchinskiy HackerNoon profile picture
0-item
1-item


광범위한 프로그래밍 전문 지식 없이도 성능 테스트에 뛰어들고 싶어하는 QA 테스터이신가요? 이 기사에서는 프로그래머가 아닌 사람들이 Python 을 사용하여 클라우드 앱 API에 대한 일종의 로드 테스트를 수행할 수 있는 접근 가능한 방법을 살펴보겠습니다. 복잡한 코딩이 필요 없는 로드 테스트 - 일반 QA 테스터도 Python을 사용하여 심각한 버그를 찾고 잠재적인 성능 병목 현상을 발견할 수 있는 방법을 알아보세요.


성능 테스트는 애플리케이션이 실제 요구 사항을 처리할 수 있는지 확인하는 데 있어 중요한 측면입니다. 브라우저를 관리하는 클라우드 서비스의 부하 테스트를 위해 설계된 접근 방식과 Python 스크립트를 설명하려고 합니다.


부하 테스트 시나리오 브라우저 프로필(웹 스크래핑용 브라우저) 관리를 담당하는 클라우드 서비스를 상상해 보십시오. 사용자는 API를 통해 서비스와 상호 작용하여 프로필 생성, 시작, 중지, 삭제 등을 수행합니다. 내 Python 스크립트는 이러한 작업을 반복적으로 수행하여 클라우드 서비스에 부하를 적용하여 이 시나리오를 시뮬레이션합니다.


 # 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)}')

Python의 비동기 기능은 HTTP 라이브러리와 결합되어 클라우드 기반 시스템의 부하 테스트를 위한 다목적 도구가 됩니다. 이 예는 부하 테스트 시도에서 Python의 성능을 배우려는 QA 엔지니어의 출발점 역할을 합니다.


메모

내 시나리오에서는 설명된 스크립트가 강력하고 영향력이 있는 것으로 나타났습니다. 이는 수많은 문제를 식별하고 해결하는 데 유용한 도구로 사용되었습니다. 스크립트의 공격적인 성격은 중요한 문제를 정확히 찾아내고, 효과적인 디버깅을 촉진하며, 원활하고 향상된 사용자 경험을 선도하는 데 괜찮았으며 이는 QA에 매우 좋습니다.



계속해서 Python의 다중 처리 모듈을 활용하는 또 다른 스크립트에 대해 간략하게 설명하겠습니다. 이 접근 방식은 테스트 스크립트의 여러 인스턴스를 동시에 실행하여 로드 생성을 향상시키는 것을 목표로 합니다. 다중 처리의 주요 목표는 스크립트 실행을 병렬화하여 서비스와의 동시 상호 작용을 가능하게 하는 것입니다. 이 접근 방식은 작업이 순차적으로 실행되지만 동시에 관리되는 앞서 설명한 비동기식 접근 방식과 대조됩니다. 이는 동일한 요청을 포함하는 스팸/DDoS와 비슷 하지만 매우 유용할 수도 있습니다.

주요 구성 요소

  • 프로필 검색 기능: 비동기 스크립트와 유사하게 클라우드 서비스에서 기존 브라우저 프로필을 가져와야 합니다.
 def get_profiles(): response = requests.get(url=f"{api}", params=PARAMS, headers=headers) return response


  • 기능: 스크립트의 핵심은 start_profiles 및 stop_profiles라는 두 가지 기능을 중심으로 진행됩니다. 이러한 함수는 각각 브라우저 프로필을 시작하고 종료합니다.
 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 엔지니어는 애플리케이션의 고유한 특성을 기반으로 다양한 방법론을 실험할 수 있습니다. 비동기식 테스트는 동시 작업 관리에 효율성을 제공하는 반면, 다중 처리는 전체 테스트 프로세스를 병렬화하는 데 탁월합니다. 특정 부하 테스트 목표 및 애플리케이션 요구 사항에 가장 적합한 접근 방식을 선택할 수 있습니다.


빠른 알림:

이 데모는 초보자에게 친숙한 형식으로 기본 개념을 소개하고 성능 테스트에 도전하는 QA 테스터를 위한 Python의 단순성을 강조하는 것을 목표로 합니다.

프로그래밍에 어려움이 있는 경우 주저하지 말고 Google에 문의하고 동료에게 물어보세요. ChatGPT 또는 유사한 도구를 사용하고 GitHub Copilot을 사용하여 부하 테스트 스크립트 작성에 추가 지원을 받으세요.


여기에도 게시되었습니다.