再現手順の書き方:5 つの例とチェックリスト(2026)

「再現できません」はほぼ必ず手順の問題です

良い再現手順 = 明確な開始点 + 1 ステップ 1 アクション + 実際のデータ + 各ステップでの観察結果。 誰かが声に出して読んで同じ画面にたどり着けるなら、その手順は十分です。以下では 5 つのルール、粒度の判定基準、5 つの完全な例(断続的なバグの書き方を含む)、送信前のチェックリストを紹介します。

開発者が「再現できません」と返すのは、たいてい意欲の問題ではありません。手順に何かが欠けていて、それは多くの場合この 3 つのどれかです。

  • 開始点が書かれていない:前提条件の記載がありません。あなたは法人アカウント、開発者は個人アカウント — 別々のコードパスを通っています。
  • アクションがまとめられている:「フォームに入力して送信」という 1 ステップでも、不具合は入力と送信の間の自動保存で起きています。
  • データが書かれていない:「メールアドレスを入力」のようなプレースホルダー記述 — そして不具合はメールに + が含まれるときだけ発生します。
  • 一言でいえば、手順はあなたのための記録ではなく、他人のためのルートです。

    機能する手順の 5 つのルール

  • 開始点を明示する:ログイン状態、データ状態、入口 URL は前提条件に書き、ステップ 1 に押し込みません。
  • 1 ステップ 1 アクション:各番号はちょうど 1 つのことだけを行い、読み手が 1 つずつ確認できるようにします。
  • 実際のデータを使う:user+test@x.com と書き、「あるメールアドレス」とは書きません。
  • 観察したことを書く(推奨):重要なステップの後に「この時点で画面は X と表示」と添えると、どこから逸脱したかが分かります。
  • 環境は環境フィールドに、または先頭行に宣言する:ブラウザ、OS、端末、ビューポート幅 — 1 つ欠けるだけで再現に失敗することがあります。
  • 手順はどこまで細かく書くべきか

    粒度 例 問題
    粗すぎる 「チェックアウトを開いて商品を削除したら件数が違う」 3 つの操作を 1 文に圧縮。どこで壊れるか分かりません
    ちょうどよい 「1. /cart を開く 2. 商品の右の[削除]をクリック 3. ページ上部のバッジを見る」 1 ステップ 1 アクションで、それぞれ検証可能
    細かすぎる 「1. ポインタをボタンに移動 2. 左ボタンを押す 3. 離す」 物理操作まで分解すると、むしろ読みにくくなります

    判定基準:書き終えたら 2 つ自問します。① 他人が私のスクリーンショットを見なくても同じ画面に到達できるか。② 開発者が 2 分以内にフロントエンドか API かデータかを判断できるか。どちらも「はい」なら粒度は適切です。

    5 つの完全な例

    例 1:ログインと認証(5 ステップ)

    前提条件:アカウント test@example.com が登録済みで正常な状態。 環境:Chrome 120 / macOS 14 / デスクトップ / 1920×1080 / シークレットウィンドウ。

  • https://app.example.com/login を開く
  • メールアドレス test@example.com と正しいパスワードを入力する
  • 誤った画像認証コードを 3 回連続で入力する
  • 4 回目に正しい認証コードを入力し、[ログイン]をクリックする
  • 表示されたメッセージを確認する
  • 期待:「認証コードが正しくありません。再試行してください」と表示され、アカウントはロックされない。 実際:認証コードが正しいにもかかわらず「アカウントをロックしました。24 時間後に再試行してください」と表示される。

    例 2:決済とクーポン(6 ステップ)

    前提条件:カートに商品が 2 点、合計 ¥1,299。アカウントは法人タイプ。 環境:Chrome 120 / Windows 11 / デスクトップ / 1440×900 / 法人アカウント。

  • /cart を開き、合計が ¥1,299 であることを確認する
  • [レジに進む]をクリックする
  • クーポン欄に SAVE100 を入力する(3 日前に期限切れ)
  • [適用]をクリックする
  • ページ上部の通知とカートの状態を確認する
  • ページを再読み込みして再度確認する
  • 期待:「クーポンの有効期限が切れています」と表示され、カートは変化しない。 実際:「クーポンを適用しました」と表示して ¥100 を割引。[適用]を押した瞬間にカートの商品 2 点が消える。

    例 3:モバイルのタッチ操作(5 ステップ)

    前提条件:ログイン済み、カートに商品が 1 点。 環境:iPhone 14 / iOS 17.2 / Safari / ビューポート 390×844。

  • https://shop.example.com/cart を開く
  • ページ下部の住所フォームまでスクロールする
  • [お届け先氏名]欄をタップしてキーボードを表示する
  • キーボードの上にある[注文を確定する]ボタンを確認する
  • そのボタンをタップしてみる
  • 期待:ボタンがキーボードの上に移動し、タップできる状態が保たれる。 実際:キーボードがボタンの約 60% を覆い、その領域をタップしても反応しない。

    例 4:API とデータ(4 ステップ)

    前提条件:テスト環境のトークンを取得済み。DB に注文が 12,400 件あり、キーワードに一致するのは 12 件。 環境:https://api-test.example.com / curl 8.x。

  • ヘッダー Authorization: Bearer <token> を付けて GET /api/orders/export?month=2026-08 を実行する
  • 応答を待つ
  • HTTP ステータスコードとレスポンスボディを確認する
  • month=2026-08-01~2026-08-07 に変えて再試行する
  • 期待:200 とエクスポートジョブ ID、またはキュー投入を示す 202 が返る。 実際:504(ゲートウェイタイムアウト)。期間を狭めると 200 が返るため、しきい値はデータ量に依存する。

    例 5:断続的なバグ(確率とタイミング付き)

    前提条件:アカウントの残高はゼロ。テストカードをテストユーザーに登録済み。 環境:Chrome 120 / macOS 14 / ネットワークを 3G に制限。

  • /checkout を開き、支払い情報を入力する
  • DevTools を開き、Network パネルを 3G 制限に設定する
  • [支払いを確定]を素早くダブルクリックする(クリック間隔は約 300ms)
  • 注文一覧と決済履歴を確認する
  • 期待:注文は 1 件だけ作成される。連打はクライアント側で重複排除されるか、API の冪等性でブロックされる。 実際:10 回中 3 回、注文が 2 件作成された(再現条件:間隔 500ms 未満かつネットワーク遅延 1 秒超)。Network パネルの録画と、2 回の POST /api/orders のリクエスト ID を添付。

    断続的なバグの書き方:

    • 「たまに」ではなく確率を書きます。「10 回中 3 回」のほうが 100 倍役に立ちます。
    • タイミングやしきい値を書きます。「間隔 500ms 未満」「遅延 1 秒超」——こうした条件は根本原因の手がかりになることが多いです。
    • 証拠の種類を書きます。断続的なバグが持ち帰れる唯一の恒久的な証拠は、画面録画とコンソールログです。

    手順を無効にする 7 つのミス

  • 「ホームページを開く」から始める:ナビゲーションは埋め草で、最初の 5 ステップはノイズです。
  • 1 ステップに複数の操作:「フォームを入力して送信」——失敗箇所を特定できません。
  • プレースホルダーの記述:「正しいユーザー名とパスワードを入力」。まさにその値が重要な変数です。
  • データの前提条件が抜けている:カートに何点あるか、アカウント種別、すでに返金済みかどうか。
  • 社内用語:「旧フローを通す」「プラン B のアカウントを使う」——外部の協力者には解読できません。
  • 期待結果を手順に混ぜる:「ステップ 3 でダイアログが表示されるはず」——それは独立したフィールドです。
  • 手順に推測を混ぜる:「ステップ 4 はキャッシュが古いためエラー」——推測は備考に移し「推定」と明記します。
  • 送信前チェックリスト

    • 前提条件(ログイン状態 + データ状態)を書いたか?
    • 最初のステップは「ブラウザを開く」ではなく業務操作か?
    • 各番号に操作は 1 つだけか?
    • プレースホルダーではなく実際の値か?
    • 重要なステップの後に観察結果を書いたか?
    • 期待結果と実際の結果を分けて書いたか?
    • 断続的なバグは確率とタイミングを書いたか?

    よくある質問(FAQ)

    再現手順は何ステップくらいが適切ですか?

    通常 3〜8 ステップです。3 未満は前提条件が不足していることが多く、8 を超える場合はたいてい短縮できます。ナビゲーション部分を前提条件に移し、問題を引き起こす操作だけを残してください。

    環境情報は手順に書きますか、専用フィールドに書きますか?

    専用フィールドです。手順に入れると読むリズムが崩れ、絞り込みもできません。環境フィールドがない形式(メールなど)の場合は、手順の先頭に 1 行で宣言します:「環境:Chrome 120 / macOS 14 / 1920×1080」。

    「戻るをクリック」「ダイアログを閉じる」のような無関係な操作も書くべきですか?

    再現条件の一部である場合だけ書きます。見分け方は、そのステップを削って問題が再現するかどうかです。再現するなら削除、しないなら必要です。

    自分でも再現できないバグの手順はどう書きますか?

    3 つを正直に書きます。① 試した条件(どの試行が成功し、どれが失敗したか)。② 手元にある最強の証拠(録画、コンソールログ、ネットワークリクエスト)。③ 気づいた相関(「回線が遅いときだけ」など)。必現であるかのように装わず、タイトルや備考に「再現条件は未確定」と明記してください。

    再現手順とテストケースの違いは何ですか?

    テストケースは事前に設計された検証リストで、正常系・境界・例外をカバーし、網羅性を狙います。再現手順は事後に記録された 1 本の経路で、問題を確実に再現することだけを目的とします。互いに参考になりますが目的は異なります — テストケースの書き方は テストケーステンプレートと例 をご覧ください。

    手順は人が書く。証拠は自動化できる

    手順はクリックした本人が書く必要があります — 何をしたか知っているのはあなただけです。ただし、一緒に提出する環境と証拠は自動で埋められます。

    • 画面録画:現在のタブをワンクリックで録画してトリミング。断続的なバグでも再生可能な証拠が残ります。
    • 診断データ:エラーレベルのコンソールログと失敗したネットワークリクエスト(HTTP 400 以上)を収集し、機密パラメータは自動でマスクします。
    • 技術情報の自動取得:URL、ブラウザ、OS、解像度、ビューポートを自動で記入します。
    • 注釈付きスクリーンショット:範囲を選んで矢印・枠・テキストを追加し、失敗箇所を画像に固定します。
    • 共有・同期:登録なしで開ける共有リンクを発行、または Feishu の多次元テーブルや汎用 Webhook へ送信できます。

    関連記事