[Python] Locust를 통한 부하테스트
Locust는 파이썬으로 만들어진 부하 테스트 프레임워크다.
Python 사용자들이 꽤 많이 쓰고, 유명한 편이다.
기본적인 사용법만 정리해본다.
예제 서버 작성 (FastAPI)
부하테스트를 때리려면, 당연히 맞는 서버가 있어야 한다. 적당히 만들어줬다.
# FastAPI Server Code
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/foo")
async def foo():
return {"message": "Foo"}
@app.get("/bar")
async def bar():
# random delay 100-1000ms
import random
import time
delay = random.randint(100, 1000) / 1000.0
time.sleep(delay)
return {"message": "Bar"}
uvicorn.run(app, host="0.0.0.0", port=7070)
잘 실행된다.
locust 설치
locust는 CLI 형태로도 쓰고, 모듈 형태로도 쓴다.
여기선 uv를 통해서 설치해보겠다.

그리고 이렇게 실행이 되면 잘 깔린 것이다.

테스트코드 작성
방금 만들었던 2개 api에 대해서 테스트코드를 작성해보겠다.
from locust import HttpUser, task, between
HOST="http://localhost:7070"
class WebsiteUser(HttpUser):
host = HOST
wait_time = between(1,2) # 1-2 초 랜덤 대기
@task
def test(self):
with self.client.get('/foo', name="test-foo", catch_response=True) as response:
print(response)
with self.client.get('/bar', name="test-bar", catch_response=True) as response:
print(response)
wait_time은 하나의 유저가 api를 쏘고 기다리는 딜레이다.
그리고 각 테스트 함수에서는 api를 적당히 쏘도록 작성하면 된다. locust는 이 테스트 함수를 최소 단위로 해서 테스트 루프를 돌린다.
테스트 실행 (브라우저)
locust는 기본적으로 웹UI 기반의 테스트 도구다.
locust cli로 테스트코드를 실행하면
이렇게 웹UI가 뜬다.

여기서 유저 개수와 ramp up을 지정하고 시작하면 된다.
유저가 동시에 요청을 날리는 스레드 단위고, ramp up은 최초 시작 이후에 점진적으로 늘릴 유저 개수디.
그리고 실행이 되면

조건에 따라 계속 요청을 쏘고 내용을 기록한다.
멈추려면 수동으로 STOP 버튼을 눌러야한다.
이런 식으로 그래프도 제공하고
csv로 다운받는 것도 지원한다.
웹UI 없이 테스트하기
GUI가 없는 환경에서 테스트를 돌려야 하거나, 혹은 워크플로를 자동화해야한다면 웹 UI 없이도 제어할 수 있어야 한다.
그러려면 다음과 같이 헤드리스 옵션을 주고, 유저 개수, rampup 개수, 테스트 시간, 출력 형태를 지정하면 된다.
locust -f test.py --headless -u 10 -r 1 -t 10s --csv=results
그럼 자동으로 돌고

결과물도 적당히 뱉어줄 것이다.
참조
https://locust.io/
https://devocean.sk.com/blog/techBoardDetail.do?ID=165998&boardType=techBlog
https://stackoverflow.com/questions/25392451/locust-how-to-make-locust-run-for-a-specific-amount-of-time