Fastapi ストレス テスト

Dec 05 2022
Locust Python のスケーラビリティ テストは、Web サービスの運用準備を整える上で重要な部分です。Gatling、Apache JMeter、The Grinder、Tsung など、負荷テスト用のツールはたくさんあります。

ローカストパイソン

スケーラビリティ テストは、Web サービスの運用準備を整える上で重要な部分です。Gatling、Apache JMeter、The Grinder、Tsung など、負荷テスト用のツールはたくさんあります。また、Python で記述され、Requestsライブラリ上に構築されたもの (および私のお気に入り) もあります: Locustです。

ローカストのウェブサイトで注目されているように:

Locust の基本的な機能は、すべてのテストを Python コードで記述することです。扱いにくい UI や肥大化した XML は必要なく、単純なコードだけで済みます。

バッタのインストール

パフォーマンス テスト Python モジュール Locust は PyPI で利用でき、pip または easy_install を介してインストールできます。

pip install locustio or: easy_install locust

例 locustfile.py

次に、ドキュメントの例に従ってlocustfile.pyを作成します。Django プロジェクトをテストするには、csrftoken サポートと ajax リクエスト用のヘッダーをいくつか追加する必要がありました。最終的なlocustfile.py は次のようになります。

# locustfile.py
from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
def on_start(self):
        self.login()
def login(self):
        # GET login page to get csrftoken from it
        response = self.client.get('/accounts/login/')
        csrftoken = response.cookies['csrftoken']
        # POST to login page with csrftoken
        self.client.post('/accounts/login/',
                         {'username': 'username', 'password': 'P455w0rd'},
                         headers={'X-CSRFToken': csrftoken})
@task(1)
    def index(self):
        self.client.get('/')
@task(2)
    def heavy_url(self):
        self.client.get('/heavy_url/')
@task(2)
    def another_heavy_ajax_url(self):
        # ajax GET
        self.client.get('/another_heavy_ajax_url/',
        headers={'X-Requested-With': 'XMLHttpRequest'})
class WebsiteUser(HttpLocust):
    task_set = UserBehavior

上記の python locust ファイルを使用して Locust を実行するには、そのファイルの名前がlocustfile.pyであれば、次のコマンドを実行できます ( locustfile.pyと同じディレクトリ内)。

locust --host=http://example.com

Python 負荷テスト アプリ Locust が開始されたら、アクセスする必要があります。http://127.0.0.1:8089/すると、Locust インスタンスの Web インターフェースが表示されます。次に、シミュレートするユーザー数(例: 300) とHatch rate (users spawned/second) (例: 10) を入力し、Start swarmingを押します。その後、Locust はユーザーの「ハッチング」を開始し、テーブルで結果を確認できるようになります。

Python データの視覚化

表はいいのですが、グラフで結果を確認したいと思います。人々が Locust にグラフィカル インターフェイスを追加するよう求める問題があり、Locust データのグラフを表示する方法がいくつか提案されています。Python インタラクティブ視覚化ライブラリBokehを使用することにしました。

pip を使用して PyPI から Python グラフ作成ライブラリ Bokeh をインストールするのは簡単です。

pip install bokeh

Bokeh サーバーを実行する例を次に示します。

JSON 形式で Locust データを取得できます。http://localhost:8089/stats/requests. データは次のようになります。

{
       "errors": [],
       "stats": [
           {
               "median_response_time": 350,
               "min_response_time": 311,
               "current_rps": 0.0,
               "name": "/",
               "num_failures": 0,
               "max_response_time": 806,
               "avg_content_length": 17611,
               "avg_response_time": 488.3333333333333,
               "method": "GET",
               "num_requests": 9
           },
           {
               "median_response_time": 350,
               "min_response_time": 311,
               "current_rps": 0.0,
               "name": "Total",
               "num_failures": 0,
               "max_response_time": 806,
               "avg_content_length": 17611,
               "avg_response_time": 488.3333333333333,
               "method": null,
               "num_requests": 9
           }
       ],
       "fail_ratio": 0.0,
       "slave_count": 2,
       "state": "stopped",
       "user_count": 0,
       "total_rps": 0.0
    }

みんなで走る

これで Locust が実行されます (実行されていない場合は開始しますlocust --host=http://example.com) 。スクリプト呼び出しが示すように、ドキュメントを表示するための正しい URL に対してブラウザー タブが自動的に開かれます。Bokehserverbokeh servepython plotter.py

Locust が既にテストを実行している場合は、結果がすぐにグラフに表示されます。それ以外の場合は、新しいテストを開始しますhttp://localhost:8089/[Bokeh] タブに戻り、テストの結果をリアルタイムで確認します。

それでおしまい。コード全体はgithubで見つけることができます。自由にクローンを作成して、例を実行してください。

git clone https://github.com/steelkiwi/locust-bokeh-load-test.git
  cd locust-bokeh-load-test
  pip install -r requirements.txt
  locust --host=<place here link to your site>
  bokeh serve
  python plotter.py