Nexta Tech Blog
🚈

QAエンジニア、GeminiとペアQAでCSVインポート機能のテスト設計とデータ生成自動化を並走してみた🤝

に公開

こんにちは!QAエンジニアのAyakaです。

Webサービスを開発していると、多くの場面で登場する「CSVインポート機能」があります。
ユーザーが手元のデータを一括で登録できる便利な機能ですが、そのテストは組み合わせ多数で骨が折れますよね。

「どんなデータパターンを試せばいいんだろう?」「考慮漏れはないかな?」「何十パターンものテストデータ作成、時間がいくらあっても足りない…」

今回はこの厄介な課題に、生成AIであるGeminiとタッグを組んで挑んでみました。
本記事では、思考の整理から具体的なコード生成まで、Geminiと"ペアQA"を行ったプロセスを共有します。


Step 1: テスト観点の洗い出し - 思考の壁打ち相手としてのGemini

何事も、まずは計画からです。
闇雲にテストデータを作り始める前に、「どのような観点でテストを行うべきか」を洗い出す必要があります。

今回は、たとえ話として 「料理レシピサイトのレシピ一括登録機能」 をテストする、と仮定してみましょう。

最初に、私は自分の経験から以下の基本的な観点をリストアップしました。

  • 正常系:
    • 新しいレシピの登録(例:カレーライス)
    • 既存レシピの更新(例:カレーライスの調理時間を変更)
  • 異常系:
    • 必須項目である 「レシピ名」 が空
    • 数値項目である 「調理時間」 に文字列(例:"30分")が入っている

基本は押さえられていますが、本当にこれだけで良いでしょうか?ここで思考の壁打ち相手としてGeminiに登場してもらいます。


【プロンプト】

料理レシピのCSVインポート機能のテスト観点を洗い出しています。
現在、正常系(新規、更新)、異常系(必須エラー、型エラー)などを考えています。
QAエンジニアの視点で、他に考慮すべき観点があれば網羅的にリストアップしてください。


この問いに対して、Geminiは私の初期案を補強し、思考を深めるための観点をいくつか提示してくれました。

【Geminiからの提案の抜粋】

  • 💡 境界値テスト: 「レシピ名」の文字数制限ピッタリのデータや、「難易度」(1:簡単, 2:ふつう, 3:難しい)の各値をすべて試す観点
  • 💡 特殊なファイル形式: データが一切ない空ファイルや、ヘッダー行だけのファイルを取り込んだ際の挙動
  • 💡 システムのトランザクション: 複数件のレシピの中に1件でもエラーがあった場合に、全ての処理が取り消される(ロールバックされる)かどうかのテスト

これらのフィードバックのおかげで、自分一人では見落としていたかもしれないシステムの挙動に関わる重要なテスト観点を追加でき、テスト全体の網羅性を大きく向上させることができました。


Step 2: 具体的なテストケースへの落とし込み

観点が出揃ったら、次はそれらを具体的なテスト計画に落とし込みます。
洗い出した観点をベースに、「どんなファイルで、何を確認し、どうなればOKか」を定義したテストケース一覧を作成しました。

(※ここでは主要なケースを抜粋して紹介します)

No. 優先度 ファイル名 テストケースの目的 期待結果
1 01_normal_create.csv 【正常系】 新しいレシピの登録が成功すること 成功(登録)
2 02_normal_update.csv 【正常系】 既存レシピの更新が成功すること 成功(更新)
11 11_normal_boundary_name.csv 【境界値】 上限ピッタリの文字数のレシピ名で登録できること 成功(登録)
26 26_error_required_empty.csv 【異常系】 必須項目「レシピ名」が空の場合にエラーとなること 失敗(エラー)
27 27_error_type_mismatch.csv 【異常系】 「調理時間」に数値以外が入力された場合にエラーとなること 失敗(エラー)
51 ALL_CASES_COMBINED.csv 【トランザクション】 正常・異常データ混在時にロールバックされること 失敗(ロールバック)
52 empty_file.csv 【特殊ファイル】 空ファイル取込時に0件成功となること 成功(0件取込)

最終的に、テストケースは全部で53パターンになりました。
これを手作業で用意するのは、考えるだけで気が滅入ります。
そこで、次のステップはもちろん「自動化」です。


Step 3: データ生成の自動化 - Geminiとコードを紡ぐ

テストケースが決まれば、あとはそれに準じたテストデータ(CSVファイル)を生成するだけ。ここでもGeminiに協力してもらい、Pythonスクリプトの作成を進めます。

まず、スクリプトに実装してほしい要件を日本語で整理し、プロンプトとして渡しました。


【プロンプト】

Pythonで料理レシピのテストデータを生成するスクリプトを作成してください。
要件:

  1. ヘッダーは ['レシピID', 'レシピ名', '調理時間(分)', '難易度'] とします。
  2. 添付のテストケース一覧に基づいて、対応するCSVファイルをすべて生成してください。
  3. 生成されたファイルは test_csv_data フォルダに保存してください。
  4. コードには、処理内容がわかるようにコメントを追加してください。

このプロンプトを元に、Geminiは以下のスクリプトの骨子を生成してくれました。

create_recipe_test_data.py
import os
import csv
from pathlib import Path

# --- 設定 ---
OUTPUT_DIR = "test_csv_data"
HEADERS = ['レシピID', 'レシピ名', '調理時間(分)', '難易度']

# --- ヘルパー関数 ---

def get_base_data(recipe_name="基本のカレーライス"):
    """基本となる正常なレシピデータのひな形を返す関数。"""
    return {
        'レシピID': '',
        'レシピ名': recipe_name,
        '調理時間(分)': '30',
        '難易度': '2', # 1:簡単, 2:ふつう, 3:難しい
    }

def create_csv(filename, data_rows):
    """CSVファイルを書き出す共通関数。"""
    filepath = Path(OUTPUT_DIR) / filename
    with open(filepath, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=HEADERS)
        writer.writeheader()
        if data_rows:
            writer.writerows(data_rows)
    print(f"✅ Created: {filepath}")

# --- 各テストケースのデータ生成関数 ---

def case_01_normal_create():
    """正常系: 新規登録"""
    data = get_base_data("特製ハンバーグ")
    create_csv("01_normal_create.csv", [data])

def case_26_error_required_empty():
    """異常系: 必須項目(レシピ名)が空"""
    data = get_base_data()
    data['レシピ名'] = '' # ひな形の一部を書き換える
    create_csv("26_error_required_empty.csv", [data])

# ( ... 他のケース分の関数が続く ... )

def main():
    """全てのテストデータ生成を実行するメイン関数"""
    Path(OUTPUT_DIR).mkdir(exist_ok=True)
    # 各生成関数を呼び出す
    case_01_normal_create()
    case_26_error_required_empty()
    # ...

if __name__ == "__main__":
    main()

このスクリプトを実行すると、以下のようにテストに必要な全てのCSVファイルが一瞬で生成されます。
生成されたCSVファイル

特に、get_base_data関数のように、まず正常系のひな形データを用意し、各テストパターンではその差分だけを変更するというアプローチは、コードの可読性とメンテナンス性を高める上で非常に有効でした。
このような効率的な実装パターンを自然に提案してくれる点は、AIと並走する大きなメリットだと感じます。

このスクリプトを実行するだけで、数秒後には全てのテストファイルが完璧に用意された状態になりました。
手作業であれば数時間はかかっていたであろう作業です。


まとめ - "ペアQA"という新しい選択肢

今回、CSVインポート機能のテスト設計からデータ生成までを、Geminiと並走する形で進めてみました。

  • Step 1(観点洗い出し): 思考の壁打ち相手として、観点の漏れを防ぎ、テストの網羅性を高めることができた。
  • Step 3(自動化): 面倒なデータ生成作業を高品質なコードで一気に効率化できた。

AIを単なる「検索ツール」や「コード生成器」として使うだけでなく、思考のパートナーとして設計の上流工程から巻き込んでいくことで、品質保証のプロセスそのものがより効率的かつ創造的になる可能性を感じました。

皆さんも、日々の業務で向き合っている課題に、AIとの「並走」というアプローチを取り入れてみてはいかがでしょうか。
きっと新しい発見があるはずです。

Nexta Tech Blog
Nexta Tech Blog

Discussion