この記事は何か
Locustという負荷検証ツールを、ローカル環境で動かしてみました。
Locustとは
Python製の負荷検証ツールです。
Web UI付きで、手軽に操作することができます。
ドキュメント
ローカル環境で動かしてみた
動作環境を用意
Docker環境を用意しました。
コードは↑を参照ください。ポイントは以下。
- WebUI用に、
8089
ポートを開けておく - Python環境にて、
pip install locust
でLocustをインストールする(build-essential
がないとインストールに失敗したので、入れておく)
# python --version
Python 3.9.17
# locust --version
locust 2.15.1 from /usr/local/lib/python3.9/site-packages/locust (python 3.9.17)
負荷検証シナリオを書く
負荷検証のシナリオ(テストケース)を、Pythonファイルにて記述することができます。
ファイルは、locustfile.py
という命名で用意します。
中身はこんな感じ。
from locust import HttpUser, task, constant_pacing
class HelloWorldUser(HttpUser):
# 1タスク = 1秒間に1回リクエストを送信する
wait_time = constant_pacing(1)
@task
def hello_world(self):
self.client.get("/hello-world")
上記だと、/hello-world
というエンドポイントに対して、1秒間に1回、指定した接続数でGETリクエストを行う という意味になります。
他にも、リクエスト間隔や、リクエストの重み付けを指定することもでき、細かくシナリオチューニングすることが可能です。
より詳しくは以下を参照ください。
https://docs.locust.io/en/stable/writing-a-locustfile.html#writing-a-locustfile
動かしてみる
locust
コマンドを実行することで、Locustサーバが起動します。
Dockerを用いている場合は、以下の形で実行できます。
docker-compose up -d
docker exec -it python locust
# テストファイルを locustfile.py 以外の命名で作成した場合は、-fでファイル名を指定する
# docker exec -it python locust -f <ファイル名>
起動後、http://localhost:8089/ にアクセスすると、以下のような負荷設定画面に移動します。
入力項目が3つありますが、それぞれ以下の意味です。
- Number of users:
- 最大同時接続数
- Spawn rate:
- 1秒あたりに増やしていく接続数。
- Number of users と同じ値を指定すれば、最初から最大数でリクエストされます。
- Host:
- リクエスト対象のURL(ベースURL)
今回は、別でテスト用のローカルサーバーを立てておいたので、そこで検証してみます。
※ LocustサーバーもDockerで構築しているため、host.docker.internal
でホストマシンにアクセスする必要があります。
「Start swarming」を押下することで、テストが開始されます。
テスト結果画面
実行を開始すると、以下のような表, チャート画面で、疎通状況, レスポンス時間などを表示してくれます。
STOPボタンを押すと、テストが終了します。
テスト実行後は、各種データをダウンロードすることが可能です。
補足
テスト対象のサイトにBasic認証がかかっている場合
テスト対象サイトにBasic認証がかかっている場合は、テストファイルを以下のように記述することで、認証を通過した上でテストを実施することが可能です。
from locust import HttpUser, task, constant_pacing
from requests.auth import HTTPBasicAuth
class QuickstartUser(HttpUser):
# 1タスク = 1秒間に1回リクエストを送信する
wait_time = constant_pacing(1)
@task
def view_top(self):
# Basic認証を通過するため、以下を記述する
auth = HTTPBasicAuth(username="username", password="password")
self.client.get("/hello-world", auth=auth)
Docker Imageについて
動作環境用のDocker Imageは以下で用意されていたので、こちらを利用しても良いかと思います。(動作は未検証です)
https://hub.docker.com/r/locustio/locust