🦁
負荷テストライブラリLocustとその仲間まとめ
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(こういうときどうする?)に関しては活用編で紹介したいと思います。
参考記事
Discussion