Postman CLI で Rust アプリケーションを Integration Test
Postman Nagoya Meetup 2023.11
Postman Nagoya Meetup 2023.11 に参加しました!
そして、LT にも登壇してきました🚀
Postman CLI で Integration Test
今回の LT 登壇資料です。
Postman CLI を使ってみたというテーマで発表しました。
5分ということだったので、スライドは少なめです。
補足説明を載せておきたいと思います。
ソースコードは Github で公開しています。
Postman CLI
インストール
あらかじめ作成したテストシナリオを実行できるコマンドラインツールです。
CLI のインストールはコマンド一発で OK です。
Mac (Apple silicon) installation
curl -o- "https://dl-cli.pstmn.io/install/osx_arm64.sh" | sh
その他の実行環境のコマンドは公式ドキュメントをご確認ください。
コレクションのパスを指定する
コレクションを Export から JSON 形式でダウンロードしておきます。
チーム開発を想定し、何度も使えるようにソースコードに含めてみました。
/postman/mountix.postman_collection.json
ルートディレクトリで以下のコマンドを実行することができます。
postman collection run ./postman/mountix.postman_collection.json
❏ mountains / {mountainId} / surroundings
↳ Search surrounding mountains
GET http://localhost:8080/api/v1/mountains/533/surroundings?distance=5000 [200 OK, 3.24kB, 201ms]
✓ response is ok
❏ mountains / {mountainId}
↳ Get mountain by ID
GET http://localhost:8080/api/v1/mountains/1000 [200 OK, 516B, 23ms]
✓ response is ok
❏ mountains / geosearch
↳ Geosearch mountains
GET http://localhost:8080/api/v1/mountains/geosearch?box=(137.632582,36.600727),(137.601829,36.631957) [200 OK, 828B, 23ms]
✓ response is ok
❏ mountains
↳ Search mountains
GET http://localhost:8080/api/v1/mountains [200 OK, 318.1kB, 164ms]
✓ response is ok
┌─────────────────────────┬────────────────────┬───────────────────┐
│ │ executed │ failed │
├─────────────────────────┼────────────────────┼───────────────────┤
│ iterations │ 1 │ 0 │
├─────────────────────────┼────────────────────┼───────────────────┤
│ requests │ 4 │ 0 │
├─────────────────────────┼────────────────────┼───────────────────┤
│ test-scripts │ 4 │ 0 │
├─────────────────────────┼────────────────────┼───────────────────┤
│ prerequest-scripts │ 0 │ 0 │
├─────────────────────────┼────────────────────┼───────────────────┤
│ assertions │ 4 │ 0 │
├─────────────────────────┴────────────────────┴───────────────────┤
│ total run duration: 487ms │
├──────────────────────────────────────────────────────────────────┤
│ total data received: 321.75kB (approx) │
├──────────────────────────────────────────────────────────────────┤
│ average response time: 102ms [min: 23ms, max: 201ms, s.d.: 80ms] │
└──────────────────────────────────────────────────────────────────┘
Postman に保存されたコレクションを指定する
- Run collection メニューでコレクションランナーを開く
- Choose how to run your collection で Automate runs via CLI を選択する
- API キーを生成して、控えておく
- コマンドが表示されるので、コピーしてターミナルから実行する
コマンドまで生成してくれるので、簡単に実行することができます。
postman login --with-api-key {{postman-api-key-here}}
postman collection run {{postman-collection-id-here}} -e {{postman-environment-id-here}}
-e
は環境変数をIDで指定しています。
環境変数は右上で切り替えると、コマンドに反映されます。
Github Actions に組み込む
CLI なので、CI/CD に組み込むことができます。
試しに、Github Actions で Postman CLI でテストできるようにしてみました。
GitHub Actions ワークフロー
デプロイ前のテストを想定しているので、Postman の環境変数でテストする API のエンドポイントを localhost:8080
と定義しています。
また、Axum を使った Rust アプリケーションなので Rust を Github Actions の環境でセットアップするステップがあります。
name: integration test
on:
# まずは手動実行のみを許可
workflow_dispatch:
env:
RUST_LOG: ${{ vars.RUST_LOG }}
HOST: ${{ vars.HOST }}
PORT: ${{ vars.PORT }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
MOUNTAINS_URL: ${{ vars.MOUNTAINS_URL }}
DOCUMENTS_URL: ${{ vars.DOCUMENTS_URL }}
DEFAULT_DISTANCE=: ${{ vars.DEFAULT_DISTANCE }}
MAX_DISTANCE: ${{ vars.MAX_DISTANCE }}
jobs:
test:
name: Tests
runs-on: ubuntu-latest
steps:
# チェックアウト
- name: Checkout sources
uses: actions/checkout@v3
# Rust をインストール
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
# Postman CLI をインストール
- name: Install Postman CLI
run: |
curl -o- "https://dl-cli.pstmn.io/install/linux64.sh" | sh
# Postman CLI でログイン
- name: Login to Postman CLI
run: postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}
# Cargo run でデバッグ開始
- name: Cargo run
run: cargo run & sleep 180
# Postman CLI でテストを実行
- name: Run API tests
run: |
postman collection run ${{ secrets.POSTMAN_COLLECTION_ID }} -e ${{ secrets.POSTMAN_ENVIRONMENT_ID }}
sleep について
cargo run
コマンドは、npm run start:dev
等のようにプロセスが終了せず、動き続けます。
つまり、いつまで待っても次のステップに進むことがありません...
そのため、cargo run & sleep 180
とすることで、180 秒後に強制的に次のステップに進めるようにしています。
(180 はまぁこれだけあれば確実に終わるやろって感じで設定してます笑)
これがベストなのかは不明です🙄🙄🙄
(もっと良い方法があると思う...)
接続先のデータベースについて
MongoDB Atlas 上に構築した開発環境用のデータベースに接続しています。
一時的に、すべての IP アドレスからアクセスできるように設定を変更してテストしています。
この方法はあまり好ましくないと思うので、 Github Actions の環境に MongoDB を起動した上でテストするのが良いかと思います。
この部分に関しては、時間を見つけて対応できれば良いなと思います。
まとめ
初の名古屋開催の Postman Meetup に参加することができて良かったです!
LT 登壇という良い機会をいただけ、良い経験ができました。
Meetup の開催については、Postman の日本法人が 4 月にできたことが背景にあるようです。
Insomnia や Thunder Client など、様々なツールがありますが、
日本で Meetup があるツールは Postman のみでしょうか。
Meetup を通じて情報収集できるのは大きなメリットだと思いました。
Postman にはまだまだ便利な機能があり、使いこなせていない部分も多いので、
業務でも積極的に活用していきたいです!!
名古屋開催がある際は、また参加してみたいと思います🙌✨
Discussion