- AI ⚙️
生成AIでテストケースを作るプロンプト集|同値分割・境界値対応
生成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期連続の黒字決算。