AIによるテスト自動化は、仕様書からテストケースを起こす「設計」、テストコードを書く「実装」、画面変更で壊れたテストを直す「保守」の3工程をAIに肩代わりさせる取り組みです。2025年以降はPlaywrightが計画・生成・修復の3エージェントを標準機能にし、ISTQBが生成AIを使ったテストの資格シラバスを承認するなど、実験段階から実務の選択肢に移りました。一方で、AIが作ったテストは「通るのにバグを見逃す」という固有の弱点を持ちます。この記事では、テストケースを生成AIで作る手順、観点ごとの確認点、ツールの選び方、そして期待値をどう守るかを、公式ドキュメントと論文の数値にもとづいて整理します。
まとめ:AIテスト自動化で任せる工程と人が残す判断
- AIに任せやすいのはテストケースの叩き台づくり・テストコードの記述・ロケーター変更の修復。人が残すのは期待値(何が正しい動作か)の確定と、仕様書に書かれていない観点の追加。
- テストケース生成は「仕様の前処理 → 観点ごとに分けた指示と表形式での出力 → 要件IDでの突き合わせ」の3段階で回すと、抜けと重複を人が検出しやすい。
- 実装コードからテストを作らせると、AIは今の動作をそのまま期待値にする。誤った実装でもテストが通るため、期待値は仕様から作る。
- Metaの実測では、LLMが生成したテストのうちビルドに成功したのは75%、安定して合格したのは57%、カバレッジを上げたのは25%。生成物は選別して取り込む前提で使う。
- ツールは「ノーコードE2E」「OSSのテストエージェント」「コーディングエージェント」「単体テスト特化」の4系統。テストを誰が保守するかで選ぶ。
AIテスト自動化の範囲:設計・実装・保守の3工程
従来のテスト自動化は、人が設計したテストケースを人がスクリプトに書き、実行だけを機械に任せるものでした。AIによる自動化は、この前後の「設計」と「保守」にまで機械の担当を広げた点が違います。どの工程をAIに渡すかで、使うツールも人の確認ポイントも変わります。
| 工程 | AIがやること | 代表的な仕組み | 人が確認すること |
|---|---|---|---|
| 設計 | 仕様書から観点・テストケースを起こす | Autify Nexus、Playwright planner | 観点の抜け、期待値の正しさ |
| 実装 | テストケースをコードに変換する | Playwright generator、Copilot | テストが本当に検証しているか |
| 保守 | 画面変更で壊れたテストを直す | Playwright healer、mabl auto-heal | 修復がバグの見逃しになっていないか |
テスト自動化の意義は、回帰テストを毎回同じ品質で回せることにあります。AIはその自動テストを「作る」「直す」コストを下げるもので、テストで何を保証するかを決める作業までは代わりません。この線引きが、後で述べる期待値の問題につながります。
テストケースを生成AIで作る手順:仕様書から観点・ケースまで
ChatGPTやClaude、Geminiに仕様書を渡して「テストケースを作って」と頼むだけでも表は出てきます。ただし一度にまとめて頼むと、もっともらしい項目が並ぶ一方で、どの要件に対応する項目なのかが追えなくなります。この記事では次の3段階で進めます。
入力の準備:仕様書の前処理と前提の明記
PDFや画面キャプチャのまま渡すより、要件ごとにIDを振ったテキストへ整えてから渡します。入力値の範囲、エラー時の表示、権限ごとの差など、テストの期待値になる記述を前に出し、背景説明は削ります。DMMのQAチームは、画面キャプチャからGeminiに機能概要を書かせ、それを社内のテスト観点リストや設計ルールと一緒にNotebookLMへ読み込ませてからテストケースを生成しています。その際、Geminiには「資料から読み取れない機能は出力しない」、NotebookLMでの情報整理には「情報が不足していれば不足を指摘する」という制約を付けており、AIが仕様にない機能を補ってしまうのを防いでいます。
観点ごとに分けた指示と出力形式の固定
正常系・異常系・境界値・権限といった観点を1回の指示に詰め込まず、観点ごとに分けて依頼します。出力形式は表に固定し、要件IDの列を必須にします。
あなたはソフトウェアテストの設計者です。
次の要件のうち REQ-012 だけを対象に、境界値分析でテストケースを作成してください。
# 要件
REQ-012: 会員登録の年齢欄は0〜120の整数のみ受け付ける。18以上を成人として扱う。
# 制約
- 要件に書かれていない仕様を推測で補わない。不明点は「不明点」欄に列挙する
- 出力は表形式。列は「要件ID」「観点」「入力値」「期待結果」「根拠となる要件の文」
- 期待結果は要件の文から導けるものだけを書く
「根拠となる要件の文」の列を付けるのが要点です。根拠が空欄の行や、要件に無い文を根拠にしている行は、AIが補った推測なので人が判断します。
要件IDでの突き合わせ
生成された表を要件一覧と突き合わせ、テストケースが1件も無い要件を探します。要件とテストの対応を管理する考え方はITのトレーサビリティとは?要件から設計・実装・テストを紐付ける実装手順で、条件の組み合わせを表で整理する方法はテストマトリクスとは?作り方・サンプル表・観点とパターン削減で解説しています。DMMの報告では、前述のGeminiとNotebookLMによる手順の導入と改善を重ねた結果、最初の機能と比べて約2倍の速度でテスト設計ができるようになった一方、出力をそのまま使えるわけではなく修正の手間は残ったとしています。
境界値・異常系・非機能の観点をAIに出させるときの確認点
仕様書に数値の範囲が書かれていれば境界値は挙げやすい一方、書かれていない観点は抜けるか、推測で補われます。観点ごとに、AIの出力をそのまま使える範囲と人が補う範囲が違います。
正常系・異常系・境界値の違いと確認点
正常系は仕様どおりの入力で期待した結果になるか、異常系は不正な入力を正しく拒否するか、境界値は範囲の端(とその1つ外)で判定が切り替わるかを確かめるテストです。先ほどのREQ-012なら、境界値で必要な入力は次の6点になります。
| 入力値 | 分類 | 期待結果 |
|---|---|---|
| -1 | 異常系(下限の外) | エラー |
| 0 | 境界値(下限) | 受け付ける・未成年 |
| 17 | 境界値(成人判定の直前) | 未成年 |
| 18 | 境界値(成人判定) | 成人 |
| 120 | 境界値(上限) | 受け付ける・成人 |
| 121 | 異常系(上限の外) | エラー |
AIの出力で特に確認したいのは、「18以上」の「以上」を含むかどうかの境界と、型の異常(小数・文字列・空欄)です。要件の文が「18歳から」「18歳になったら」のように境界を含むか読み取りにくい書き方だと、AIはどちらかに決めて期待値を書きます。表の「不明点」欄にこの曖昧さが出ているかを必ず見てください。技法そのものはブラックボックステストとホワイトボックステストの違い|技法・カバレッジ基準・使い分けで整理しています。
AIが出しにくい非機能・リグレッションの観点
応答時間、同時アクセス数、ログの保持期間といった非機能の観点は、機能仕様書に数値が書かれていないことが多く、AIは「性能を確認する」程度の抽象的な項目しか出せません。先に非機能要件を数値で決めておく必要があります(非機能要件とは?6大項目の数値化とk6での閾値テストまで実装目線で解説)。リグレッションテストの観点も同じで、「今回の変更がどこに波及するか」はコードの依存関係と過去の障害履歴から決まるため、仕様書だけを渡されたAIには判断材料がありません。範囲の決め方はリグレッションテスト(回帰テスト)とは?目的・範囲選定・自動化と実施判断を解説を参照してください。
AIが生成したテストが「通るのにバグを見逃す」理由
AIテスト自動化で最も注意すべき失敗は、テストが全件合格しているのに、そのテストがバグを検出できない状態です。原因は期待値の出どころにあります。
AIに実装コードを渡してテストを書かせると、AIはコードを読んで「この入力ならこの値が返る」と推論し、それを期待値にします。実装が間違っていれば、間違った動作がそのまま期待値になります。正しい動作と誤った動作を見分ける問題はソフトウェアテストで「テストオラクル問題」と呼ばれ、24件のオープンソースJavaリポジトリを対象にした研究(arXiv:2410.21136)でも、LLMによるテスト生成は期待される動作ではなく実際の実装の動作を期待値に取り込みやすいと報告されています。この弱点はRandoopやEvoSuiteといった従来の自動生成ツールでも知られていたもので、LLMでも解消していないということです。同じ研究は、テスト名や変数名が意味のある名前になっているとLLMの期待値の質が上がることも示しています。
REQ-012を実装する際に >= を > と書き間違えた例で確かめます。
# membership.py
def is_adult(age: int) -> bool:
if type(age) is not int or age < 0 or age > 120:
raise ValueError("age must be 0-120")
return age > 18 # 仕様は「18歳以上」。>= を > と書き間違えている
この実装をAIに読ませると、次のように18歳を未成年とする現在の動作を正しいものとして写したテストが出やすくなります(説明用に書いた典型例です)。
# test_from_impl.py:実装から期待値を写した場合の典型例(説明用)
from membership import is_adult
def test_18_is_not_adult():
assert is_adult(18) is False
def test_19_is_adult():
assert is_adult(19) is True
仕様の文から境界値で作ったテストは、18で判定が切り替わることを要求します。
# test_from_spec.py:仕様「18歳以上を成人、0〜120以外はValueError」から境界値で作ったテスト
import pytest
from membership import is_adult
@pytest.mark.parametrize("age, expected", [(17, False), (18, True), (0, False), (120, True)])
def test_boundary(age, expected):
assert is_adult(age) is expected
@pytest.mark.parametrize("age", [-1, 121])
def test_out_of_range(age):
with pytest.raises(ValueError):
is_adult(age)
pytest 8.4.2で両方を実行した結果は次のとおりです(抜粋)。
$ python3 -m pytest -q test_from_impl.py
..
2 passed in 0.01s
$ python3 -m pytest -q test_from_spec.py
.F....
FAILED test_from_spec.py::test_boundary[18-True] - assert False is True
1 failed, 5 passed in 0.17s
実装から作ったテストは全件合格し、バグは残ったままです。仕様から作ったテストだけが18の境界で失敗し、誤りを指摘しました。対策は次の3つです。
- 期待値は仕様から作らせる。テスト生成の入力には仕様書か受け入れ条件を渡し、実装コードは渡さないか、渡す場合も期待値の根拠にしないよう指示する。
- 生成されたテストの検出力を測る。カバレッジは「実行された行」しか示さない。わざとバグを埋め込んでテストが失敗するかを見るミューテーションテストで、テストが本当に誤りを捕まえるかを確かめる(ミューテーションテストとは?ミュータント生成とスコアの読み方を実装者向けに解説)。
- 既存コードの保護目的と割り切る。レガシーコードの改修前に今の動作を固定する回帰テストとしてなら、実装から作るテストにも価値がある。その場合は「正しさの保証ではない」と明記して残す。
3つ目の使い方を大規模に回した例が、Metaが社内で運用したTestGen-LLMです。論文(arXiv:2402.09171)によると、これは既存の人手で書かれたテストクラスにテストを追加して強化するツールで、生成物の選別がどれほど必要かを数字で示しています。InstagramのReelsとStoriesでの評価では、生成したテストのうちビルドに成功したのは75%、安定して合格したのは57%、カバレッジを上げたのは25%でした。TestGen-LLMはビルド・合格・カバレッジ向上の3条件を満たしたテストだけを開発者に提案する仕組みで、社内のテストイベントでは適用したクラスの11.5%を改善し、提案の73%が本番に採用されています。生成したテストを無条件に取り込まず、機械的なフィルタを通してから人が見る設計です。ただし「合格する」という条件は今の動作を期待値として受け入れることでもあるため、このフィルタは回帰の保護には効いても、仕様どおりかどうかの保証にはなりません。
AIテスト自動化ツールの4系統と選び方
AIテストツールは機能の名前が似ていても、誰がテストを保守するかの前提が違います。2026年10月時点の主な系統は次の4つです。
| 系統 | 代表例 | AIの担当 | テストの持ち主 |
|---|---|---|---|
| ノーコードE2E | Autify Nexus、mabl、MagicPod | 仕様からのケース生成、自己修復 | QA担当者 |
| OSSのテストエージェント | Playwright Test Agents | 計画・コード生成・修復 | 開発者(リポジトリ内) |
| コーディングエージェント | GitHub Copilot | 選択したコードのテスト生成 | 開発者 |
| 単体テスト特化 | Diffblue Cover | Java・Kotlinの単体テスト生成 | 開発者 |
ノーコードE2E:Autify Nexus・mabl・MagicPod
Autify Nexusは2025年7月3日に発表されたサービスで、PRD(製品要求仕様書)やユーザーストーリー、仕様書を読み込ませるとテストケースを生成し、自然言語の指示からPlaywright形式のテストコードを作ります。コードはダウンロードしてPlaywright単体でも実行でき、ロケーターの変更で失敗したテストには代替のロケーターをAIが探す「Fix with AI」があります。同社のAutify Genesisは、要件やソースコードから機能一覧・テスト観点・テストケースを生成します。mablは自然言語のプロンプトからブラウザ・モバイル・APIのテストを生成し、生成AIで文言や属性値の意味的な近さを判定して壊れたテストを直すadvanced auto-healを持ちます。国産のMagicPodの料金と自動修復の注意点はMagicPodとは?料金・できること・使い方とAI自動修復の注意点【2026年9月時点】で解説しています。
Playwright Test Agents:計画・生成・修復の3エージェント
Playwrightは1.56で、テスト計画を作るplanner、計画をテストコードに変えるgenerator、失敗したテストを直すhealerの3エージェントを導入しました。2026年10月時点の最新版1.63.0で npx playwright init-agents --loop=claude を実行すると、次のファイルが生成されます(版ごとの変更点はPlaywrightの最新バージョンは1.63|確認・更新方法とリリース履歴【2026年9月】)。
specs/README.md テスト計画(Markdown)の置き場
seed.spec.ts エージェントが起点にするテスト
.claude/agents/playwright-test-planner.md plannerの定義
.claude/agents/playwright-test-generator.md generatorの定義
.claude/agents/playwright-test-healer.md healerの定義
.mcp.json playwright run-test-mcp-server の登録
--loop には claude のほか codex、copilot、opencode、vscode などを指定でき、Claude CodeやVS Codeのエージェントからブラウザを操作してテストを作ります。公式ドキュメントは、Playwrightを更新するたびにエージェント定義を再生成するよう求めています。
注意したいのはhealerの挙動です。公式ドキュメントでは、healerの成果物は「合格するテスト、またはhealerが機能そのものが壊れていると判断した場合はスキップされたテスト」とされ、生成された定義にも、修正できずテストが正しいと判断した場合は test.fixme() を付けて実行対象から外す指示が入っています。定義には「アサーションと期待値の修正」も担当範囲として書かれており、テストを通すために最も妥当な対応をとるよう指示されています。つまり本物のバグがスキップや期待値の書き換えで隠れることがあるため、healerの差分はレビューで fixme の追加とアサーション・期待値の変更を必ず確認します。Playwright自体の仕組みはPlaywrightとは|仕組み・できること・Seleniumとの違いを解説、ブラウザ操作をMCPで渡す設定はPlaywright MCPとは?設定・使い方からDify連携まで実務ガイド【2026年版】にまとめています。
コーディングエージェントと単体テスト特化ツール
GitHub CopilotはIDEのチャットで /tests を使うと、開いているファイルや選択したコードのテストを生成します。Copilot cloud agent(旧称 Copilot coding agent)では、リポジトリの指示やissueの受け入れ条件に「新機能には単体テストを書く」と明記でき、エージェントは一時的な開発環境で自動テストを実行して変更を検証します。どちらも既存コードを入力にするため、前章の期待値の問題が最も起きやすい使い方です。コーディングエージェント全般の仕組みはCoding Agent(コーディングエージェント)とは?仕組み・3つの型と主要ツールの選び方【2026年9月】で整理しています。手順はGitHub Copilotでテストコードを自動生成する方法|/testsコマンドと活用のコツ【2026年版】を参照してください。Diffblue CoverはJavaとKotlin向けに、メソッドごとにテスト候補を作って評価・調整し、カバレッジが最大になる組み合わせを選びます。IntelliJ向けプラグインのCommunity Editionは無償ですが、テストを書けるのは月25メソッドまでで、利用中は常時オンラインのライセンス照合が必要です。業務SaaSの中にもServiceNowのATF Test Generatorのようにテスト生成を内蔵した製品があります(ATF Test Generatorとは?ServiceNowのテスト自動生成とCloud Runnerの手順・制約)。
選定の判断軸:テストの保守担当
テストをQA担当者が画面上で管理し、開発者がコードを触らない体制ならノーコードE2Eが合います。テストをリポジトリに置いてプルリクエストでレビューする体制なら、Playwright Test Agentsのようにコードを出力する仕組みのほうが、生成物を通常のコードレビューに乗せられます。単体テストを増やしたいJavaのレガシー資産があるならDiffblue Coverが候補です。比較の際は「生成されたテストを自社で編集・持ち出しできるか」を確認してください。Autify NexusがPlaywright形式で出力できるのはこの点への回答で、出力が独自形式のツールは乗り換え時にテスト資産を作り直すことになります。
導入判断:AIテスト自動化を採用すべきでない条件
次の条件に当てはまるなら、AIでテストを量産する前に別の手当てが先です。
- 仕様書や受け入れ条件が無い、または古い。AIの入力が実装コードしか無いと、期待値を実装から写すしかない。まず仕様を書く。
- 既存の自動テストが不安定(フレーキー)。失敗が日常化した状態で自己修復を入れると、修復とスキップで失敗が見えなくなる。不安定の原因を先に潰す。
- 生成されたテストをレビューする人手が無い。Metaの数値でもカバレッジ向上に効いたのは生成の25%。選別せずに取り込むとテストの数だけ増え、実行時間と保守費が膨らむ。
- 規制や監査でテストの根拠説明が求められる。医療機器や金融のように、各テストがどの要件に対応するかを示す必要がある領域では、要件IDとの対応表を人が管理できる範囲に生成を限定する。
テスト担当者のスキル面では、ISTQBが生成AIを使ったテストの専門資格CT-GenAIのシラバスv1.0を2025年7月25日に承認し、2026年4月27日にv1.1を公表しています。プロンプト設計やハルシネーションのリスク、組織への導入が出題範囲で、社内教育の項目を決める際の目安になります。
よくある質問
AIでテストケースを自動生成するには何を用意すればよいですか?
要件ごとにIDを振った仕様書か受け入れ条件と、自社のテスト観点リストを用意します。入力値の範囲やエラー時の挙動など期待値の根拠になる記述が無いと、AIは推測で補った期待値を書きます。
生成AIが作ったテストケースはそのまま使えますか?
そのままは使えません。期待値が仕様と一致しているか、要件に対応していない行が無いか、テストケースが無い要件が無いかを人が確認します。MetaのTestGen-LLMでも、安定して合格したテストは生成した57%にとどまりました。
正常系・異常系・境界値の違いは何ですか?
正常系は仕様どおりの入力の結果、異常系は不正な入力の拒否、境界値は範囲の端で判定が切り替わるかを確かめます。「0〜120の整数」なら-1・0・120・121が境界値の入力で、本文の表に期待結果まで載せています。
AIテスト自動化ツールの導入事例はありますか?
DMMのQAチームはGeminiとNotebookLMでテストケースの叩き台を生成し、最初の機能と比べて約2倍の速度でテスト設計できるようになったと報告しています。MetaはTestGen-LLMを社内で運用し、提案したテストの73%が本番に採用されました。
AIを使ったテストの資格はありますか?
ISTQBの専門資格CT-GenAI(Testing with Generative AI)があり、2026年4月27日にシラバスv1.1が公表されています。プロンプト設計、生成AIのリスク、組織への導入が範囲です。