😊

負荷テストをやってみよう

2024/08/23に公開

負荷テストとは

負荷テストの種類

パフォーマンステスト

通常の使用条件下でシステムがどのように動作するかを確認するもの。システムの応答時間やスループットを測定することを目的としている。

ストレステスト

過負荷の状態でシステムがどのように動作するかを確認するもの。システムの限界やボトルネックを特定するもの。

スパイクテスト

短時間に急激な負荷がかかった場合にシステムがどのように動作するかを確認するもの。予期しない急激な負荷に対するシステムの対応能力を確認するもの。

耐久テスト

長時間にわたって一定の負荷をかけ続け、システムがどの程度の期間にわたり安定して動作するかを確認するもの。

負荷テストを行うツール(無料版)

Postman

guiでテスト計画を策定する。簡易的に負荷をかけたい時はこれで良い。

Locust

pythonでテストコードを記載する。

Apacher JMeter

guiでテスト計画を策定する。設定が大変。

Gatling

scalaでテストコードを記載する。

Postmanで負荷テストを行う

コレクション単位でテストができる。ランナーを用いて下記のようなテストを実行できる。

  • Fixed: リクエスト数を固定
  • Ramp up: 徐々にリクエスト数を上げる
  • Spike: 一瞬リクエスト数を増大する
  • Peak: リクエスト数に緩急をつける

※ 同時接続数は最大100まで

実行結果

Locustで負荷テストを行う

  1. 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
    
  2. 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)
    
  3. Locustから負荷テストを実行する
    1. Locustを起動する

    2. localhost:8089にアクセスする

    3. 下記画像の値を設定し実行する
      ※ postmanと異なり同時接続数の制限はなし

    4. 実行結果

Discussion