この記事では、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の管理などに注意し、リアルなユーザの行動をシミュレートすることが重要です。これにより、アプリケーションのパフォーマンスを正確に評価し、潜在的なボトルネックを特定できます。