APIテストツール比較:Hoppscotch vs Bruno vs Insomnia でPostman代替OSS を探す
オープンソースラボ編集部 ・ 2026年6月13日
APIテストツール比較:Hoppscotch vs Bruno vs Insomnia でPostman代替OSS を探す
Postmanが有料化・クラウド必須化を強化する中、オープンソースの代替としてHoppscotch・Bruno・Insomniaが注目されています。REST・GraphQL・WebSocket・gRPCのテストをローカルで完結できるかどうか、チームでのコレクション共有方法、CIとの統合方法を比較します。
なぜPostman代替を探すのか
Postmanの問題点:
- 2023年以降「Lightweight API Client」のローカル保存が制限され、クラウド同期必須化
- チームプランが$12/ユーザー/月から
- 社内の機密APIコレクションがPostmanクラウドに保存されるプライバシーリスク
- コレクションがPostman独自のJSON形式で他ツールへの移行が面倒
主要ツールの概要
Hoppscotch
ブラウザベースのオープンソースAPIクライアントです。GitHubスター65k+で最も人気。Webアプリとしてブラウザで動作するため、インストール不要でチームが即座に使い始められます。セルフホスト版もあります。
# Hoppscotchをセルフホストする(docker-compose)
# .env.productionを設定後
docker-compose up -d
# 簡易セルフホスト(単体コンテナ)
docker run -d --name hoppscotch -p 3000:3000 hoppscotch/hoppscotch:latest
# Hoppscotch CLIでAPIテストを自動実行(CI連携)
# インストール
npm install -g @hoppscotch/cli
# コレクションをエクスポートしてCLIで実行
hopp test ./collection.json --env ./env.json
# GitHub Actionsに組み込む例
# .github/workflows/api-test.yml
# .github/workflows/api-test.yml
name: API Tests
on: [push, pull_request]
jobs:
api-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Hoppscotch CLI
run: npm install -g @hoppscotch/cli
- name: Run API Tests
run: |
hopp test ./tests/api-collection.json --env ./tests/env.production.json
env:
API_BASE_URL: ${{ secrets.API_BASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
// HoppscotchのPre-request scriptとPost-response scriptの例
// Pre-request script(リクエスト前に認証トークンを取得)
const response = await fetch(`${pw.env.get("AUTH_URL")}/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: pw.env.get("CLIENT_ID"),
client_secret: pw.env.get("CLIENT_SECRET"),
grant_type: "client_credentials",
}),
});
const data = await response.json();
pw.env.set("ACCESS_TOKEN", data.access_token);
// Post-response script(レスポンスのアサーション)
pw.expect(pw.response.status).toBe(200);
pw.expect(pw.response.body.data).toBeDefined();
pw.expect(pw.response.headers["content-type"]).toContain("application/json");
Bruno
ローカルファーストの哲学で設計されたAPIクライアントです。コレクションをフォルダ構造でローカルのファイルシステムに保存します。GitHubスター28k+で急成長中。Postmanとは異なり、データが一切クラウドに送られません。
# Brunoのインストール
# macOS
brew install --cask bruno
# Linuxのdebパッケージ
curl -LO https://github.com/usebruno/bruno/releases/latest/download/bruno_amd64.deb
sudo dpkg -i bruno_amd64.deb
# コレクションはフォルダ(.bru形式)で保存される
# my-api-collection/
# ├── environments/
# │ ├── production.bru
# │ └── staging.bru
# ├── auth/
# │ ├── login.bru
# │ └── refresh-token.bru
# └── articles/
# ├── list-articles.bru
# ├── get-article.bru
# └── create-article.bru
# Brunoのコレクションファイル(.bru形式)の例
# articles/get-article.bru
meta {
name: Get Article
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/articles/{{slug}}
body: none
auth: bearer
}
auth:bearer {
token: {{accessToken}}
}
headers {
Accept: application/json
X-Request-ID: {{$randomUuid}}
}
tests {
test("should return 200", function() {
expect(res.status).to.equal(200);
});
test("should have slug in response", function() {
expect(res.body.slug).to.equal(bru.getVar("slug"));
});
test("response time should be under 500ms", function() {
expect(res.responseTime).to.be.below(500);
});
}
script:post-response {
bru.setVar("articleId", res.body.id);
}
# Bruno CLIでテストをCI実行
# インストール
npm install -g @usebruno/cli
# コレクション全体をテスト
bru run --env production
# 特定フォルダのテスト
bru run articles/ --env production
# JUnit XML形式でレポート出力(CI連携用)
bru run --env production --reporter junit --output ./test-results.xml
# dotenvファイルから環境変数を読む
bru run --env production --env-var "API_KEY=$API_KEY"
Insomnia
Kongが開発するオープンソースAPIクライアントです。REST・GraphQL・gRPC・WebSocket・SSEに対応し、OpenAPI仕様の取り込みとドキュメント生成も得意です。
# Insomniaのインストール
# macOS
brew install --cask insomnia
# Linux(Snapで)
sudo snap install insomnia
# コレクションをエクスポート(Insomnia独自JSON形式)
# File → Export Data → Current Workspace
# Insomniaのコレクションをinsomniaのyaml形式でGit管理する
# .insomnia/ フォルダが作成される(Git同期機能)
# Insomniaのリクエスト設定例(YAML形式でGit管理)
# .insomnia/requests/create-article.yml
_id: req_create_article
type: Request
parentId: wrk_api_collection
modified: 1700000000000
created: 1700000000000
name: Create Article
description: ""
url: "{{ base_url }}/api/articles"
method: POST
body:
mimeType: application/json
text: |-
{
"slug": "{{ slug }}",
"title": "{{ title }}",
"content_md": "{{ content_md }}",
"category": "devops"
}
headers:
- name: Content-Type
value: application/json
- name: Authorization
value: "Bearer {{ access_token }}"
authentication:
type: bearer
token: "{{ access_token }}"
# PythonでAPIテストを書くアプローチ(Insomnia不要のCLI方式)
# HoppscotchやBrunoのCLIが難しい場合の代替
import httpx
import pytest
BASE_URL = "https://api.yoursite.com"
API_KEY = "your-api-key"
@pytest.fixture
def client():
return httpx.Client(
base_url=BASE_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=10.0,
)
def test_get_articles(client):
resp = client.get("/api/articles")
assert resp.status_code == 200
data = resp.json()
assert isinstance(data, list)
assert len(data) > 0
assert "slug" in data[0]
def test_get_article_by_slug(client):
resp = client.get("/api/articles/open-source-feature-flags")
assert resp.status_code == 200
data = resp.json()
assert data["slug"] == "open-source-feature-flags"
assert "content_md" in data
def test_create_article_requires_auth():
resp = httpx.post(f"{BASE_URL}/api/articles", json={"title": "test"})
assert resp.status_code == 401
機能比較表
| 比較項目 | Hoppscotch | Bruno | Insomnia |
|---|---|---|---|
| ライセンス | MIT | MIT | Apache 2.0 |
| UIタイプ | Webブラウザ | デスクトップアプリ | デスクトップアプリ |
| ローカル保存 | ✅ セルフホスト | ✅ ファイルシステム | ✅ |
| クラウド同期 | ✅(オプション) | ❌(意図的) | ✅(オプション) |
| Git管理 | ✅ | ✅ ネイティブ | ✅(.insomnia) |
| REST | ✅ | ✅ | ✅ |
| GraphQL | ✅ | ✅ | ✅ |
| gRPC | ✅ | ✅ | ✅ |
| WebSocket | ✅ | ✅ | ✅ |
| SSE(Server-Sent Events) | ✅ | ❌ | ✅ |
| OpenAPI取り込み | ✅ | ❌ | ✅ |
| CLI(CI連携) | ✅ | ✅ | ✅ |
| テストスクリプト | ✅ | ✅ | ✅ |
| Pre-requestスクリプト | ✅ | ✅ | ✅ |
| セルフホスト | ✅ | N/A(デスクトップ) | ✅ |
| GitHub Stars | 65k+ | 28k+ | 33k+ |
APIテスト・開発ツールについてはdevopsカテゴリ(/categories/devops)で幅広く紹介しています。CI/CDパイプライン構築についてはCI/CDセルフホスト比較(/categories/devops)も参考にしてください。
FAQ
Q. PostmanのコレクションをBrunoやHoppscotchにインポートできますか?
A. はい、どちらもPostmanのCollection v2.1形式(JSON)のインポートに対応しています。Brunoの場合: File → Import Collection → Postman v2.1 → インポートするとフォルダ構造に変換されて.bruファイルとして保存されます。Hoppscotchの場合: Collections → Import → Postman Collection v2からインポートできます。ただし、PostmanのPre-request ScriptはBrunoのscript:pre-request形式に変換されますが、Postmanのモジュール(pm.xxx)の一部はBrunoでは動作しないことがあるため、移行後にスクリプトの動作確認が必要です。
Q. BrunoのコレクションをGitで管理する利点は何ですか?
A. Brunoのコレクションは.bruテキストファイル形式で保存されるためGitで差分管理ができます。具体的な利点: ①APIの変更履歴をgit logで追跡できる、②PRレビューでAPIの変更仕様を確認できる(差分がテキストなので読みやすい)、③チームメンバーが同じリポジトリをcloneするだけでコレクションを共有できる(Postmanのチームワークスペースは有料)、④環境変数(シークレット)を.envファイルとして.gitignoreに入れ、変数名だけをコミットするセキュアなワークフロー。これによりAPIコレクションをアプリのリポジトリと同じGitリポジトリで管理できます。
Q. Hoppscotchのセルフホストは複雑ですか?
A. Hoppscotchのセルフホストにはデータベース(PostgreSQL)とメールサーバー(SMTP)が必要で、単純なDockerコンテナより複雑です。docker-compose.ymlを使えば比較的簡単にセットアップできます: ①Hoppscotch(フロントエンド)、②Hoppscotch Backend(API)、③Hoppscotch Admin(管理ダッシュボード)、④PostgreSQL の4コンテナが必要。環境変数にDATABASE_URL・JWT_SECRET・SESSION_SECRET・SMTP_*を設定します。個人・小チームならhttps://hoppscotch.ioのホスト版(無料プランあり)で始める方が手軽で、チームが大きくなったらセルフホストに移行するアプローチが現実的です。
Q. APIテストを自動化するのにHoppscotch CLIとBruno CLIどちらがCIに向いていますか?
A. どちらも実用的ですが現時点ではBruno CLIの方がCI環境での実績が多いです。Bruno CLIの優位点: ①コレクションがフォルダ+テキストファイルなのでCI上でディレクトリを指定して実行しやすい、②--reporter junitでJUnit XML形式の出力があり、GitHub ActionsのTest Reporter系アクションと連携しやすい、③環境変数をCLIフラグで上書きできて--env-var "API_URL=$API_URL"のように安全に注入できる。Hoppscotch CLIはコレクションをJSON形式で事前にエクスポートが必要でやや手間がかかります。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| クラウド不要・完全ローカル | Bruno |
| ブラウザ+チーム共有 | Hoppscotch |
| OpenAPI連携・gRPC対応 | Insomnia |
| Git管理でコレクション共有 | Bruno |