生成AIでテストケースを作るプロンプトとは、仕様を渡して「何を確かめるか(観点)」と「どの値で確かめるか(ケース)」を表の形で出させる指示文のことです。 1回の依頼で全部を出させるより、観点の洗い出し、技法の指定、ケース化、抜けの点検の4段階に分けたほうが、出てきた表を人が確かめやすくなります。

この記事は、テスト設計の文書(観点表とテストケース表)を作るためのプロンプト集です。段階ごとのプロンプトと、同値分割・境界値・デシジョンテーブル・状態遷移・異常系の技法別プロンプト5種類を、そのまま貼れる形で載せます。出力は表計算ソフトに貼れるタブ区切りにそろえ、架空の会員登録フォームの仕様で記入例を付けました。

確認環境:Linux、Python 3.11.15(標準ライブラリのみ)。確認日は 2026-10-06 です。プロンプトと記入例はこの記事のために書いたもので、記入例の表は人が仕様から書き起こした見本です(特定のモデルの出力ではありません)。個数の検算と、表の点検スクリプトは Python で実行した結果を載せています。

この記事の結論

  • いきなり「テストケースを作って」と頼まず、4段階に分ける。 観点の洗い出し → 技法の指定 → ケース化 → 抜けの点検。
  • 技法は名前を挙げて1つずつ頼む。 「同値分割で」「境界値で」と指定すると、出てくる個数を仕様から先に計算でき、抜けを数で確かめられる。
  • 出力の列を固定する。 ID・観点・技法・前提・入力・期待結果・根拠となる仕様の箇所の7列を、タブ区切りで出させる。
  • 仕様に書かれていないことは、推測で埋めさせず「仕様に記載なし」と書かせる。 その行が、仕様の持ち主への質問一覧になる。
  • 期待結果の正しさは人が確かめる。 AIに任せるのは洗い出しと表の下書きまで。

プロンプトの早見表(4段階と5つの技法)

段階 目的 AIに渡すもの AIに出させるもの 人がすること
0. 聞き返し 足りない情報を先にそろえる 仕様(断片でもよい) 質問の一覧 質問に答えて仕様を補う
1. 観点の洗い出し 何を確かめるかを並べる 仕様 観点表(観点・対象の項目・使う技法・仕様の箇所) 観点の過不足を見る
2. 技法の指定 観点ごとに値や組み合わせを決める 仕様と観点表 同値クラス、境界値、規則、遷移の一覧 個数を検算する
3. ケース化 テストケース表にする 仕様と段階2の一覧 7列のタブ区切りの表 期待結果を仕様と照らす
4. 抜けの点検 足りないケースを探す 仕様とケース表 不足・重複・根拠なしの一覧 採否を決めて表を確定する
技法 向く仕様 出てくるもの 個数の目安
同値分割 入力が「有効な範囲」と「無効な範囲」に分かれる 同値クラスと代表値 クラスの数
境界値 上限・下限のある数値や文字数 境界の両側の値 2値なら範囲1つにつき4個
デシジョンテーブル 複数の条件の組み合わせで結果が変わる 条件と結果の規則表 条件が n 個なら 2 の n 乗個
状態遷移 状態によって同じ操作の結果が変わる 状態×イベントの表 状態の数×イベントの数
異常系 仕様に書かれにくい入力や操作 想定外の入力・操作の一覧 観点の一覧から選ぶ

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「生成AIでテストケースを作るプロンプト集|同値分割・境界値対応」

観点の洗い出しとケース作成の違い

2つは混同されやすいのですが、出すものが違います。

観点の洗い出し ケース作成
答える問い 何を確かめるか どの値・どの手順で確かめるか
1行の例 「パスワードの文字数の上限と下限」 「パスワード=65文字 → エラーが表示され、登録されない」
粒度 粗い(1観点から複数のケースができる) 細かい(そのまま実行できる)
抜けたときの影響 その観点のケースがまるごと無くなる 1ケースが足りない
見直しやすさ 行数が少なく、全体を見渡せる 行数が多く、抜けに気づきにくい

観点の抜けは、ケースをいくら丁寧に作っても埋まりません。 だから観点を先に出させ、人が見てからケースに進みます。

条件 進め方
仕様が文章で1ページ以上ある 4段階すべてを順に行う
入力項目が1〜2個の小さな仕様 段階1を省き、技法を指定して段階2・3を1回で頼む
すでに人が作ったケース表がある 段階4(抜けの点検)だけを使う
仕様書が無く、画面や口頭の説明だけ 段階0(聞き返し)から始める

題材:架空の会員登録フォームの仕様

以降のプロンプトと記入例は、次の架空の仕様を使います。仕様には箇所の番号(S1〜S8)を振っておきます。 番号があると、ケースごとに根拠を書かせることができます。

【会員登録フォーム 仕様】
S1 ニックネーム:必須。1文字以上20文字以内。
S2 メールアドレス:必須。254文字以内。メールアドレスの形式であること。
   すでに本登録されているメールアドレスは登録できない。
S3 パスワード:必須。8文字以上64文字以内。英字と数字をそれぞれ1文字以上含む。
S4 年齢:必須。18以上120以下の整数。
S5 お知らせメールの受け取り:任意のチェックボックス。初期値はオフ。
S6 利用規約への同意:必須のチェックボックス。
S7 登録ボタンを押すと仮登録になり、確認メールを送る。
   確認メールのリンクを24時間以内に開くと本登録になる。
   24時間を超えると期限切れになり、再送を依頼すると仮登録に戻る。
S8 入力エラーが1つでもあれば登録しない。エラーは該当するものをすべて表示する。

段階0:仕様が足りないときに先に聞き返させるプロンプト

仕様書が無い、または断片しか無いときは、ケースを作らせる前に質問を出させます。聞き返しを指示しておかないと、足りない部分がもっともらしい値で埋まった表が出てきて、どこが推測なのかが分からなくなります。

あなたはテスト設計の担当者です。
これから渡す仕様をもとに、あとでテストケースを作ります。
ただし、この時点ではテストケースを作らないでください。

まず、テストケースを作るうえで仕様に足りない情報を、質問の形で挙げてください。

# 質問を挙げる観点
- 入力項目ごとの必須・任意、型、最小と最大、使える文字の種類
- 前後の空白、全角と半角、大文字と小文字の扱い
- エラーのときの表示内容と、表示する順序や件数
- 複数の条件が同時に当てはまるときの優先順位
- 状態(登録前、仮登録、本登録など)と、状態ごとにできる操作
- 同じ操作を続けて2回行ったときの扱い
- 時間に関する条件の境目(ちょうど24時間は含むか、など)

# 出力形式
タブ区切りで、1行目は見出し。列は次の3つ。
質問ID    質問  関係する仕様の箇所

# 守ること
- 仕様に書かれていることは質問しない。
- 推測で答えを補わない。
- 質問は重要なものから並べ、20個以内にする。

# 仕様
【ここに仕様を貼る】

段階1:観点を洗い出させるプロンプト

あなたはテスト設計の担当者です。
次の仕様について、テスト観点を洗い出してください。
この時点では、具体的な入力値やテストケースは書かないでください。

# 観点の出し方
- 仕様の箇所(S1、S2…)を1つずつ読み、確かめるべきことを観点として挙げる。
- 1つの観点には1つのことだけを書く(「文字数と文字種」のようにまとめない)。
- 観点ごとに、使う技法を次から1つ選ぶ。
  同値分割/境界値/デシジョンテーブル/状態遷移/異常系
- 仕様に書かれていないが確かめたほうがよい観点は、
  「根拠となる仕様の箇所」を「記載なし」として挙げる。

# 出力形式
タブ区切りで、1行目は見出し。列は次の4つ。
観点ID    観点  技法  根拠となる仕様の箇所

# 仕様
【ここに仕様を貼る】

出力形式の指定に対応する観点表の記入例です(人が書いた見本)。

観点ID 観点 技法 根拠となる仕様の箇所
V01 ニックネームの文字数 境界値 S1
V02 メールアドレスの長さ 境界値 S2
V03 メールアドレスの形式 同値分割 S2
V04 パスワードの文字数 境界値 S3
V05 パスワードの文字種 同値分割 S3
V06 年齢の範囲 境界値 S4
V07 年齢の形式(全角、小数、符号) 異常系 記載なし
V08 入力・重複・同意の組み合わせ デシジョンテーブル S2、S6、S8
V09 会員状態の遷移 状態遷移 S7
V10 登録ボタンの二重送信 異常系 記載なし

この段階で人が見るのは、「S1〜S8 のすべてに観点が付いているか」と「記載なしの観点を採用するか」の2点です。S5(お知らせメールの受け取り)に観点が無いことに、ここで気づけます。

段階2:技法を指定するプロンプト(5種類)

観点表ができたら、技法ごとにプロンプトを分けて頼みます。どのプロンプトも、末尾に仕様と、その技法を割り当てた観点を貼ります。

同値分割

次の仕様と観点について、同値分割でテストの入力を設計してください。

# 手順
1. 観点ごとに、有効同値クラス(受け付ける入力のまとまり)と
   無効同値クラス(受け付けない入力のまとまり)をすべて挙げる。
2. 各クラスから代表値を1つ選ぶ。境界の値は選ばず、クラスの中ほどの値にする。
3. 無効同値クラスは、1つのケースに1つだけ入れる
   (複数の無効な値を同時に入れない)。

# 出力形式
タブ区切りで、1行目は見出し。列は次の5つ。
観点ID    同値クラス   有効/無効   代表値 根拠となる仕様の箇所

# 守ること
- 仕様に無い条件を足さない。判断できないものは代表値を「仕様に記載なし」とする。

# 仕様
【ここに仕様を貼る】

# 観点
【段階1の観点表から、技法が同値分割の行を貼る】

境界値

次の仕様と観点について、境界値分析でテストの入力を設計してください。

# 手順
1. 観点ごとに、範囲の最小と最大を仕様から抜き出す。
2. 2値境界値で値を挙げる。
   最小の側:最小−1、最小
   最大の側:最大、最大+1
3. 片側しか境界が無い項目(上限だけ、など)は、ある側だけを挙げる。
4. 文字数の境界は、何文字かを数字で書く(「長い文字列」と書かない)。

# 出力形式
タブ区切りで、1行目は見出し。列は次の5つ。
観点ID    境界  値   有効/無効   根拠となる仕様の箇所

最後に、観点ごとの個数と合計を1行ずつ書く。

# 守ること
- 「以上」「以下」「未満」「より大きい」を仕様の言葉どおりに読む。
  読み方が2通りある場合は、値を決めずに質問として書く。

# 仕様
【ここに仕様を貼る】

# 観点
【段階1の観点表から、技法が境界値の行を貼る】

3値境界値にしたいときは、手順2を「最小−1、最小、最小+1/最大−1、最大、最大+1」に書き換えます。

デシジョンテーブル

次の仕様について、デシジョンテーブルを作ってください。

# 手順
1. 結果を左右する条件を挙げる。条件は Y/N で答えられる形にする。
2. 起こりうる結果(動作)を挙げる。
3. 条件の Y/N のすべての組み合わせを規則として並べる
   (条件が n 個なら 2 の n 乗個)。まとめずに全部書く。
4. 規則ごとに、起こる結果に X を付ける。
5. 仕様から結果を決められない規則は、結果を「仕様に記載なし」とする。

# 出力形式
タブ区切りで、1行目は見出し。
1列目は条件または結果の名前、2列目以降は規則1、規則2…。
条件の行を先に、結果の行を後に並べる。

# 条件として使うもの
【例:入力がすべて有効/メールアドレスが未登録/利用規約に同意】

# 仕様
【ここに仕様を貼る】

題材の仕様で、条件を3つにしたときの表の記入例です(人が書いた見本)。

規則1 規則2 規則3 規則4 規則5 規則6 規則7 規則8
入力がすべて有効 Y Y Y Y N N N N
メールアドレスが未登録 Y N Y N Y N Y N
利用規約に同意 Y Y N N Y Y N N
仮登録になり確認メールを送る X
項目のエラーを表示 X X X X
登録済みのエラーを表示 X X X X
同意のエラーを表示 X X X X

状態遷移

次の仕様について、状態遷移表を作ってください。

# 手順
1. 仕様に出てくる状態をすべて挙げる。
2. 状態を変えるきっかけ(イベント)をすべて挙げる。
3. 状態を行、イベントを列にした表を作り、すべてのマスを埋める。
   - 仕様に遷移が書かれているマス:遷移先の状態を書く。
   - 仕様で「できない」と書かれているマス:「不可」と書く。
   - 仕様に何も書かれていないマス:「記載なし」と書く。空欄にしない。

# 出力形式
タブ区切りで、1行目は見出し(1列目は「状態」、2列目以降はイベント名)。

最後に、「記載なし」のマスを 状態・イベント の組で一覧にする。

# 仕様
【ここに仕様を貼る】

題材の仕様での記入例です(人が書いた見本)。

状態 登録する リンクを開く 24時間たつ 再送を依頼する
未登録 仮登録 記載なし 記載なし 記載なし
仮登録 記載なし 本登録 期限切れ 記載なし
期限切れ 記載なし 期限切れ(案内を表示) 記載なし 仮登録
本登録 不可(登録済みのエラー) 記載なし 記載なし 記載なし

「記載なし」のマスが、そのまま仕様への質問になります。たとえば「仮登録のまま、同じメールアドレスでもう一度登録するとどうなるか」は、S7 からは決まりません。

異常系

異常系は、同値分割や境界値のような手順の決まった技法というより、仕様に書かれにくい入力と操作を、観点の一覧から拾うやり方です。一覧を渡して、当てはまるものだけを選ばせます。

次の仕様について、異常系のテスト観点を挙げてください。

# 観点の一覧(当てはまるものだけを使う)
- 空、空白だけ、前後に空白がある
- 全角と半角、大文字と小文字の混在
- 記号、絵文字、改行を含む
- 数値の欄に、小数、負の数、先頭に0が付いた数、文字を入れる
- 極端に長い入力
- 同じ操作を続けて2回行う、ボタンを連打する
- 途中で前の画面に戻る、再読み込みする
- 期限のあるものを、期限ちょうど・期限の直後に操作する
- 順序を入れ替えて操作する(先に後の手順を行う)

# 出力形式
タブ区切りで、1行目は見出し。列は次の5つ。
観点ID    対象の項目または操作  入力・操作   期待結果    根拠となる仕様の箇所

# 守ること
- 期待結果が仕様から決まらない場合は、期待結果を「仕様に記載なし」とし、
  推測で埋めない。
- 仕様の対象でない観点(この画面に無い項目など)は挙げない。

# 仕様
【ここに仕様を貼る】

段階3:テストケース表にするプロンプト(タブ区切り・7列固定)

段階2で出た値・規則・遷移を、実行できるテストケースにまとめます。列をここで固定します。

列 中身 書き方
ID 通し番号 TC-001 の形
観点 段階1の観点 観点表の言葉をそのまま使う
技法 5種類のいずれか 1ケースに1つ
前提 操作の前の状態 「登録画面を開いている」「仮登録の状態」など
入力 入力値と操作 文字数は数字で書く。触れない項目は「他の項目は有効値」
期待結果 確かめる結果 表示される文言と、登録の有無
根拠となる仕様の箇所 S1 などの番号 無ければ「記載なし」
次の仕様と設計結果をもとに、テストケース表を作ってください。

# 出力形式
- タブ区切りのテキストで出力する。表計算ソフトにそのまま貼り付ける。
- 1行目は見出し。列は次の7つで、順序と名前を変えない。
ID  観点  技法  前提  入力  期待結果    根拠となる仕様の箇所
- セルの中でタブと改行を使わない。
- コードブロックの中に、表だけを出力する。説明文は付けない。

# 書き方
- ID は TC-001 からの通し番号。
- 1つのケースで確かめることは1つ。無効な値は1ケースに1つだけ入れる。
- 入力は、文字数や数値を具体的に書く(「長い文字列」と書かない)。
  注目していない項目は「他の項目は有効値」と書く。
- 期待結果は、表示される文言と、登録されるかどうかを書く。
- 仕様から期待結果が決まらない場合は「仕様に記載なし」と書き、推測で埋めない。
- 根拠となる仕様の箇所には、S1 などの番号を書く。

# 仕様
【ここに仕様を貼る】

# 設計結果
【段階2で出た同値クラス、境界値、デシジョンテーブル、状態遷移表、異常系の観点を貼る】

記入例(会員登録フォーム・26ケース)

題材の仕様で書いたテストケース表の記入例です(人が書いた見本)。次のコードブロックをコピーして表計算ソフトのセルに貼ると、7列に分かれます。

ID  観点  技法  前提  入力  期待結果    根拠となる仕様の箇所
TC-001  ニックネームの文字数  同値分割    登録画面を開いている  ニックネーム=10文字、他の項目は有効値    仮登録になり、確認メールが送られる   S1
TC-002  ニックネームの文字数  境界値 登録画面を開いている  ニックネーム=0文字(空)   「ニックネームを入力してください」と表示され、登録されない   S1
TC-003  ニックネームの文字数  境界値 登録画面を開いている  ニックネーム=1文字  仮登録になる  S1
TC-004  ニックネームの文字数  境界値 登録画面を開いている  ニックネーム=20文字 仮登録になる  S1
TC-005  ニックネームの文字数  境界値 登録画面を開いている  ニックネーム=21文字 「20文字以内で入力してください」と表示され、登録されない   S1
TC-006  パスワードの文字数   境界値 登録画面を開いている  パスワード=7文字(英字と数字を含む) 「8文字以上で入力してください」と表示され、登録されない    S3
TC-007  パスワードの文字数   境界値 登録画面を開いている  パスワード=8文字(英字と数字を含む) 仮登録になる  S3
TC-008  パスワードの文字数   境界値 登録画面を開いている  パスワード=64文字(英字と数字を含む)    仮登録になる  S3
TC-009  パスワードの文字数   境界値 登録画面を開いている  パスワード=65文字(英字と数字を含む)    「64文字以内で入力してください」と表示され、登録されない   S3
TC-010  パスワードの文字種   同値分割    登録画面を開いている  パスワード=英字のみ8文字   「英字と数字をそれぞれ1文字以上含めてください」と表示され、登録されない    S3
TC-011  パスワードの文字種   同値分割    登録画面を開いている  パスワード=数字のみ8文字   「英字と数字をそれぞれ1文字以上含めてください」と表示され、登録されない    S3
TC-012  年齢の範囲   境界値 登録画面を開いている  年齢=17   「18以上120以下で入力してください」と表示され、登録されない    S4
TC-013  年齢の範囲   境界値 登録画面を開いている  年齢=18   仮登録になる  S4
TC-014  年齢の範囲   境界値 登録画面を開いている  年齢=120  仮登録になる  S4
TC-015  年齢の範囲   境界値 登録画面を開いている  年齢=121  「18以上120以下で入力してください」と表示され、登録されない    S4
TC-016  年齢の形式   異常系 登録画面を開いている  年齢=全角数字「20」 仕様に記載なし(質問Q1)   S4
TC-017  メールアドレスの長さ  境界値 登録画面を開いている  メールアドレス=254文字(形式は正しい)   仮登録になる  S2
TC-018  メールアドレスの長さ  境界値 登録画面を開いている  メールアドレス=255文字(形式は正しい)   「254文字以内で入力してください」と表示され、登録されない  S2
TC-019  メールアドレスの形式  同値分割    登録画面を開いている  メールアドレス=@を含まない文字列   「メールアドレスの形式で入力してください」と表示され、登録されない   S2
TC-020  入力・重複・同意の組み合わせ  デシジョンテーブル   同じメールアドレスの本登録会員がいる  全項目有効、登録済みのメールアドレス、規約に同意    「このメールアドレスは登録済みです」と表示され、登録されない  S2、S8(規則2)
TC-021  入力・重複・同意の組み合わせ  デシジョンテーブル   登録画面を開いている  全項目有効、未登録のメールアドレス、規約に同意しない  「利用規約への同意が必要です」と表示され、登録されない S6、S8(規則3)
TC-022  会員状態の遷移 状態遷移    仮登録の状態  確認メールのリンクを24時間以内に開く 本登録になる  S7
TC-023  会員状態の遷移 状態遷移    仮登録から24時間を超えた(期限切れ) 確認メールのリンクを開く    「リンクの有効期限が切れています」と表示され、再送の案内が出る S7
TC-024  会員状態の遷移 状態遷移    期限切れの状態 確認メールの再送を依頼する   仮登録に戻り、新しい確認メールが送られる    S7
TC-025  会員状態の遷移 状態遷移    本登録の状態  以前の確認メールのリンクをもう一度開く 仕様に記載なし(質問Q2)   S7
TC-026  二重送信    異常系 登録画面で有効値を入力済み   登録ボタンを続けて2回押す   仕様に記載なし(質問Q3)   S7

先頭の数行を Markdown の表にすると、次の見た目です。

ID 観点 技法 前提 入力 期待結果 根拠となる仕様の箇所
TC-002 ニックネームの文字数 境界値 登録画面を開いている ニックネーム=0文字(空) 「ニックネームを入力してください」と表示され、登録されない S1
TC-005 ニックネームの文字数 境界値 登録画面を開いている ニックネーム=21文字 「20文字以内で入力してください」と表示され、登録されない S1
TC-016 年齢の形式 異常系 登録画面を開いている 年齢=全角数字「20」 仕様に記載なし(質問Q1) S4
TC-022 会員状態の遷移 状態遷移 仮登録の状態 確認メールのリンクを24時間以内に開く 本登録になる S7

エラーの文言は、この見本のために置いた例です。実際の画面の文言は、仕様書かメッセージ一覧から取ります。

段階4:抜けを点検する

境界値の個数を Python で検算する

境界値は、仕様から個数を先に計算できます。AIが出した個数と合わなければ、どこかが抜けているか、余分があります。

from itertools import product

# 範囲のある項目:(項目名, 最小, 最大)。None は「その側の境界なし」
fields = [
    ("ニックネームの文字数", 1, 20),
    ("パスワードの文字数", 8, 64),
    ("年齢", 18, 120),
    ("メールアドレスの文字数", None, 254),
]


def boundaries(lo, hi, three_value=False):
    values = []
    if lo is not None:
        values += [lo - 1, lo] + ([lo + 1] if three_value else [])
    if hi is not None:
        values += ([hi - 1] if three_value else []) + [hi, hi + 1]
    return values


for label, three in [("2値", False), ("3値", True)]:
    total = 0
    print(f"[{label}境界値]")
    for name, lo, hi in fields:
        v = boundaries(lo, hi, three)
        total += len(v)
        print(f"  {name}: {v} -> {len(v)}個")
    print(f"  合計 {total}個")

# デシジョンテーブル:条件3つ(入力がすべて有効/メールアドレスが未登録/規約に同意)
rules = list(product("YN", repeat=3))
print(f"\n[デシジョンテーブル] 条件3つ -> 規則 {len(rules)}個")

# 状態遷移:状態4つ × イベント4つ のうち、仕様に書かれた遷移
states = ["未登録", "仮登録", "期限切れ", "本登録"]
events = ["登録する", "リンクを開く", "24時間たつ", "再送を依頼する"]
defined = {
    ("未登録", "登録する"): "仮登録",
    ("仮登録", "リンクを開く"): "本登録",
    ("仮登録", "24時間たつ"): "期限切れ",
    ("期限切れ", "リンクを開く"): "期限切れ",
    ("期限切れ", "再送を依頼する"): "仮登録",
}
cells = len(states) * len(events)
print(f"[状態遷移] {len(states)}状態 × {len(events)}イベント = {cells}マス、"
      f"仕様にある遷移 {len(defined)}個、残り {cells - len(defined)}マスは要確認")
$ python3 boundary_count.py
[2値境界値]
  ニックネームの文字数: [0, 1, 20, 21] -> 4個
  パスワードの文字数: [7, 8, 64, 65] -> 4個
  年齢: [17, 18, 120, 121] -> 4個
  メールアドレスの文字数: [254, 255] -> 2個
  合計 14個
[3値境界値]
  ニックネームの文字数: [0, 1, 2, 19, 20, 21] -> 6個
  パスワードの文字数: [7, 8, 9, 63, 64, 65] -> 6個
  年齢: [17, 18, 19, 119, 120, 121] -> 6個
  メールアドレスの文字数: [253, 254, 255] -> 3個
  合計 21個

[デシジョンテーブル] 条件3つ -> 規則 8個
[状態遷移] 4状態 × 4イベント = 16マス、仕様にある遷移 5個、残り 11マスは要確認

2値境界値は合計14個です。記入例の表で技法が「境界値」の行を数えると14行で、一致します。3値にすると21個に増えます。デシジョンテーブルは条件3つで規則8個、状態遷移は16マスのうち仕様に書かれた遷移が5個で、残りの11マスは「できない」のか「書かれていない」のかを確かめる対象です。

表を機械で点検するスクリプト

タブ区切りにそろえておくと、列数・IDの重複・根拠の空欄・境界値の抜けをスクリプトで確かめられます。REQUIRED には、上の検算で出した境界値を人が書いておきます。

import csv
import sys

COLUMNS = ["ID", "観点", "技法", "前提", "入力", "期待結果", "根拠となる仕様の箇所"]

# 入力欄に必ず現れてほしい境界値(2値境界値)。仕様から人が書く
REQUIRED = {
    "ニックネーム": ["0文字", "1文字", "20文字", "21文字"],
    "パスワード": ["7文字", "8文字", "64文字", "65文字"],
    "年齢": ["=17", "=18", "=120", "=121"],
    "メールアドレス": ["254文字", "255文字"],
}

with open(sys.argv[1], encoding="utf-8", newline="") as f:
    rows = list(csv.reader(f, delimiter="\t"))

header, body = rows[0], rows[1:]
problems = []

if header != COLUMNS:
    problems.append(f"列が違う: {header}")
for n, r in enumerate(body, start=2):
    if len(r) != len(COLUMNS):
        problems.append(f"{n}行目: 列数が {len(r)}({len(COLUMNS)} のはず)")
    elif not r[6].strip():
        problems.append(f"{n}行目 {r[0]}: 根拠となる仕様の箇所が空")

ids = [r[0] for r in body]
for dup in sorted({i for i in ids if ids.count(i) > 1}):
    problems.append(f"ID の重複: {dup}")

for field, values in REQUIRED.items():
    inputs = [r[4] for r in body if len(r) == len(COLUMNS) and r[4].startswith(field)]
    for v in values:
        if not any(v in s for s in inputs):
            problems.append(f"境界値の抜け: {field} {v.lstrip('=')}")

by_tech = {}
for r in body:
    if len(r) == len(COLUMNS):
        by_tech[r[2]] = by_tech.get(r[2], 0) + 1
no_spec = [r[0] for r in body if len(r) == len(COLUMNS) and "仕様に記載なし" in r[5]]

print(f"ケース数: {len(body)}")
print("技法別:", "、".join(f"{k} {v}" for k, v in by_tech.items()))
print("期待結果が「仕様に記載なし」:", "、".join(no_spec) or "なし")
print("点検結果:", "問題なし" if not problems else f"{len(problems)}件")
for p in problems:
    print("  -", p)

記入例の表(cases.tsv)にかけた結果です。

$ python3 check_cases.py cases.tsv
ケース数: 26
技法別: 同値分割 4、境界値 14、異常系 2、デシジョンテーブル 2、状態遷移 4
期待結果が「仕様に記載なし」: TC-016、TC-025、TC-026
点検結果: 問題なし

次に、記入例から2行を消し、1か所の根拠を空にした下書き(cases_draft.tsv)にかけます。

$ python3 check_cases.py cases_draft.tsv
ケース数: 24
技法別: 同値分割 4、境界値 12、異常系 2、デシジョンテーブル 2、状態遷移 4
期待結果が「仕様に記載なし」: TC-016、TC-025、TC-026
点検結果: 3件
  - 20行目 TC-021: 根拠となる仕様の箇所が空
  - 境界値の抜け: パスワード 65文字
  - 境界値の抜け: 年齢 17

消した2行(パスワード65文字、年齢17)と、根拠の空欄が見つかりました。個数が先に分かる技法は、このように数で抜けを確かめられます。

AIに点検させるプロンプト

数で確かめられない抜け(観点そのものの不足、期待結果の読み違い)は、仕様とケース表を渡して点検させます。作らせたときとは別の会話で頼むと、前の流れに引きずられにくくなります。

あなたはテスト設計のレビュー担当者です。
次の仕様とテストケース表を照らし合わせ、不足と誤りを指摘してください。
新しいテストケースは、指摘のあとに追加分だけを出してください。

# 点検すること
1. 仕様の箇所(S1、S2…)ごとに、対応するケースがあるか。
   ケースが1つも無い箇所を挙げる。
2. 境界値:範囲ごとに、最小−1、最小、最大、最大+1 がそろっているか。
3. 同値分割:有効・無効の各クラスに代表値が1つずつあるか。
4. デシジョンテーブル:条件の組み合わせで、ケースになっていない規則はどれか。
5. 状態遷移:状態とイベントの組で、ケースになっていないものはどれか。
6. 期待結果が仕様と食い違っているケースはどれか。仕様の該当箇所を引用して示す。
7. 根拠となる仕様の箇所が空、または仕様に無い番号のケースはどれか。
8. 同じことを確かめている重複したケースはどれか。

# 出力形式
タブ区切りで、1行目は見出し。列は次の4つ。
指摘ID    種類(不足/食い違い/根拠なし/重複) 対象(ケースIDまたは仕様の箇所)   内容

そのあとに、追加するケースを、元の表と同じ7列のタブ区切りで出力する。
ID は元の表の続きの番号にする。

# 守ること
- 指摘が無い項目は「指摘なし」と書く。無理に指摘を作らない。
- 仕様に書かれていないことを、誤りとして指摘しない(質問として挙げる)。

# 仕様
【ここに仕様を貼る】

# テストケース表
【ここにタブ区切りの表を貼る】

人が最後に確かめること

確かめること 見方
期待結果が仕様どおりか 根拠の列の番号をたどり、仕様の文と見比べる
「以上・以下・未満」の読み方 境界値の有効/無効が、仕様の言葉と合っているか
「仕様に記載なし」の行 質問として仕様の持ち主に渡し、答えをもらってから期待結果を埋める
仕様に無い条件が足されていないか 根拠が「記載なし」の行を、採用するか決める
仕様の箇所ごとにケースがあるか 箇所ごとの件数を数え、0件の箇所を見る

記入例の表には、わざと抜けを1つ残してあります。境界値の個数は合っていても、仕様の箇所ごとに件数を数えないと、任意項目の S5(お知らせメールの受け取り)が抜けていることには気づけません。 段階4のプロンプトの点検1が、この種の抜けを拾うための項目です。

似た使い方との違いと選び方

使い方 出すもの 向く場面
テスト設計の文書を作る(この記事) 観点表とテストケース表(人が読んで実行・レビューする文書) 手動テスト、受け入れの確認、テスト仕様書の下書き
テストコードを作る 自動で実行できるコード 単体テスト、API の自動テスト
テスト技法そのものを学ぶ 同値分割や境界値の考え方 技法の意味や、2値と3値の違いを知りたいとき
条件 選ぶもの
人が画面を操作して確かめる テストケース表(この記事のプロンプト)
同じ確認を何度も自動で回したい ケース表を確定させてから、テストコード化
出てきた境界値が正しいか判断できない 先に技法を学ぶ

確かめて分かったこと

検算とスクリプトの実行で確かめられた点です。

  • 2値境界値の個数は、範囲のある項目3つ+上限だけの項目1つで 4×3+2=14個でした。記入例の境界値の行数(14)と一致します。3値にすると21個で、7個増えます。
  • 上限だけの項目(メールアドレスの長さ)は、境界値が4個ではなく2個です。「範囲1つにつき4個」と機械的に数えると、合計が2個ずれます。下限は「必須かどうか」という別の観点になります。
  • 状態遷移は、仕様に書かれた遷移が5個に対し、マスは16個ありました。残り11マスは、できないのか書かれていないのかを1つずつ確かめる対象で、表にして初めて数えられます。
  • タブ区切りにそろえておくと、列数・ID の重複・根拠の空欄・境界値の抜けを50行ほどのスクリプトで点検できました。 2行を消した下書きから、消した2つの値がそのまま検出されています。
  • 個数の点検だけでは、観点そのものの抜け(S5 のケースが0件)は見つかりません。 仕様の箇所ごとの件数を見る点検が別に要ります。
  • 期待結果を「仕様に記載なし」と書かせた行が、記入例では3件ありました。この3件が、そのまま仕様への質問の一覧になります。

よくある質問

Q. 生成AIにテストケースを作らせるとき、プロンプトには何を書けばよいですか? A. 仕様、使う技法の名前、出力する列の3つを書きます。技法は「同値分割で」「境界値で」と名前を挙げ、列はID・観点・技法・前提・入力・期待結果・根拠となる仕様の箇所のように固定します。仕様に無いことは「仕様に記載なし」と書くよう指示しておきます。

Q. テスト観点の洗い出しとテストケース作成の違いは何ですか? A. 観点の洗い出しは「何を確かめるか」を並べる作業、テストケース作成は「どの値と手順で確かめるか」を決める作業です。観点を先に出して人が見ておくと、ケースを作ったあとで観点の抜けに気づく手戻りが減ります。

Q. 仕様書が無いときは、どう頼めばよいですか? A. テストケースを作らせる前に、足りない情報を質問として挙げさせます。分かっている範囲の説明を渡し、「この時点ではテストケースを作らない」「推測で補わない」と指示します。質問に答えた内容を仕様として番号を振り、そこから観点の洗い出しに進みます。

Q. AIが作ったテストケースに抜けが無いかは、どう確かめればよいですか? A. 個数が計算できる技法は数で確かめ、それ以外は仕様の箇所ごとの件数と期待結果を人が見ます。境界値は範囲から個数が決まり、デシジョンテーブルは条件の数から規則の数が決まります。表をタブ区切りにしておくと、スクリプトでも点検できます。

Q. 表計算ソフトに貼れる形で出力させるには、どうすればよいですか? A. 「タブ区切りのテキストで、コードブロックの中に表だけを出力する」と指示します。セルの中でタブと改行を使わないことも書いておくと、貼り付けたときに列がずれません。

まとめ

  • 4段階に分ける:観点の洗い出し → 技法の指定 → ケース化 → 抜けの点検。
  • 観点とケースは別のもの。 観点の抜けは、ケースを丁寧に作っても埋まらない。
  • 技法は名前を挙げて1つずつ頼む。 同値分割、境界値、デシジョンテーブル、状態遷移、異常系の5種類。
  • 出力は7列のタブ区切りに固定し、根拠となる仕様の箇所を必ず書かせる。
  • 仕様に無いことは「仕様に記載なし」と書かせる。 仕様が足りないときは、先に聞き返させる。
  • 個数は先に計算できる。 2値境界値は範囲1つにつき4個、片側だけなら2個。合わなければ抜けか余分がある。
  • 期待結果の正しさと、仕様の箇所ごとの件数は人が確かめる。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「生成AIでテストケースを作るプロンプト集|同値分割・境界値対応」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?