Locust로 부하 테스트하기
현재 진행하고 있는 프로젝트에서 최근 부하 테스트를 담당하게 되었습니다. 테스트를 위한 도구는 여러 가지가 있지만 저희는 빠르고 간단하게 사용할 수 있는 Locust를 사용하기로 했습니다.
생각보다 Locust 사용 사례가 많지 않아서, 이 과정에서 겪었던 과정들과 문제들을 정리해 보려고 합니다.
간단한 사용법
Locust는 Python 코드를 작성할 수 있다면 간단하게 사용할 수 있습니다.
Locust에서 중요한 파일은 크게 2가지입니다.
locust.conf
: 테스트 환경에 대한 설정 파일입니다.locustfile.py
: 테스트 코드를 작성하는 파일입니다.
먼저 locust.conf
파일은 다음과 같은 형태로 작성합니다.
(주석은 실제 사용할 때는 지우면 됩니다.)
locustfile = locustfile.py # 실행할 파일
headless = true # 헤드리스 모드 사용 (웹 인터페이스 없음)
expect-workers = 10 # 워커 수
users = 10 # 최대 동시 사용자 수
spawn-rate = 2 # 초당 생성되는 사용자 수
run-time = 5m # 테스트 실행 시간
loglevel=INFO
# html = "output/sample.html"
# csv = "output/sample.csv"
# logfile = "output/sample.log"
host = "https://www.example.com"
# host = "http://app.sample-namespace.svc.cluster.local:8000"
다른 설정은 상황에 따라 자유롭게 변경하면 되고, 중요한 부분은 host
부분입니다.
이 부분에는 테스트를 진행할 서버의 URL을 입력합니다.
외부에서 서버에 접근할 수 있는 상황이라면, 접근할 수 있는 URL을 입력하면 됩니다.
만약 그렇지 않다면 내부에서 접근 가능한 값을 설정해야 합니다.
다음으로, locustfile.py
파일에는 테스트 코드를 작성합니다.
from locust import HttpUser, between, task
class TestApi(HttpUser):
wait_time = between(1, 2)
@task
def test_api(self):
self.client.get("/hello")
아주 간단하게 작성한 예시입니다. 지금은 단순 GET 요청이지만, 파라미터를 추가하거나 파일을 업로드하고, 추가 로직을 작성하거나 로그를 추가할 수도 있습니다.
wait_time
부분은 사용자가 요청을 보내는 시간 간격을 의미합니다.
예시에서는 1~2초 사이의 무작위 간격을 가지도록 설정한 것입니다.
부하 테스트에서 겪은 문제들
위에서 작성한 것만 보면 Locust 사용법은 간단합니다.
하지만 실제로 적용할 때는 몇 가지 문제가 있었습니다.
내부 폐쇄망에서 테스트하기
제가 테스트해야 하는 API는 격리된 Kubernetes 환경에 구성되어 있었습니다.
당연히 내부망에서만 API에 접근할 수 있었고, 또한 클러스터 외부에서는 개발 환경을 구성할 수 없었습니다.
이 조건에서 테스트를 진행하기 위해 Locust 환경 전체를 이미지로 만들고, 그 이미지를 Pod로 배포해 테스트를 진행했습니다. 컨테이너 내부에서는 Kubernetes 서비스와 포트를 통해 호출이 가능했고, 그 외에는 비슷한 방식으로 테스트를 진행했습니다.