상상해보세요. 새로운 웹 애플리케이션이 있다고 가정해보세요. 그리고 이것이 소수의 사용자 그룹과 잘 작동한다는 것을 알고 있습니다. 그러나 예상되는 부하를 초과하는 증가한 트래픽에 대응하기 위해 어떻게 응답할 것인가요? Python을 사용하여 웹 애플리케이션에 대한 부하 테스트를 실행하세요!
이 기사에서 여러분은 한꺼번에 수백 명의 사용자가 여러분의 애플리케이션에 접근하는 것을 시뮬레이션하여 웹 애플리케이션에 대한 부하 테스트를 실행하는 방법을 배울 것입니다.
웹 사이트에 대한 부하 테스트를 시작하려면 계속 읽어보세요!
필수 사항
이 자습서는 실습을 위한 것입니다. 함께 진행하려면 다음 사항이 있는지 확인하세요:
- 우분투 리눅스 머신 – 이 자습서는 우분투 21.04를 사용하지만 macOS나 다른 Linux 배포판, WSL도 작동합니다.
- Python 3.8 이상이 설치되어 있어야 합니다.
- Pip 패키지 관리자와 가상 환경 모듈이 설치되어 있어야 합니다.
- A Microsoft Azure account with a storage account.
정적 웹사이트 설정
웹 사이트에 대한 부하 테스트를 실행하기 전에 먼저 데모 사이트를 설정해야합니다. 이 튜토리얼에서는 정적 웹 사이트와 데모 API를 만들 것입니다. 그러나 여기서는 먼저 정적 웹 사이트에 중점을 둘 것입니다. 정적 웹 사이트는 부하 테스트의 기본을 보여줄 것이며, API는 다양한 매개변수를 전달하여 다양한 작업을 시뮬레이션하는 방법을 보여줍니다.
API에 대한 부하 테스트를 시작하려면, 로커스트를 설치하고 컴퓨터에서 실행하는 다음 섹션으로 건너뛸 수 있습니다. 이 튜토리얼의 데모는 Swagger Petstore 데모 API를 사용합니다.
- 선호하는 코드 편집기에서 새 파일을 만들고 아래 코드를 복사하여 새 파일에 붙여넣고 선호하는 이름으로 저장하십시오. 이 예에서 파일의 이름은 load_test_page.html입니다.
다음은 웹 브라우저에서 열 때 “이것은 테스트 페이지입니다.” 텍스트를 표시하는 HTML 문서입니다.
2. 이제 좋아하는 웹 브라우저를 열고 Azure Portal의 저장소 계정으로 이동하십시오.
3. 저장소 계정 내에서 정적 웹 사이트 호스팅을 활성화하고 웹 사이트의 홈페이지를 설정하려면 다음 단계를 따르십시오:
- 왼쪽 탐색 패널에서 정적 웹사이트를 클릭하세요. 정적 웹사이트 페이지는 데모 사이트 파일을 업로드할 위치입니다.
- 활성화됨을 클릭하여 정적 웹사이트 호스팅를 활성화하세요.
- load_test_page.html을 인덱스 문서 이름 필드에 입력하고 저장을 클릭하세요. 이렇게 하면 블롭 컨테이너와 웹사이트로의 주요 엔드포인트를 가리키는 URL이 자동으로 생성됩니다. 이 URL은 아직 작동하지 않지만 나중을 위해 저장하세요.

4. 왼쪽 패널에서 저장소 탐색기 (미리 보기)를 클릭하고 블롭 컨테이너 → $web로 이동하세요. 정적 웹사이트 기능에 의해 생성된 $web 블롭 컨테이너는 모든 정적 파일을 호스팅합니다.
업로드를 클릭하고, 그런 다음 단계 하나에서 만든 load_test_page.html을 업로드하세요.

5. 마지막으로, 웹 브라우저에서 새 탭을 열고 단계 두에서 메모한 URL로 이동하여 URL이 작동하는지 확인하세요.

Locust 프레임워크 설치
이제 테스트할 사이트가 있지만 웹사이트를 테스트할 로드 테스트 도구가 필요합니다. 고부하 테스트를 관리하기 위한 코드를 작성하는 것은 시간이 많이 소요되고 오류가 발생할 수 있습니다. 그러니까 왜 Locust 프레임워크를 사용하지 않으시겠습니까? Locust는 파이썬으로 작성된 오픈 소스 도구로, pip 패키지 관리자를 통해 설치할 수 있습니다.
파이썬을 복습해야 할 경우, 파이썬 함수 입문자를 확인하세요.
Locust는 정적 사이트, 웹 애플리케이션 또는 심지어 API에 대한 부하 테스트를 실행할 수 있습니다. 유일한 요구 사항은 테스트하는 대상이 장치에서 도달할 수 있는 HTTP(S) 엔드포인트를 가지고 있어야 합니다.
기본적으로
pip
패키지 관리자는 Linux 및 MacOS에서 ~/.local 디렉토리에 패키지를 설치합니다. 이 경로는 Python 가상 환경에서만 사용할 수 있습니다. 이것이 튜토리얼에서pip
을 사용하는 이유입니다.
- 터미널을 열고 아래 명령어를 실행하여 새 가상 환경을 만들고 Locust를 설치합니다.

2. 새 디렉토리를 만들고 해당 디렉토리로 이동하도록 아래 명령어를 실행하세요. 이렇게 하면 로커스트 파일이 코드베이스의 나머지 부분과 격리되어 정리하기가 쉬워집니다. 이 예에서 디렉토리의 이름은 locust_dir입니다.
3. 마지막으로 locustfile.py라는 새 파일을 locust_dir 디렉토리에 만든 다음 아래 코드를 locustfile.py 파일에 복사/붙여넣기하세요. 이 파일에는 사용자를 시뮬레이트하는 방법, 사용자가 방문할 엔드포인트 및 전달할 매개변수와 같은 테스트 지침이 포함됩니다.
Locust가 실행되면 locustfile.py라는 특정 파일을 찾습니다. 따라서 해당 파일을 별도의 디렉토리(locust_dir)에 저장하여 Locust가 찾을 수 있도록 하는 것이 가장 좋습니다. 이렇게 하면 다른 테스트를 덮어쓰지 않고 추가 테스트를 생성할 수 있습니다.
아래 코드는 제공한 호스트 이름의 경로에 대한 HTTP GET 요청을 실행하며, 이는 명령 줄에서 curl http://<Host>/
를 실행하는 것과 동일합니다.
응답을 받으면 Locust는 즉시 다음 요청을 보내고, 전체 과정이 각 가상 사용자에 대해 반복됩니다.
메서드 내의 경로가 불완전해 보이는 것은 그렇기 때문입니다. locust 파일에서는 호스트가 런타임에 전달되는 반면, 경로와 쿼리 매개변수만 정의됩니다. 이 메서드는 다음 단계에서 더 의미가 있어집니다.
Running a Load Test Against Static Sites
이제 Locust를 설치했으니 로드 테스트를 실행할 시간입니다! 로드 테스트는 애플리케이션이 어떻게 동작하는지 확인하기 위해 일련의 웹 요청을 작성하는 것 이상입니다. 완전한 테스트는 다양한 엔드포인트 및 설정에서 응답 시간, 실패율 및 오류 코드를 기록합니다.
Locust는 명령 줄에서 또는 웹 인터페이스를 통해 호출될 수 있는 유연성이 있습니다. 이 튜토리얼에서는 웹 인터페이스를 사용하여 정적 사이트에 대한 로드 테스트를 실행합니다.
locust
명령을 실행하여 locustfile.py 파일에서 테스트 시나리오를 사용하여 locust 그래픽 애플리케이션을 시작합니다.

2. 웹 브라우저를 열고 http://localhost:8089/로 이동하여 Locust에 액세스합니다. 8089 포트는 Locust가 실행되는 기본 포트입니다.
“정적 웹 사이트 설정” 섹션에서 세 번째 단계에서 기록한 URL(기본 엔드포인트)을 기억하세요? 이제 그것을 다음 단계에서 사용할 때입니다!
3. 마지막으로 스크린샷에서 볼 수 있는대로 Host 필드에 URL(기본 엔드포인트)를 입력한 다음 Start swarming을 클릭하여 로드 테스트를 시작합니다. 이렇게 하면 locustfile.py의 테스트가 입력한 Host 필드에 대한 URL에서 실행되도록 됩니다.
이 데모에서는 사용자 수 또는 생성 속도 필드의 값을 변경하는 것이 선택 사항입니다.
사용자 수는 동시에 생성할 가상 사용자의 최대 수입니다. 동시에, 생성률은 Locust가 가상 사용자의 최대 동시성에 도달할 때까지 매초마다 생성되는 사용자 수입니다. 테스트를 중지할 때까지 가상 사용자 수는 최대로 유지됩니다.

테스트를 실행하는 동안 Locust는 호스트를 추가하고 사용자 클래스의 각 경로에 대해 실시간으로 요청을 보냅니다. 응답을 받으면 Locust가 즉시 다른 요청을 보냅니다.
아래에 테스트된 엔드포인트 목록과 응답 시간, 실패 및 초당 요청에 대한 통계가 표시됩니다.

웹 사이트의 성능 메트릭을 그래픽으로 확인하려면 아래 그림과 같이 차트 탭을 클릭하십시오.

API에 대한 부하 테스트 실행
이제 Locust의 기본 사항을 알았으니, 좀 더 현실적인 테스트 사례를 살펴보겠습니다. 정적 사이트는 매우 안정적이며 성능 테스트를 실행할 때 크게 잘못될 것이 없습니다. 그렇다면 왜 API에 대한 부하 테스트를 실행해야 하나요?
API는 응답에서 훨씬 더 많은 변동성을 가질 수 있으며, 안정적이지 않은 호스팅 옵션이 많으며, 다운 타임을 경험할 경우 귀하의 조직에 더 많은 영향을 미칠 수 있습니다.
API 및 작동 방식에 익숙하지 않은 경우, 인증, HTTP 메서드 및 JSON 응답과 같은 기본 사항을 다루는 기사가 있습니다. 이 기사는 PowerShell을 위한 것이지만 API 개념은 이 기사의 나중에 중요할 것입니다.
- locustfile.py 파일의 내용을 아래의 코드로 대체하십시오. 이 코드는 몇 가지 작업을 수행합니다.
- Locust가 새 가상 사용자를 인스턴스화할 때 사용자를 인증하기 위해 GET 요청을 실행합니다
- 호스트에서 GET 요청을 실행하고 해당 리소스가 존재하지 않기 때문에 실패합니다
- 동일한 엔드포인트의 항목 범위를 지나가는 JSON 본문을 전달하는 POST 요청을 실행합니다.
.
테스트 클래스에
on_start
문을 추가하지 않으면 다른 메서드를 테스트할 때 Locust가 시도할 때 “403 Not Authorized” 오류가 반환됩니다. 이 메서드를 주석 처리하고 Locust를 다시 실행하여 테스트에 어떤 영향을 미치는지 확인해보세요.
2. 다음으로, 펫 스토어 API에 대한 문서를 엽니다. 위의 테스트 케이스는 특히 이 API를 위해 작성되었으므로 이 자습서와 함께 이 페이지를 열어 엔드포인트를 살펴보는 것이 도움이 됩니다.
아래의 locust
명령을 “정적 사이트에 대한 부하 테스트 실행” 섹션에서 한 것처럼 실행하십시오(단계 1).

마지막으로, Locust UI에서 호스트로 https://petstore.swagger.io/v2를 입력하십시오.

결론
이 자습서에서는 정적 웹 사이트와 API에 대한 부하 테스트를 실행하는 방법을 배웠습니다. 이제 사용자의 대규모 유입에 대한 사이트를 테스트하는 방법에 대해 더 잘 이해하게 되었습니다. 부하 테스트는 고객에게 애플리케이션을 출시하기 전에 준비할 때 유용합니다. 동일한 이치는 자동 확장 구성 또는 낮은 지연을 위한 애플리케이션 성능을 테스트할 때도 적용됩니다.
이제 현재 사용하고 있는 애플리케이션이나 지원하는 애플리케이션을 생각해보세요. 동시에 대규모 사용자 무리가 사용할 때 어떻게 반응할까요? 부하 테스트 시나리오가 어떤 종류의 문제를 지적하여 애플리케이션 성능을 더 잘 수행하도록 할 수 있을까요?