Postmanコレクションを負荷試験ツールGatlingで実行する


Postman コレクションで構成するシナリオを、あの負荷試験ツール Gatlingで実行できるようになりました🚀 

https://gatling.io/blog/postman-integration

Gatlingとは、Webアプリ向けの負荷試験フレームワークです。テストシナリオをScala、Java、KotlinのDSLで記述できたり、実行結果のレポートを自動生成してくれます。また、JavaScript SDKによりJavaScript/TypeScriptを使用してAPIを呼び出すテストスクリプト（Cypressなど）を作成し、Gatlingをバックエンド負荷テストに使用する、といった柔軟な組み合わせが可能です。

今回のPostmanコレクションとの連携はJavaScript SDKを活用します。GatlingのJavaScriptプロジェクトにPostmanの連携パッケージを入れると、JavaScriptのSimulation用ファイルからコレクションを実行できるようになります。本記事ではGatling公式の[本機能紹介記事](https://gatling.io/blog/postman-integration)を参考に、PostmanコレクションをGatlingで実行してみたいと思います。なお、GatlingはOSS版と商用版が提供されてますが、ここではOSS版を活用します。

# 事前準備

今回利用するパフォーマンステスト用のPostmanコレクション (`PerformanceTesting.postman_collection.json`) を以下のいづれかの方法で用意する

- この[コレクション](https://www.postman.com/what-is-api-first/api-testing-demo/collection/xidzitb/performance-testing)をエクスポートする
- 直接[こちら](https://gist.githubusercontent.com/yokawasa/ad6c277ab9db1273849d3daa5ad431fd/raw/dd4aa44bb2fadf9a879f6fda03c426d854558b64/PerformanceTesting.postman_collection.json)からコレクションファイルをダウンロードする

# GatlingでPostmanコレクションを実行

まずは、手っ取り早くJavascript SDK実行環境をcloneして、demoプロジェクト用ディレクトリ移動します。

```sh
git clone https://github.com/gatling/gatling-js-demo.git
cd gatling-js-demo/javascript
```

JavaScriptプロジェクトのディレクトリ構成は次のようになってます。

```sh
 tree -L 1
.
├── node_modules
├── package-lock.json
├── package.json
├── resources
├── src
└── target
```

まずは、Postman連携用のgaltingパッケージをインストールします。

```sh
npm install --save "@gatling.io/postman"
```

つぎに、resources配下に上記事前準備で用意したコレクションファイルを配置します。

```sh
cp PerformanceTesting.postman_collection.json resources

tree -L 1 resources
resources
├── PerformanceTesting.postman_collection.json  #<<<< これを配置
├── gatling.conf
├── logback-test.xml
└── search.csv

1 directory, 5 files
```

づづいて、次のようなSimulation用JSファイル (`postman.gatling.js`) をsrcディレクトリ配下に配置します。ここでは負荷を抑えるため、constantUsersPerSecで毎秒1ユーザーを生成し、またduringで合計3秒間実行するように指定してます。

```javascript:src/postman.gatling.js
import
 { simulation, constantUsersPerSec }
from
 "@gatling.io/core";
import
 { http }
from
 "@gatling.io/http";
import
 { postman }
from
 "@gatling.io/postman";

export

default
 simulation((setUp) => {
  const httpProtocol = http;

  const collection = postman
    .fromResource("PerformanceTesting.postman_collection.json");

  const scn = collection.scenario("My Scenario", { pauses: 1 });

  setUp(
    scn.injectOpen(
        constantUsersPerSec(1).during(3)
    ).protocols(httpProtocol)
 );
});
```

それでは、上記のJSファイルで定義したSimulationを次のように実行します。

```sh
 npx gatling run --simulation postman
```

実行結果は次のようになります。通常のGatlingの出力内容とほぼ同じです。

![Screenshot 2024-12-17 at 8.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103420/7287a6ec-9a59-d62f-632d-78b115d34866.png)

また、次のようなレポートも自動生成されます。

![Screenshot 2024-12-17 at 8.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103420/4c728441-2414-4cc1-fcab-ef942708eae5.png)

JavaScriptベースのプロジェクトの作り方にについて詳しくはこちらのページが参考になります。

https://docs.gatling.io/tutorials/scripting-intro-js/

# OSS版の制限について

現時点（2024年12月現在）、OSS版はつぎのように、`仮想ユーザー数５`まで、`実行時間5分`までというかなりの制約があります。したがって、まともに負荷試験をするならばGatlingエンタープライズの利用が現実的です。[こちら](https://gatling.io/blog/postman-integration)の紹介ブログからエンタープライズ無料お試しのリンクがあるので、興味のある方はエンタープライズで試してみてください。

> GATLING POSTMAN TRIAL VERSION: POSTMAN plugin usage is limited, test will shut down when exceeding 5 virtual users or 5 minutes duration. Unlimited usage available on Gatling Enterprise: https://gatling.io/enterprise/.

# 今後サポートされるPostman機能

今時点では未対応だけど今後サポート予定の主な機能に次のものがあります：

- Postman Cloudとの統合（現時点ではコレクションと環境をJSON ファイルにエクスポートする必要あり）
- Postmanスクリプト（Pre-requestまたはPost-responseスクリプト）
- 実行中の変数値の変更や、データファイルからの変数値を挿入
- 動的変数

最新のサポート状況については[こちらのページ](https://docs.gatling.io/reference/script/protocols/postman/#scope-of-postman-support)で確認ください。

# さいごに

負荷テストには良質なシナリオ設定が必要ですが、そのシナリオ作るのが面倒です。Postmanはそのシナリオを敷居低く作ることができ、Postmanデスクトップアプリ限定はありますが同一ツールセット上からパフォーマンステストとして複数の仮想ユーザー数でシナリオを実行できます。しかし、2024年12月現在、この負荷機能はクライアントアプローチであるため大規模型の分散負荷試験のニーズには答えられないという課題がありました。これはとても大きな一歩だと思ってます。

さいごに、Postmanがネイティブでもつパフォーマンステスト機能の記事を置いておきます。大規模型ではなく、クライアントアプローチでカジュアルかつ小刻みにボトルネックを探りたいならばコチラがおすすめです。

https://qiita.com/yokawasa/items/c172f1765026bf90d3ac