Skip to main content
Glama

TestTrout

AIが構築したアプリのためのテストアシスタント。

アプリとして実行するか、MCP経由でコーディングエージェントに渡すか。 どちらの方法でも、あなたのアプリがこれまで持っていなかったテストを作成し、それらが壊れたときに通知します。

License Python Status


マスは指標種です。彼らは清潔で酸素が豊富な水にしか生息しません——川でマスを見つけたら、自分でテストしなくても水が健康であることがわかります。

それが優れたテストスイートの本質です:雑用ではなく、ひと目で読み取れるシグナルなのです。


問題

コーディングエージェントは速く出荷します。しかし、彼らは静かに物事を壊し、彼らが構築するアプリ——Lovable、v0、Bolt、Vercel上の手作りのReact——にはほとんどテストがありません。そのため、ループはコードを書いたばかりのものからの*「私には問題なく見える」*で終わります。

TestTroutはそのループを閉じます。リポジトリを読み、実行中のデプロイメントに接続し、何が未テストでどの順序で重要かを把握し、実際のテストを作成し、実行し、実際に行動に移せる結果を報告します。

Related MCP server: Lastest

起動方法

pip install testtrout
trout up

ストレージ、ワーカー、そしてlocalhost:7411のインターフェース。Dockerもデーモンも、インストールするデータベースも不要——~/.testtrout配下のSQLite、ワーカーはインプロセス。いかなる種類のAPIキーも不要です。 ここではモデルを呼び出すものは何もありません。

仕組み

プロジェクトを追加します——このマシン上のフォルダと、それがデプロイされているURLです。

trout add ~/code/my-app --url https://my-app.vercel.app

次に4つのステップ。これらは4つのコマンドでもあります:

trout look     # read the code, ask the deployment, work out what is testable
trout facts    # what I still need from you — all optional
trout build    # write the baseline and prove it
trout run      # re-run it and report what changed

ベースラインとは、今日のデプロイメントが行っていることです。 TestTroutはそれを記録し、それが継続して起こることを検証します。現在の動作が正しいかどうかは知りません——誰もそれを教えていないからです——そして、決して尋ねることはありません。動作が何であるかを知っており、それが変わる日に気づきます。

この単一のルールが、インタビューも承認キューも、製品に関する質問リストも存在しない理由です。尋ねるのは、自分では発見できない具体的な値だけです:

尋ねるもの

理由

デプロイメントURL

コードだけでは何もテストできないから

API URL

バックエンドが独自のホストにデプロイされている場合のみ

アカウント

何かが実際に未認証のリクエストを拒否した場合のみ

実在のID

プローブが/jobs/:idに単独で到達できなかった場合のみ

どれも数秒で答えられ、どれも任意であり、それぞれが何を解放するかを示します。URLだけを渡して他に何も渡さなければ、サインアウト状態で読み込めるすべてのページが得られます——ほとんどのアプリでは、これだけで既に有用なスイートになります。

把握したすべてのものは、サイドバーのアーティファクトとして保持されます——プロジェクトマップ、フォーム、テストプラン、ベースラインスイート——重要なものがチャットのスクロールバックの3画面上にあるということはありません。

またはコーディングエージェントに留まる

アプリは1つの入り口であり、唯一のものではありません。アプリが行うすべてのことは、型付きMCPツールおよびCLIコマンドとして利用できるため、エディタを離れたくない人は離れる必要がありません:

pip install 'testtrout[mcp]'
trout mcp /path/to/your/project

エージェントを.claude/skills/のスキルに向けるか、次のように伝えます:

TestTrout MCPサーバーを使用してください。リポジトリを見て、私がまだ提供すべきものを教えてから、ベースラインを構築して実行してください。

1つのプロジェクトにバインドされた7つのツールにより、エージェントが誤ったリポジトリに対して動作することはありません:

look

コードを読み、デプロイメントに問い合わせ、何がテスト可能かを把握します。

facts set_facts

欠けている具体的な値は何か;ユーザーが与えたものを保存します。

plan

今すぐテストできるものと、各ブロックされた項目が必要とするものを示します。

build

ベースラインを作成し、デプロイメントに対して検証します。

run suite

再実行し、各テストが何をしているかを読み取ります。

さらにtrout://map、trout://facts、trout://plan、trout://config、 trout://scenariosをリソースとして提供するため、大量の状態がエージェントのコンテキストウィンドウを圧迫することはありません。

理解できるもの

trout lookはネットワークアクセスなしでコードを読み取るため、クローンしたばかりのリポジトリでも安全です。典型的なSupabaseアプリでは、以下を見つけます:

サーフェス

例

画面

/orders/:id → OrderDetail、およびそれが到達するデータ

データ操作

supabase.from('orders').delete().eq('id', …)

RLSポリシー

Users manage own orders — テスト可能な認可クレーム

サーバーアクション

'use server'関数 — ヘルパーのように見えるエンドポイント

ルートハンドラー

app/api/checkout/route.ts → POST

サードパーティ

Stripe、Resend — 置換境界

スキーマ

テーブル、カラム、外部キー、RLSステータス

また、行レベルセキュリティなしでブラウザコードからテーブルが書き込まれている場合も通知します——つまり、anonキーを通じて誰でも書き込めるということです。それは通常、新しい情報です。

データベースを尋ねることは決してない

テストはユーザーと同じ方法でアプリに到達します:エンドポイントに対するHTTP、インターフェースに対する実際のブラウザ。サインインは独自のログインフォームを通じて行われ、trout lookが一度特定するため、テストは推測する代わりに既知のフォームを再生します。

つまり、必要なのはURLと2つのテストアカウントだけです。anonキーもサービスロールもプロジェクト資格情報も不要——ほとんどのチームがテストツールに渡すことを合理的に拒否するようなものは何もありません。

認可は依然としてカバーされており、おそらくより優れています:2つの通常のアカウントとしてサインインすると、一方が見られるものは他方には見えません。これにより、ポリシーとその上にアプリケーションが積み重ねるすべてのものがテストされます。これは実際のユーザーが遭遇するものです。

テストが信頼に値する理由

PRごとの推測ではなく、ベースラインを構築します。 変更したばかりのコードから導出されたテストは、新しい動作が構造的に正しいと検証します——回帰を捕捉することはできません。TestTroutはまず動作しているデプロイメントに対してスイートを認定するため、失敗は何かを意味します。

どこにもモデルはありません。 スキャンにも、計画にも、テスト作成にもありません。すべての検証はデプロイメントが実際に行ったことに由来するため、同じ入力は常に同じスイートを生成し、設定するAPIキーもありません。

すべての検証はその来歴を保持しており、ベースラインでは常にobservedです——証拠は生成されたファイルに書き込まれます:

// observed: the page title when /orders was loaded
await expect(page).toHaveTitle('Orders');
// observed: seen on /orders at baseline
await expect(page.getByTestId('orders-table')).toBeVisible();

送信するのはGETのみです。 エンドポイントテストは、エンドポイントが宣言するメソッドに関係なく、プローブが行ったリクエストを再生するため、これを本番環境に向けてもそこで何も変更できません。

失敗は報告される前に分類されます。 assertion_failureのみが製品シグナルです。認証失敗、到達不能なデータベース、ブロックされたサードパーティ呼び出しはハーネスに関するものであり、決定的でない実行がパスにアップグレードされることは決してありません。

ターミナルからすべて

trout add ~/code/my-app --url https://my-app.vercel.app
trout look          # read the code, ask the deployment
trout facts         # what I still need — all optional
trout build         # write the baseline and prove it
trout run           # re-run it; a failure means behaviour changed

すべてのコマンドが--jsonをサポートしています。完全なチュートリアルはdocs/setup.mdにあります。

保存方法

テストスイートはリポジトリに残り、コミットされレビュー可能です:

.trout/scenarios/*.yaml    what each test asserts, in plain language
.trout/facts.yaml          what was asked for — never a secret value
.trout/plan.yaml           what can be tested, and what is waiting
.trout/config.yaml         deployments and env: references, never secrets
tests/trout/               generated Playwright and Vitest files

実行履歴、経時的なカバレッジ、ジョブキューは~/.testtrout配下のSQLiteに保存されます。この分割は意図的です:スイートはプルリクエストがレビューできるコードの隣に属し、ファイルが答えられない質問——このテストはフレーク化していないか、カバレッジは上がっているか——はデータベースに属します。

オプションのWebビュー

trout web

ひと目でわかるカバレッジ、ランク付けされたギャップリスト、シナリオレビュー、証拠付きの実行履歴、ライブログ。CLIと同じ.trout/ファイル——データベースなし、ホストなし、ループバックのみ。完全にオプションです。CLIとMCPは単独で完結しています。

安全性

このツールはデータベース資格情報を必要とし、デプロイメントを操作できるため、保証は文書化ではなくコードで強制されます:

  • 本番環境はデフォルトで読み取り専用です。 変更を伴うリクエストは、エントリポイントが明示的にdisposableとマークされない限り、ネットワーク層でブロックされます。ガードはナビゲーションの下にあります。なぜなら「ページを読み込むだけが読み取り専用」は誤りだからです——これらのアプリの多くはマウント時に書き込みを行います。エージェントもWebクリックも、その設定を変更できません。

  • サードパーティはインターセプトされます。 テスト実行はカードに請求したり、顧客にメールを送信したりできません。一致しない送信リクエストは明示的に失敗します。何も一致しないモックは、何もテストせずにスイートがグリーンを報告する方法です。

  • シークレットはコミットされたファイルに残りません。 .trout/config.yamlはenv:参照のみを保持します。値はgitignoreされた.envに存在します。

  • ホストされるものはなく、マシンから出るものもありません。 呼び出すモデルも、作成するアカウントもありません。テレメトリもありません。

サポートされているスタック

React + Vite(Lovable、v0、Bolt)およびNext.js App Router、TypeScript、Supabase、HTTPで到達可能な任意の場所にデプロイ。認証はSupabase、Clerk、またはNextAuth経由。

意図的に狭くしています。1つのスタックでの深さは、多くのスタックでの浅いカバレッジに勝ります——そしてこれらのコードベースは十分に規則的であるため、静的解析はそれらに対して真に正確です。他のスタックはアダプター1つで対応できます:docs/adapters.mdを参照してください。

ロードマップ

✅

リポジトリ分析、デプロイメントプロービング、ギャップランキング

✅

シナリオ作成、生成、実行、認定

✅

MCPサーバー、CLI、ストレージとワーカーを備えたローカルアプリ

✅

変更ベースのテスト選択、ベースブランチ差分

✅

マルチリポジトリ:ローカルフォルダのリンクまたはGitHubトークンでのクローン

✅

インターフェースまたはCLIからの完全な設定、資格情報の検出付き

🔜

GitHubプルリクエストチェック

🔜

観測されたカバレッジインデックス(今日の選択は宣言されたカバレッジを使用)

コントリビューション

フレームワーク、認証プロバイダー、またはテストランナーを追加するには、1つのプロトコルを実装してエントリポイントを登録するだけです——フォークは不要です。CONTRIBUTING.mdとdocs/adapters.mdを参照してください。

完全なテストスイートはAPIキーなしでオフラインで実行されます。それは意図的であり、維持する価値があります。

ライセンス

Apache 2.0

Related MCP Connectors

Related MCP Servers