Locust を使用した API 負荷テスト

Locust を使用した API 負荷テスト

Locust を使用した API 負荷テスト: はじめに

おそらく以前にこの状況に陥ったことがあるでしょう。エンドポイントなど、何かを実行するコードを記述します。 Postman または Insomnia を使用してエンドポイントをテストすると、すべて正常に動作します。 エンドポイントをクライアント側の開発者に渡します。 API アプリケーションをデプロイします。 しかし、ユーザーがアプリを使用すると、API は失敗します。

これは、ビジネスにとってコストがかかることは言うまでもなく、非常に厄介な状況になる可能性があります. そのため、ソフトウェア開発者は、ソフトウェア システムが期待どおりに動作することを確認するために、ソフトウェア システムに対してさまざまなテストを実行します。 API も例外ではありません。 展開する前に、少なくともパフォーマンス テストとセキュリティ テストを行う必要があります。

パフォーマンス テストは、機能テストと負荷テストに分類できます。 機能テストは、通常 Postman または Insomnia を使用するものです。 これにより、API が期待どおりに機能することが保証されます。 一方、負荷テストは、API が実際の使用状況とピーク時の負荷でどのように機能するかにより関心があり、それがこの記事の目的です。 負荷テストについて詳しく見てみましょう。

API 負荷テストとは

API 負荷テストは、開発者がエンドポイントの通常負荷とピーク負荷をシミュレートするために使用するテストの一種です。 この種のテストにより、開発者は API をデプロイする前に実際のパフォーマンスを評価できます。 システムの最大動作容量、ボトルネックがある場合はそれ、およびパフォーマンスの低下を特定するのに役立ちます。 API 負荷テストは通常​​、仮想ユーザーを作成し、それらを使用して API の機能を同時にテストすることによって行われます。 

API 負荷テストでは、応答時間、同時ユーザー、スループット率、リソース使用率レベル、平均故障間隔 (MTBF)、平均故障時間 (MTTF) などの指標が測定されます。 これらの指標はすべて、API のパフォーマンスを判断するために使用できます。

負荷テストの種類

負荷テストにはいくつかの種類があり、それぞれにユース ケースがあります。 それらのいくつかを見てみましょう。

負荷テスト: これは負荷テストの基本的な形式です。 通常の負荷と予想されるピーク負荷の下で、システム (この場合は API) のパフォーマンスを評価するために使用されます。

ストレステスト: これは、非常に重い負荷の下でシステムのパフォーマンスを評価するために使用されます。 このテストの目的は、システムが障害後に回復するかどうか、および回復にかかる時間を確認することです。 負荷は通常、システムの能力を超えるまでゆっくりと上昇します。

スパイク試験: これはストレス テストに少し似ていますが、重い負荷がゆっくりと上昇するのではなく、突然適用される点が異なります。 この種のテストは、ユーザーまたは訪問者の平均数が突然急増した場合、またはシステムに DDOS 攻撃があった場合に何が起こるかを表しています。

浸漬試験: このテストは、上記の他のテストとは異なります。 システムを通常の負荷の 80% (またはその程度) 未満にし、長時間 (たとえば 12 時間から 14 時間) 稼働させたままにします。 この種のテストは、システムの長期的な信頼性を判断します。

Locust を使用した API の負荷テスト

開発者は、API を負荷テストするためのさまざまなオプションにアクセスできます。 一般的な負荷テスト ツールには、Gatling、JMeter、および Locust があります。 この記事では、ローカストに焦点を当てます。

Locust は、Google、Microsoft、Riot Games などのトップ企業が API をテストするために使用する Python ベースのオープンソース負荷テスト ツールです。 この記事では、API をロード テストする方法を示します。 

このチュートリアルでは、Flask を使用して単純な API を作成します。 私と一緒にフォローするか、Node または使い慣れたフレームワークで API を作成してください。

要件

Pythonの3

セットアップとインストール

まず、グローバルな Python 環境を台無しにしないように、PC に仮想環境をセットアップする必要があります。 これを行うには、次のコマンドを実行します。 これらのコマンドは Windows 端末に適用されることに注意してください。

$ mkdir プロジェクト

$ cd /d パス\to\プロジェクト

$ python -m venv venv

$ venv\Scripts\activate

 

まず、 プロジェクト ディレクトリ。 次に、現在のディレクトリを次のように変更しました プロジェクト. 次に、そのディレクトリ内に Python の仮想環境を作成してアクティブ化しました。 

では、インストールに移ります フラスコ(これを使用して、負荷テストを行うエンドポイントを作成します) イナゴ そのもの。 

 

Flask をインストールするには、実行します。 あなたがいることを確認してください プロジェクト 仮想環境を作成した場所。

$ pip インストールフラスコ

 

Locust をインストールするには、次を実行します。

$ pip インストール イナゴ

 

それが完了したら、次のコマンドを入力します。 あなたがあなたの中にいることを確認してください プロジェクト これを行うときのディレクトリ。

$ コピーヌル __init__.py

$ mkdir アプリ

$ copy nul app\app.py

$ copy nul app\__init__.py

 

このコマンドは、Flask を使用してエンドポイントを作成するために使用するいくつかのファイルを作成します。 ちなみに、ファイルエクスプローラーを使用してこれらのファイルを作成することもできます。 しかし、それの何が楽しいのですか? それが終わったら、以下のコードを app.py

フラスコインポートフラスコ、jsonify、リクエストから

app = Flask(__ name__)

car_models = [

  { 'ブランド': 'テスラ', 'モデル': 'モデル S' }

]

 

平面モデル = [

  { 'ブランド': 'ボーイング', 'モデル': '747' }

]

 

@app.route('/車')

デフ get_cars():

  jsonify(car_models) を返す

@app.route('/planes')

デフォルト get_planes():

  jsonify(plane_models) を返す

if __name__ == '__ main __':

    app.run(debug = True)  

 

上記のコードにはメソッドが含まれています get_cars 車のブランドとそのモデルのリストを取得するために使用されます。 get_planes 飛行機のブランドとそのモデルのリストを取得するために使用されます。 このエンドポイントをロード テストするには、app.py を実行する必要があります。 これを行うには、以下のコマンドを実行します。

$ python パス\to\app.py

これを実行すると、次のように表示されます。

API 負荷テスト 1

端末からURLをコピーして入力すると 自動車 or プレーン / の後に、そこにデータが表示されるはずです。 ただし、私たちの目標は、ブラウザーではなく、イナゴでエンドポイントをテストすることです。 では、そうしましょう。 のルートで次のコマンドを実行します。 プロジェクト ディレクトリにあります。

 

$ コピーヌル locust_test.py

 

これにより、「locust_test.py」ファイルがルートに作成されます プロジェクト ディレクトリ。 完了したら、ファイルを開き、以下のコードを貼り付けます。 簡単に説明します。

 

インポート時間

イナゴからインポート HttpUser、タスク、間

 

クラス UserBehaviour(HttpUser):

    wait_time = between(5, 10)

 

    @タスク

    デフォルト get_cars(self):

        self.client.get('/車')

    

    @タスク

    デフォルト get_planes(self):

        self.client.get('/planes')

 

これは、Locust を使用して API の負荷テストを行う基本的な例です。 まず、クラスを作成します ユーザー行動、任意の適切な名前を付けることができますが、拡張する必要があります HTTPユーザー。 HTTPユーザー で指定したタスクを実行するために、複数の仮想ユーザーのインスタンス化を処理するクラスです。 ユーザー行動 とに提供されます。 

タスクは、メソッドを @タスク デコレータ。 という関数もあります の間に() これにより、次のタスクを実行する前に待機する秒の範囲を指定できます。 コードで 5 ~ 10 秒の範囲を割り当てていることがわかります。 

コードを実行するには、まだ仮想環境にいることを確認してください。 作成したものが API を提供するサーバーで使用されている場合は、新しいターミナルを開き、ディレクトリを プロジェクト ディレクトリを開き、作成した仮想環境をアクティブにします。 上記の仮想環境をアクティブ化するためのコマンドを見つけることができます。 次に、ターミナルで以下のコマンドを入力します。

 

$ locust -f locust_test.py

 

次のようなものが表示されます。

API 負荷テスト 2

デフォルトでは、locust の Web インターフェイスは http://localhost/8089 にあります。 Web サイトにアクセスすると、次のようなインターフェイスが表示されます。

API 負荷テスト 3

インターフェイスから、ユーザー数、スポーン レート (5000 秒あたりに作成されるユーザー数)、およびホストを指定できます。 サーバーが実行されている端末を確認することで、ホストのアドレスを取得できます。 私たちの場合、それはポート XNUMX にあります。 群がり始め、 以下のインターフェースが表示されます。

API 負荷テスト 4

これにより、失敗したリクエストの数、リクエストの平均時間、リクエストの最小時間、XNUMX 秒あたりのリクエストなど、さまざまな有用なメトリックが表示されます。 表示内容に満足したら、停止ボタンをクリックします。 


ほかに 統計 タブ、 チャート 詳細を表示するタブ 情報 下の画像のように、グラフの形で。

あり XNUMX 秒あたりの合計リクエスト数のグラフ, 応答時間グラフ、 & ユーザー数グラフ、すべて時間に対してプロットされています。 グラフを使用すると、一定の応答時間に対して許容できるユーザー数を判断したり、ユーザー数が増加しているにもかかわらず一定の応答時間についてグラフを観察したり、そのような洞察を得ることができます。 これらを共有したい場合 統計情報 からレポートをダウンロードできます。 データをダウンロードする タブには何も表示されないことに注意してください。

結論として...

API の負荷テストは、開発プロセスにおいて重要な作業であるため、設計サイクルに組み込むようにしてください。 ちなみに、ユーザー数とスポーン率の値を変えることで、他の種類の負荷テストを実行することもできます。 

スパイク テストを実行する場合は、ユーザー数に大きな値 (たとえば 2000) を指定し、スポーン レートにも同じくらい大きな値 (たとえば 500) を指定します。 これは、4 秒で 2000 人のユーザーすべてが作成され、エンドポイントにアクセスできることを意味します。 ストレス テストも同様ですが、スポーン レートの値がはるかに低くなります。 何ができるかを知るには、Locust をチェックしてください ドキュメント