技術 約6分で読めます

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");

コード量の差は歴然。ただし、これがメリットだけとは限らない。

比較表

項目PlaywrightShortest
テスト記述セレクタ指定のコード自然言語(英語)
学習コスト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 MCPShortest
自由なブラウザ探索×
定型テストの繰り返し△(毎回AI判断)◎(テスト定義済み)
テスト資産として管理
動的なタスク実行×

組み合わせの可能性

こんなワークフローが考えられる:

  1. Playwright MCPで探索的にUIを調査
  2. 確定したフローをShortestのテストとして定義
  3. 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+で型エラー

useFormStatusServer 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を使わない選択も全然あり。

ツールは使い分けてこそ。

参考リンク