「Hurl」というHTTPリクエストを簡単にテストできるとても便利なツールはご存知ですか?バージョン6.1.0が2025年3月にリリースされました。このツールの機能や使い方について紹介します。
Hurlとは?
Hurlは、プレーンテキストでHTTPリクエストを実行・テストできるオープンソースのコマンドラインツールです。APIのテスト(JSON/GraphQL/SOAPなど)やデータ取得、CI/CDパイプラインでの自動テストなど、様々な場面で活用できます。
内部ではRustバインディングを利用したcurlをHTTPエンジンとして使用しており、高速で信頼性が高く、HTTP/3にも対応しています。
基本的な使用方法
Hurlファイルの基本構造
Hurlファイルは、HTTPリクエストとそのレスポンスに対する検証を記述するためのシンプルなテキスト形式です。基本的な例は次のとおりです:
GET https://example.org/api/tests/4567
HTTP 200
[Asserts]
header "x-foo" contains "bar"
certificate "Expire-Date" daysAfterNow > 15
ip == "2001:0db8:85a3:0000:0000:8a2e:0370:733"
jsonpath "$.status" == "RUNNING" # ステータスコードの確認
jsonpath "$.tests" count == 25 # アイテム数の確認
jsonpath "$.id" matches /\d{4}/ # IDのフォーマットの確認
このように、リクエストとその後のアサーション(検証)をテキストファイルとして記述して実行するだけで、APIの動作確認やテストが行えます。
Hurlファイルは次のようにシンプルなコマンドで実行できます:
$ hurl file.hurl
複数のファイルを指定することもできます:
$ hurl file1.hurl file2.hurl
ディレクトリを指定すると、そのディレクトリ内の .hurl
ファイルを再帰的に検索して実行します:
$ hurl tests/
テストモードで実行すると、各リクエストの結果がテスト結果として表示されます:
$ hurl --test integration/*.hurl
Hurl 6.1.0の新機能
Hurl 6.1.0では、以下の新機能が追加されました:
- レポートやログからの機密情報の編集(secrets機能)
- 新しいクエリ:IPアドレス、HTTPバージョン
- 新しいフィルター:base64のエンコード/デコード、toString
- より多くのcurlオプション
それぞれについて詳しく見ていきましょう。
1. 機密情報の編集(secrets機能)
HTTP通信では、認証トークンやAPIキーなどの機密情報を扱うことが多いです。これらの情報がログやレポートに漏れると危険です。
例えば、以下のようなHurlファイルがあるとします:
GET https://foo.com
Content-Type: application/json
x-password: {{password}}
HTTP 200
従来は、変数を使って次のように実行していました:
$ hurl --variable password=$PASSWORD foo.hurl
しかし、--verbose
オプションを使うと、機密情報が表示されていました:
$ hurl --verbose foo.hurl
* ------------------------------------------------------------------------------
* Executing entry 1
*
* Cookie store:
*
* Request:
* GET http://foo.com
* x-secret: sesame-ouvre-toi
...
Hurl 6.1.0からは、--secret
オプションを使うことで、機密情報をログやレポートから編集できるようになりました:
$ hurl --secret password=$PASSWORD foo.hurl
この方法では、変数として定義した機密情報が自動的にログやレポートから編集されます。さらに、動的なシークレット値を対応するために、redact
キーワードとキャプチャー機能を組み合わせることもできます:
GET http://bar.com/api/get-token
HTTP 200
[Captures]
token: header "X-Token" redact
- [Captures] - これはHurlの命令セクションで、HTTPレスポンスから値を抽出して変数に保存することを指示します
- token: - 抽出した値を保存する変数名を「token」と定義しています
- header "X-Token" - レスポンスヘッダーの中から "X-Token" という名前のヘッダーの値を取得します
- redact - 重要なポイントで、Hurl 6.1.0で追加された新機能です。この値を機密情報として扱い、ログやレポート出力時に値を隠す(編集する)ことを指示します
これにより、ログやレポートに機密情報が表示されなくなり、安全にテストが行えます。
2. 新しいクエリ:IPアドレス、HTTPバージョン
Hurl 6.1.0では、HTTPレスポンスからIPアドレスを取得するクエリが追加されました:
GET https://example.org/hello
HTTP 200
[Captures]
server_ip: ip
取得したIPアドレスは他の値と同様にテストできます:
GET https://example.org/api/tests/4567
HTTP 200
[Asserts]
ip == "2001:0db8:85a3:0000:0000:8a2e:0370:733"
また、便利な機能として、isIpv4
とisIpv6
という2つの新しい述語も追加されました:
GET https://example.org/foo
[Options]
ipv6: true
HTTP 200
[Asserts]
ip isIpv6
IPアドレスのフォーマットチェックには文字列値に対して以下のように使用することもできます:
GET https://example.org/api/endpoint
HTTP 200
[Asserts]
jsonpath "$.server_ip" isIpv4
さらに、HTTPバージョンをテストするためのversion
クエリも追加されました:
GET https://example.org/http3
HTTP 200
[Asserts]
version == "3"
GET https://example.org/http2
HTTP 200
[Asserts]
version toFloat >= 2.0
3. 新しいフィルター:base64のエンコード/デコード、toString
Hurl 6.1.0では、データを変換するための新しいフィルターが追加されました:
-
base64Encode
/base64Decode
:Base64エンコーディングでデータをエンコード/デコードします
GET https://example.org/api
HTTP 200
[Asserts]
jsonpath "$.token" base64Decode == hex,e4bda0e5a5bde4b896e7958c;
-
toString
:値を文字列に変換します
GET https://example.org/foo
HTTP 200
[Asserts]
status toString matches /(200|204)/
4. より多くのcurlオプション
最後に、Hurl 6.1.0では--header
オプションが追加され、実行するすべてのリクエストに特定のHTTPヘッダーを追加できるようになりました:
$ hurl --header 'x-header-b:baz' --header 'x-header-c:qux' foo.hurl
Hurlを使うメリット
Hurlを使う主なメリットは:
- シンプルな構文 - プレーンテキストなので学習コストが低く、バージョン管理も容易
- 強力なアサーション機能 - JSONPath、XPathなど様々な方法でレスポンスを検証可能
- curlの機能を継承 - 信頼性の高いHTTPエンジンを利用
- CI/CDとの親和性 - 自動テストに組み込みやすい
- レポート機能 - テスト結果をHTML、JSON、JUnit、TAPなどの形式で出力可能
まとめ
Hurlは、HTTPリクエストをシンプルにテストできるツールで、特にAPIテストや自動化が必要な場面で活躍します。バージョン6.1.0では、機密情報の保護、新しいクエリやフィルター、より多くのcurlオプションが追加され、さらに使いやすくなりました。
シンプルなテキスト形式でHTTPリクエストを定義でき、強力なアサーション機能を備えているため、APIの動作確認やテスト自動化に最適です。また、CI/CDパイプラインとの統合も容易です。
APIを開発・テストする機会がある方は、ぜひHurlを試してみてください!
参考リンク
- 公式サイト: https://hurl.dev
- GitHubリポジトリ: https://github.com/Orange-OpenSource/hurl
- 公式ドキュメント: https://hurl.dev/docs/manual.html
- リリースノート: https://github.com/Orange-OpenSource/hurl/releases