この記事では、Locustを使用してLaravelで作成したWEBアプリケーション(非API)に対する負荷試験の方法と、その際の注意点について説明します。

1. Locustとは

Locustとは、Python製のオープンソースの負荷試験ツールで、WEBサイトやシステムのパフォーマンスをテストするために使用されます。ユーザの行動をシミュレートし、システムが高負荷条件下でどのように動作するかを評価できます。Pythonでテストシナリオを定義できるのが特徴です。
 

2. WEBアプリケーション(非API)への負荷試験として使えるのか

基本的にLocustは、APIの負荷試験に優れていますが、WEBアプリケーションの負荷試験にも利用できます。ユーザの操作をシナリオ化して、各操作や画面遷移を実行させることで、実際のユーザがWEBアプリケーションに対してかける負荷を再現することができます。
 

3. テストシナリオの書き方について

Locustでテストシナリオを作成するには、Pythonでユーザ行動をスクリプト化します。以下は基本的なサンプルです。

python

from locust import HttpUser, TaskSet, task, between

class UserBehavior(TaskSet):

    def on_start(self):
        auth = HTTPBasicAuth(username="root", password="admin")

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

    @task(2)
    def view_item(self):
        self.client.get("/item?id=1")

    @task(3)
    def search(self):
        self.client.get("/search?q=test")

    def on_stop(self):
        self.client.cookies.clear()

class WEBsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = between(1, 5)

この例では、UserBehaviorクラスに複数のタスクを定義し、WEBsiteUserクラスでユーザの行動シナリオを指定しています。wait_timeでリクエスト間の待機時間を設定し、より現実的なユーザの行動をシミュレートします。

on_start関数で操作開始前のbasic認証や、ログイン処理を実行させ、
on_stop関数ですべての操作後の処理、例えばログアウト処理などをさせることができます。

4. APIでないWEBアプリケーションをテストする際の注意点

4-1. LaravelのCSRF対策への注意点

Laravelはクロスサイトリクエストフォージェリ(CSRF)攻撃を防ぐために、フォーム送信時にCSRFトークンを使用しています。
Locustでフォーム送信をテストする場合、これを考慮する必要があります。以下に、CSRFトークンを取得してフォーム送信を行う例を示します。

from locust import HttpUser, TaskSet, task, between

class UserBehavior(TaskSet):

    def on_start(self):
        self.login()

    def login(self):
        response = self.client.get("/login")
        csrftoken = response.cookies['XSRF-TOKEN']
        self.client.post("/login", {
            "email": "test@example.com",
            "password": "password",
            "_token": csrftoken
        })

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

    @task(2)
    def submit_form(self):
        response = self.client.get("/form")
        csrftoken = response.cookies['XSRF-TOKEN']
        self.client.post("/form", {
            "field1": "value1",
            "field2": "value2",
            "_token": csrftoken
        })

class WEBsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = between(1, 5)

4-2. Cookieの管理

ユーザセッションを維持するために、Cookieを正しく管理することが重要です。特にログイン状態を保持する場合、ログイン後のCookieを全てのリクエストに含める必要があります。

4-3. リソースのロード

画像、CSS、JavaScriptなどのリソースのロードもシミュレートすることが必要な場合があります。これにより、実際のページロード時間とサーバの負荷をより正確に測定できます。

4-4. ページ遷移と状態管理

複数のページにまたがるシナリオを作成する場合、適切な状態管理が必要です。例えば、商品をカートに追加してからチェックアウトするシナリオなど、ユーザのアクションが連続する状態を管理します。

5. まとめ

Locustは、APIだけでなくWEBアプリケーション全体の負荷試験にも有効なツールです。テストシナリオの作成時には、LaravelのCSRF対策やCookieの管理などに注意し、リアルなユーザの行動をシミュレートすることが重要です。これにより、アプリケーションのパフォーマンスを正確に評価し、潜在的なボトルネックを特定できます。