😊
負荷テストをやってみよう
負荷テストとは
負荷テストの種類
パフォーマンステスト
通常の使用条件下でシステムがどのように動作するかを確認するもの。システムの応答時間やスループットを測定することを目的としている。
ストレステスト
過負荷の状態でシステムがどのように動作するかを確認するもの。システムの限界やボトルネックを特定するもの。
スパイクテスト
短時間に急激な負荷がかかった場合にシステムがどのように動作するかを確認するもの。予期しない急激な負荷に対するシステムの対応能力を確認するもの。
耐久テスト
長時間にわたって一定の負荷をかけ続け、システムがどの程度の期間にわたり安定して動作するかを確認するもの。
負荷テストを行うツール(無料版)
Postman
guiでテスト計画を策定する。簡易的に負荷をかけたい時はこれで良い。
Locust
pythonでテストコードを記載する。
Apacher JMeter
guiでテスト計画を策定する。設定が大変。
Gatling
scalaでテストコードを記載する。
Postmanで負荷テストを行う
コレクション単位でテストができる。ランナーを用いて下記のようなテストを実行できる。
-
Fixed
: リクエスト数を固定
-
Ramp up
: 徐々にリクエスト数を上げる
-
Spike
: 一瞬リクエスト数を増大する
-
Peak
: リクエスト数に緩急をつける
※ 同時接続数は最大100まで
実行結果
Locustで負荷テストを行う
- dockerなどでLocustをインストールしておく
docker-componse.yml services: locust: image: locustio/locust ports: - "8089:8089" volumes: - ./locustfile.py:/mnt/locust/locustfile.py command: > locust -f /mnt/locust/locustfile.py --host=http://example.com
- pythonでテストシナリオを書く
from locust import HttpUser, task import os from dotenv import load_dotenv # .envファイルから環境変数を読み込む load_dotenv() class WebsiteUser(HttpUser): env_value = os.getenv('ENV_VALUE') # .envの値を読み込む wait_time = between(1, 5) # リクエスト間の待ち時間(1秒から5秒) def on_start(self): """このメソッドはユーザーが起動するたびに実行される""" self.token = self.get_jwt_token() def get_jwt_token(self): # トークンを取得するための認証エンドポイントにリクエストを送信 response = self.client.post("/auth/login", json={ "username": "your_username", "password": "your_password" }) return response.json()['access_token'] # 取得したトークンを返す @task(0) # 0は実行されない。コメントアウトと同義 def no_test(self): # JWTトークンをヘッダーに追加してGETリクエストを送信 headers = { "Authorization": f"Bearer {self.token}" "EnvValue": f"Bearer {self.env_value}" } self.client.get("/test", headers=headers) @task(1) # 1以上の値で順番に実行される def get_test(self): # JWTトークンをヘッダーに追加してGETリクエストを送信 headers = { "Authorization": f"Bearer {self.token}" "EnvValue": f"Bearer {self.env_value}" } self.client.get("/test", headers=headers)
- Locustから負荷テストを実行する
-
Locustを起動する
-
localhost:8089にアクセスする
-
下記画像の値を設定し実行する
※ postmanと異なり同時接続数の制限はなし
-
実行結果
-
Discussion