Shortest - 自然言語でE2Eテストを書くAIツール
GitHubで急上昇中のAIテストツール「Shortest」を見つけた。Playwright使いとして気になったので調べてみた。
結論から言うと、面白いけどPlaywrightとは別物。使い分けが重要。
Shortestとは
Shortestは、Anthropic Claude APIを活用した自然言語E2Eテストフレームワーク。Playwrightの上に構築されていて、テストを英語の自然言語で記述するとAIが実際のブラウザ操作に変換してくれる。
antiwork社が開発しており、GitHubで活発に開発が続いている。
特徴的なのは、こんな感じでテストが書けること:
import { shortest } from "@antiwork/shortest";
shortest("Login to the app using email and password", {
username: process.env.USERNAME,
password: process.env.PASSWORD,
});
セレクタを一切書かずに「ログインして」と指示するだけ。AIがUIを解析して適切な要素を見つけ、操作を実行する。
セットアップ
インストール
npx @antiwork/shortest init
このコマンドで以下が自動実行される:
@antiwork/shortestパッケージをdev依存としてインストールshortest.config.ts設定ファイルを生成.env.localファイルを作成
環境変数
Anthropic APIキーが必須。
ANTHROPIC_API_KEY=your_api_key
設定ファイル
import type { ShortestConfig } from "@antiwork/shortest";
export default {
headless: false,
baseUrl: "http://localhost:3000",
testPattern: "**/*.test.ts",
ai: {
provider: "anthropic",
},
} satisfies ShortestConfig;
基本的な使い方
シンプルなテスト
import { shortest } from "@antiwork/shortest";
shortest("Login to the app using email and password", {
username: process.env.USERNAME,
password: process.env.PASSWORD,
});
変数を渡すことで、AIがコンテキストを理解して適切に値を使用する。
コールバックでの追加検証
AIの操作だけでは不安な場合、コールバックで明示的なアサーションを追加できる。
shortest("Add item to cart and proceed to checkout", {
productName: "Test Product"
}).after(async ({ page }) => {
const cartCount = await page.locator('.cart-count').textContent();
expect(cartCount).toBe('1');
});
afterコールバックではPlaywrightのpageオブジェクトにアクセスできるので、通常のPlaywrightコードが書ける。
ライフサイクルフック
Jestライクなフックも用意されている。
shortest.beforeAll(async ({ page }) => {
await page.goto('/setup');
});
shortest.afterEach(async ({ page }) => {
await page.evaluate(() => localStorage.clear());
});
テスト実行
pnpm shortest # 全テスト実行
pnpm shortest login.test.ts # ファイル指定
pnpm shortest login.test.ts:23 # 行番号指定
pnpm shortest --headless # ヘッドレスモード(CI向け)
Playwrightとの比較
テスト記述の違い
同じログインテストを書くと、こうなる。
Playwright
test('login test', async ({ page }) => {
await page.goto('https://example.com/login');
await page.fill('#email', 'user@example.com');
await page.fill('#password', 'password123');
await page.click('button[type="submit"]');
await page.waitForURL('**/dashboard');
await expect(page.locator('h1')).toContainText('Welcome');
});
Shortest
shortest("Login with email user@example.com and password, then verify dashboard shows Welcome message");
コード量の差は歴然。ただし、これがメリットだけとは限らない。
比較表
| 項目 | Playwright | Shortest |
|---|---|---|
| テスト記述 | セレクタ指定のコード | 自然言語(英語) |
| 学習コスト | API習得が必要 | 英語で書くだけ |
| 実行コスト | 無料 | Anthropic API課金 |
| 細かい制御 | 高い | AIに依存 |
| 再現性 | 完全に同じ動作 | AIの判断で微妙に変わる |
| セレクタ変更への耐性 | 弱い(修正必要) | 強い(AIが適応) |
| デバッグのしやすさ | 高い | 中程度 |
| CI/CD向き | ◎ | ○(コスト注意) |
Playwright MCP vs Shortest
Playwright MCPを使ってAIからブラウザを操作している場合、Shortestとの違いが気になるところ。
アプローチの違い
Playwright MCP
AIがPlaywrightのAPIを直接呼び出す。AIは「何をするか」と「どうやるか」の両方を決める。自由度が高いが、毎回AIが判断を下す。
Shortest
人間が「何をするか」を自然言語で書き、AIは「どうやるか」だけを決める。テスト内容は固定で、実行方法だけをAIが判断する。
使い分け
| シナリオ | Playwright MCP | Shortest |
|---|---|---|
| 自由なブラウザ探索 | ◎ | × |
| 定型テストの繰り返し | △(毎回AI判断) | ◎(テスト定義済み) |
| テスト資産として管理 | △ | ◎ |
| 動的なタスク実行 | ◎ | × |
組み合わせの可能性
こんなワークフローが考えられる:
- Playwright MCPで探索的にUIを調査
- 確定したフローをShortestのテストとして定義
- CI/CDでShortestを実行
探索フェーズではMCPの自由度を活かし、安定したフローはShortestでテスト資産化する。
注意点・落とし穴
API料金が発生する
テスト実行のたびにClaude API呼び出しが発生する。1テストあたりのコストは操作の複雑さによるが、開発中に何度も実行するとコストが膨らむ。
Playwrightは完全無料なので、この違いは大きい。
対策: 開発中はPlaywrightで書き、安定したらShortestに移行を検討。または、Shortestは最終確認用に限定する。
AIの判断に依存する
同じテストでも実行ごとに微妙に異なる操作をする可能性がある。「ログインボタンをクリック」という指示に対して、ある時は#login-btnを、別の時は.submit-buttonをクリックするかもしれない。
UI変更への耐性は高いが、意図しない操作をするリスクもある。
対策: コールバック関数で重要なアサーションを明示的に追加する。AIの操作結果を信頼しつつ、最終状態は自分で確認。
React 18 + Next.js 14+で型エラー
useFormStatusやServer Actionsとの型衝突が発生する可能性がある。
Type error: Type 'X' is not assignable to type 'Y'
対策: React 19へのアップグレードが推奨されている。
デバッグ情報に機密情報が含まれる可能性
.shortestフォルダにデバッグ情報が保存される。Issue報告時に共有する前に内容確認が必要。環境変数やログイン情報が含まれている可能性がある。
英語での記述が前提
自然言語テストは英語で書く想定。日本語での動作は公式にはサポートされていない。
Claudeは日本語を理解するので動くかもしれないが、未検証。本番で使うなら英語で書くのが無難。
GitHub 2FA設定が複雑
GitHub認証テストを使う場合、TOTP秘密鍵の設定が必要。Authenticatorアプリとの同期設定が面倒。
GITHUB_TOTP_SECRET=your_secret
複雑なテストには向かない
AIが判断に迷うような複雑なシナリオや、厳密なタイミング制御が必要な場合は苦手。
対策: そういうケースは素直にPlaywrightを使う。無理にShortestで書く必要はない。
ユースケース別の使い方
プロトタイプの簡易テスト
開発初期のスモークテストに最適。UIが頻繁に変わる段階でセレクタを書きたくないときに便利。
非エンジニアでも読めるテスト
QAチームやPMがテスト内容を理解しやすい。自然言語で書かれているので、テスト仕様書としても機能する。
認証フローのテスト
GitHub 2FA対応がビルトイン。Mailosaur連携でメール検証も可能。認証周りのテストは設定が面倒だが、Shortestはこの辺りを手厚くサポートしている。
現時点での評価
良い点
- 自然言語でテストが書ける画期的なアプローチ
- Playwrightの知識がなくてもE2Eテストが書ける
- UIの変更に強い(セレクタに依存しない)
- GitHub 2FA、メール検証などの高度な機能がビルトイン
気になる点
- API課金が発生する(Playwrightは無料)
- 再現性がAI依存
- 英語前提
- 複雑なテストには向かない
使うならこう使う
「Playwrightの代替」ではなく「Playwrightの上位レイヤー」として捉えるのが正しい。
- 細かい制御が必要 → Playwright
- シンプルなフローを素早くテスト → Shortest
- 探索的なブラウザ操作 → Playwright MCP
- 定型テストの資産化 → Shortest
両方使い分けるのがベスト。全部をShortestに置き換える必要はないし、Shortestを使わない選択も全然あり。
ツールは使い分けてこそ。