AI

APIテストツール比較:Hoppscotch vs Bruno vs Insomnia でPostman代替OSS を探す

オープンソースラボ編集部2026年6月13日

APIテストツール比較:Hoppscotch vs Bruno vs Insomnia でPostman代替OSS を探す

Postmanが有料化・クラウド必須化を強化する中、オープンソースの代替としてHoppscotchBrunoInsomniaが注目されています。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

機能比較表

比較項目HoppscotchBrunoInsomnia
ライセンスMITMITApache 2.0
UIタイプWebブラウザデスクトップアプリデスクトップアプリ
ローカル保存✅ セルフホスト✅ ファイルシステム
クラウド同期✅(オプション)❌(意図的)✅(オプション)
Git管理✅ ネイティブ✅(.insomnia)
REST
GraphQL
gRPC
WebSocket
SSE(Server-Sent Events)
OpenAPI取り込み
CLI(CI連携)
テストスクリプト
Pre-requestスクリプト
セルフホストN/A(デスクトップ)
GitHub Stars65k+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_URLJWT_SECRETSESSION_SECRETSMTP_*を設定します。個人・小チームなら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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。