🦁

負荷テストライブラリLocustとその仲間まとめ

2024/07/10に公開

Locust

  • Locustは負荷テストを行うためのオープンソースのツールです。
  • 「ローカスト」と読みます。(ロカストかと思っていました。)
  • GitHub: https://github.com/locustio/locust

メリデメ

公式ページなどにも載っていますが、メリット・デメリットは以下のような感じでライトに活用できるのが特徴的です。

👍メリット

  • Pythonで実装可能
  • 簡単に導入できる(比較的学習コストが低い)
  • CPU使用率が低い
  • ダサいUIや膨れ上がったXMLはない

👎デメリット

  • 細かなシナリオは自分で実装しないといけない
  • サポートされているプロトコルはHTTPのみなので、他のプロトコルをテストするためには拡張が必要
  • ユーザが増えるとPythonの性質上、コードの実行が遅くなる

Locustの仲間

JMeter

  • Apache JMeter
  • 初版は2001年と歴史が長い
  • ほぼすべてのアプリケーションとプロトコルをテスト可能
  • GUIでテスト作成が可能

Gatling

  • Scalaで記述するOSS負荷試験フレームワーク
  • zozotownでもっとも利用実績があるらしい
  • 軽いらしい
  • 細かい設定条件が関数として存在
関数 動作
constantUsersPerSec(20) during (15 seconds) 指定した時間、1秒ごとに指定したユーザ数が立ち上がる。左の例だと、15秒の間、秒間20ユーザが立ち上がる(総リクエスト数は300)
constantUsersPerSec(20) during (15 seconds) randomized 指定した時間、1秒ごとに指定したユーザ数が立ち上がるが、ユーザの立ち上がりの間隔がランダムになる

k6

  • Grafana Labs社が開発している「k6」というツール
  • jsとかtsで普段書いてるような人には良さそう

Locustの基本

Locustでのテストの基本的な流れ

Locustインストール(一瞬)

python3.7以上がインストールされている環境を用意してください。

poetry add locust

基本的なLocustスクリプトの構造。

locust.pyを作成して以下のコードを用意します

from locust import between, task, HttpUser
class UserBehavior(TaskSet):
    def on_start(self):
        """
        タスクセットの開始時に1回のみ呼ばれる。
        """
        self.client.post("/login", {"username": "hoge", "password": "piyo"})

    @task(1)
    def scenario1(self):
        self.client.get("/hello")

class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = constant_throughput(1)  # 1 req/sec をキープ

TaskSetクラスを継承

ユーザーの動作を模倣する一連のタスクをグループ化するために使用されるクラス。
Locust によってランダムに選択され、実行されます。これにより、ユーザーがウェブサイトやアプリケーション上で行う可能性のあるさまざまなアクションをシミュレート可能です。
タスクは@taskデコレータを使用して、ユーザーが実行する行動(タスク)を定義します。

HttpUserクラスを継承

HttpUserはHTTPリクエストを発生させるユーザーを表すクラスですが、これは、実際のブラウザーの動作をシミュレートするためのクラスです。

実行方法

$ locust locust.py

負荷テストの実施例、安定稼働テストの実施例、Tips(こういうときどうする?)に関しては活用編で紹介したいと思います。

参考記事

https://docs.locust.io/en/latest/
https://note.com/shift_tech/n/n9046ed5bd74d
https://qiita.com/hogucc/items/e213a93f5b3a3cd3c96f
https://www.blazemeter.com/blog/gatling-vs-locust
https://www.blazemeter.com/blog/jmeter-vs-locust
https://zenn.dev/yumemi_inc/articles/k6-load-test

Discussion