77
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

この記事は何か

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/ にアクセスすると、以下のような負荷設定画面に移動します。

スクリーンショット 2023-07-16 9.01.24.png

入力項目が3つありますが、それぞれ以下の意味です。

  • Number of users:
    • 最大同時接続数
  • Spawn rate:
    • 1秒あたりに増やしていく接続数。
    • Number of users と同じ値を指定すれば、最初から最大数でリクエストされます。
  • Host:
    • リクエスト対象のURL(ベースURL)

今回は、別でテスト用のローカルサーバーを立てておいたので、そこで検証してみます。
※ LocustサーバーもDockerで構築しているため、host.docker.internalでホストマシンにアクセスする必要があります。
「Start swarming」を押下することで、テストが開始されます。

スクリーンショット-2023-07-16-9-45-54.png

テスト結果画面

実行を開始すると、以下のような表, チャート画面で、疎通状況, レスポンス時間などを表示してくれます。

スクリーンショット 2023-07-16 9.49.06.png

スクリーンショット 2023-07-16 9.49.24.png

STOPボタンを押すと、テストが終了します。
テスト実行後は、各種データをダウンロードすることが可能です。

スクリーンショット 2023-07-16 9.52.35.png

total_requests_per_second_1689468496.png

補足

テスト対象のサイトに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

77
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?