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