HurlによるAPIテストと監視:Postmanに代わる「超軽量」ソリューション

Development tutorial - IT technology blog
Development tutorial - IT technology blog

2分で最初のテストを実行

単純なエンドポイントを1つ確認したいだけなのに、Postmanの起動を30秒も待たされるのは本当にストレスが溜まります。そこで私はHurlに乗り換えました。これはプレーンテキストでAPIテストシナリオを記述できるコマンドラインインターフェース(CLI)ツールで、非常に高速かつ軽量です。

まずは、Hurlをインストールしましょう。macOSなら、コマンド1つで完了します:

# macOS用
brew install hurl

# Linux用 (Ubuntu/Debian)
curl -LO https://github.com/Orange-OpenSource/hurl/releases/download/4.3.0/hurl_4.3.0_amd64.deb
sudo dpkg -i hurl_4.3.0_amd64.deb

次に、サンプルAPIをテストするための test.hurl ファイルを作成します:

GET https://jsonplaceholder.typicode.com/posts/1

HTTP 200
[Asserts]
jsonpath "$.id" == 1
jsonpath "$.title" contains "sunt aut facere"

以下のコマンドを実行してテストを実施します:

hurl --test test.hurl

結果はすぐに表示されます。煩わしいGUIは不要で、UIテスト自動化と同様に、プロフェッショナルなテストケース一式が手に入ります。

なぜPostmanではなくHurlを選ぶのか?

私はかつて100以上のエンドポイントを持つシステムを管理していました。その際、Postmanの使用においてチームを悩ませた3つの致命的な欠点がありました:

  • Gitコンフリクトという悪夢: PostmanのJSONファイルはコードレビューで非常に読みにくいです。2人が同時にコレクションを修正しただけで、マージ作業は悲惨なものになります。Hurlはプレーンテキストを使用するため、差分(diff)が非常にクリーンです。
  • 圧倒的なパフォーマンス差: Postmanは通常500MBから1GBのRAMを占有します。一方、Rustで書かれたHurlは、実行時のメモリ消費量が10MB未満です。
  • 非常にシンプルなCI/CD統合: Node.jsやNewmanを別途インストールする必要はありません。Hurlは約5MBの単一バイナリファイルであり、GitOpsの実装を含む最小限のDockerイメージに最適です。

Hurlの構文:直感的かつ強力

Hurlは単にリクエストを送信するだけではありません。返ってきたデータ(アサーション)を詳細に検証することができます。

1. データの送信(POSTリクエスト)

REST APIを構築した後のデータの新規作成も非常に自然に記述できます:

POST https://api.itfromzero.com/v1/users
{
  "name": "田中 太郎",
  "email": "[email protected]"
}

HTTP 201
[Asserts]
jsonpath "$.message" == "User created"

2. レスポンス速度とヘッダーの検証

テストファイル内でパフォーマンス基準を設けることも可能です。負荷テストほど複雑ではありませんが、例えば、APIが500ms以内にレスポンスを返す必要がある場合:

GET https://api.itfromzero.com/v1/health

HTTP 200
[Asserts]
duration < 500
header "Content-Type" == "application/json; charset=utf-8"

複雑なシナリオの処理:リクエストの連鎖

実際の開発では、ログインしてトークンを取得し、その後にメインのAPIを呼び出すという流れが一般的です。Hurlは変数を使用して、このフローを非常にスムーズに処理できます。

# ステップ1: ログインしてトークンを保存
POST https://api.example.com/login
{
  "username": "admin",
  "password": "secret"
}

HTTP 200
[Captures]
token: jsonpath "$.access_token"

# ステップ2: 次のリクエストでトークンを使用
GET https://api.example.com/profile
Authorization: Bearer {{token}}

HTTP 200
[Asserts]
jsonpath "$.username" == "admin"

複数の環境(Dev/Staging)で実行するには、env.properties ファイルと --variables-file フラグを使用するだけです。このアプローチにより、データとテストシナリオを明確に分離できます。

GitHub Actionsによる自動化

サードパーティの監視サービスにコストをかける代わりに、GitHub Actionsを無料のAPI監視システムに変えることができます。REST API構築後のコードをプッシュするたびに、Hurlが自動的にシステム全体をチェックします。

name: API Monitoring
on: [push, schedule: {cron: "*/5 * * * *"}]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Hurlをインストール
        run: |
          curl -LO https://github.com/Orange-OpenSource/hurl/releases/download/4.3.0/hurl_4.3.0_amd64.deb
          sudo dpkg -i hurl_4.3.0_amd64.deb
      - name: テストを実行
        run: hurl --test tests/*.hurl

実践的なアドバイス

多くのプロジェクトでHurlを採用した結果, 得られた3つの注意点を紹介します:

  1. ファイル構成: すべてを1つのファイルに詰め込まないでください。管理しやすくするために、auth.hurlpayment.hurl のように機能ごとに分割しましょう。
  2. HTMLレポートの活用: CI上で --report-html report/ フラグを使用してください。テストが失敗した際、どこにエラーがあるかを視覚的に確認できるWebページが生成されます。
  3. 使い分けが重要: Hurlは自動化には最適ですが、初めて新しいAPIを試行錯誤(explore)する場合は、PostmanやInsomniaのような GUIツールにも独自の価値があります。

Hurlは「小さくても非常に強力な」ツールです。テストシナリオをソースコード管理の標準フローに組み込むことで、開発プロセスをよりプロフェッショナルなものにしてくれます。

Share: