黒柴的ソフトウェアテスト考 #16

生成AIで、テスト項目を作成する(その2)

ソフトウェアテスト考#15の続きである。
今回は、Geminiに質問し、生成されたテストケースを確認していこうと思う。

Gemini自身に質問すると、バージョンは「Gemini 1.5 Pro」となっている。

Gemini 1.5 Proは、前モデルと比べて以下の点が強化されています。
処理能力の向上: 最大100万トークン(約1時間の動画、11時間の音声、70万単語のテキストに相当)のデータを処理できるようになり、複雑なタスクにも対応できるようになりました。
長いコンテキストの理解: 長文の文章や会話の内容をより深く理解できるようになり、より自然で人間らしい応答が可能になりました。
計算効率の向上: 処理能力を向上させながらも、計算リソースを削減することにより、より効率的な処理が可能になりました。

Gemini 1.5 Proは、現在一部の開発者や企業顧客向けにプレビュー版がリリースされていますが、今後一般公開される予定です。

今、回答しているGeminiのバージョンを教えてください

このバージョンがどの程度新しいのか不明だが、Geminiの回答によると最新のようだ。

次に、ChatGPTに質問した内容と同じものを質問してみた結果が、以下のようになる。
回答結果としては、Pythonによるテストコードも出力していたのだが、ここではテストケースがMECE(Mutually Exclusive and Collectively Exhaustive)であること(特に不足がない)を確認したいので、テストケースのみを取り上げる。

テストケース:
入力値	期待値	解説
2024-06-05 07:20	2024-06-05 07:30	第一勤務開始時刻より前にテスト
2024-06-05 08:00	2024-06-05 07:30	第一勤務開始時刻
2024-06-05 15:20	2024-06-05 15:30	第二勤務開始時刻より前にテスト
2024-06-05 16:00	2024-06-05 15:30	第二勤務開始時刻
2024-06-05 23:15	2024-06-05 23:30	第三勤務開始時刻より前にテスト
2024-06-05 23:45	2024-06-05 23:30	第三勤務開始時刻
2024-06-06 00:00	2024-06-06 23:30	翌日0時を跨いでいる場合も第三勤務開始時刻
2024-06-06 07:00	2024-06-06 07:30	翌日7時を跨いでいる場合も第一勤務開始時刻

補足:
テストケースは、各勤務帯の開始時刻より前、開始時刻、終了時刻、翌日の開始時刻を含むように
設定しています。
実際のテストでは、より多くのテストケースを追加して、関数の動作を検証することが重要です。
テストケースを実行するには、datetime モジュールをインポートする必要があります。
このテストケースが、ご質問の関数テストに役立つことを願っています。

ChatGPTによるテストケースは、以下のようになっている。

test_cases = [
    # Test cases for First Shift (07:30 - 15:30)
    {"input": "2024-06-03 08:00", "expected": "2024-06-03 07:30"},
    {"input": "2024-06-03 15:29", "expected": "2024-06-03 07:30"},
    
    # Test cases for Second Shift (15:30 - 23:30)
    {"input": "2024-06-03 15:30", "expected": "2024-06-03 15:30"},
    {"input": "2024-06-03 23:29", "expected": "2024-06-03 15:30"},
    
    # Test cases for Third Shift (23:30 - 07:30)
    {"input": "2024-06-03 23:30", "expected": "2024-06-03 23:30"},
    {"input": "2024-06-04 07:29", "expected": "2024-06-03 23:30"},
    
    # Edge cases for shift boundaries
    {"input": "2024-06-03 07:30", "expected": "2024-06-03 07:30"},
    {"input": "2024-06-03 15:30", "expected": "2024-06-03 15:30"},
    {"input": "2024-06-03 23:30", "expected": "2024-06-03 23:30"},
    {"input": "2024-06-04 07:30", "expected": "2024-06-04 07:30"},
    
    # Test case for transitioning from one day to the next
    {"input": "2024-06-04 00:00", "expected": "2024-06-03 23:30"},
    {"input": "2024-06-04 23:00", "expected": "2024-06-04 15:30"},
    
    # Test cases for midnight transitions
    {"input": "2024-06-04 00:01", "expected": "2024-06-03 23:30"},
    {"input": "2024-06-04 23:59", "expected": "2024-06-04 15:30"}
]

比較すると、同値分割としてはどちらも良いと思うが、ChatGPTでは境界値分析を意識できていると思う(各勤務の終了時刻が次の勤務の開始時刻-1minとなっている)。
しかし、Geminiでは、各勤務の終了時刻と思われる時刻が次の勤務の開始時刻-10min(第三勤務に至っては15min)となっているのはなぜなのだろう?
より、同値分割、境界値分析を意識させるように、質問を修正してみた。

以下の条件で勤務帯が設定されています。
第一勤務:07:30~15:30
第二勤務:15:30~23:30
第三勤務:23:30~07:30
現在時刻を入力値として、入力値が所属する勤務帯の開始日時を出力する関数を作成しました。
この関数をテストするためのテストケースを、入力値と期待値で整理して、リストとして出力してください。
テストケースを作成する際には、同値分割、境界値分析を意識してください。

質問を修正

結果は、以下のとおりである。

テストケース(同値分割・境界値分析):

区分	入力値	期待値	解説
第一勤務	7:20	7:30	勤務帯開始時刻より前の時間
第一勤務	7:30	7:30	勤務帯開始時刻
第一勤務	8:00	7:30	勤務帯開始時刻
第一勤務	15:20	7:30	勤務帯終了時刻直前
境界値	15:29	7:30	勤務帯境界値(開始時刻側)
境界値	15:30	15:30	勤務帯境界値(終了時刻側)
第二勤務	15:31	15:30	勤務帯開始時刻
第二勤務	16:00	15:30	勤務帯開始時刻
第二勤務	23:15	15:30	勤務帯終了時刻直前
境界値	23:29	15:30	勤務帯境界値(終了時刻側)
境界値	23:30	23:30	勤務帯境界値(開始時刻側)
第三勤務	23:31	23:30	勤務帯開始時刻
第三勤務	0:00	23:30	勤務帯開始時刻
第三勤務	7:00	23:30	勤務帯終了時刻直前
境界値	7:29	23:30	勤務帯境界値(終了時刻側)
境界値	7:30	7:30	勤務帯境界値(開始時刻側)
日付跨ぎ	2024-06-05 23:59	23:30	翌日0時を跨いでも第三勤務開始時刻
日付跨ぎ	2024-06-06 00:01	7:30	翌日0時を跨いだ場合は第一勤務開始時刻

補足:

同値分割と境界値分析に基づいて、各勤務帯の開始時刻、終了時刻、境界値を含むテストケースを
作成しました。
テストケースを実行するには、datetime モジュールをインポートする必要があります。
実際のテストでは、さらに多くのテストケースを追加して、関数の動作を検証することが重要です。
このテストケースが、ご質問の関数テストに役立つことを願っています。

境界値分析を意識するあまり、同値分割が意識できておらず、同一の同値パーティションに含まれるテストケースを作成している(MECEを確認すれば、不足はないが重複がある状態である)。
また、日付を跨ぐ境界値を意識できているが、そこにだけ入力値として日時としてが、それ以外の入力値、期待値ともに日付が無くなっているのは、なぜなのだろう?
特に、期待値から日付が無くなっているのは、ソフトウェアテスト考#12で取り上げたように、日付跨ぎの観点を意識できなくなって不具合を検出できなくなる恐れがある。

黒柴がこれを改善するために、質問を改善するアイディアを出せなかったため、今回はここまでとするが、やはり生成AIを使いこなすはいろいろと難しい。
次回は、Copilotを取り上げたいと思う。

この記事が気に入ったらサポートをしてみませんか?