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

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

昨今、生成AIが流行っている。
自社でも、ディープラーニング好きの役員が、「生成AIの利用ガイダンス」みたいな社内打ち合わせを、出席必須で行っている。
「使え」と言われても、業務自体はSIer、またはメーカーの下請けとしてのソフトウェア開発であるため、一歩間違えれば自社ではなくカスタマーの秘匿情報が生成AI側に流出してしまう。
そういう意味での「使い方ガイドライン」を提示してくれるのならまだしも、ただ「使え、使え」と言われてもなぁと、少々辟易している。

ちなみに、「生成AI」がより高度になっていくことで、失われる仕事の中に「プログラミング」も含まれているのだが、黒柴は20世紀のころにCASEツールに触れてから、「将来はこういうものを使いながら仕様からプログラムを生成していくのだろうなぁ」と漠然と考えていたので、プログラミングというアクティビティが生成AIよって失われると言われても、「そういうものだろう」と思っている。
ただ、システムを使いたい、提供したいと思っているカスタマーが考えている要望を、要件として整理し、仕様として設計することで、ようやく生成AIは、その要望を満足させるプログラムを生成することができると思っている。
そのため、要件や仕様を整理する設計に関する能力は、依然として人間の側に残るので、近い将来に「システムエンジニア」という職種がすべて生成AIにとって代わることは無いだろう。

話しが長く成ったが、今回はソフトウェアテストのテストケースを生成AIがきちんと生成できるのか、またきちんと生成させるためには、どのような仕様を提示すればよいのか、ということを考えていく。
仕様は、ソフトウェアテスト考#12で取り上げた、交代勤務の開始時刻を出力する機能のテストケースである。
とりあえず、日付がまたがることを意識させるために、仕様を以下のように定義した。

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

テストケース生成用の仕様

これを、ChatGPT、Gemini、Copilotに質問し、生成されたテストケースを確認していこうと思う。

最初は、ChatGPTである。ChatGPT自身に質問すると、バージョンは「GPT-4」となっている。
仕様を質問して回答は、以下の通りである。

勤務帯の開始日時を出力する関数のテストケースを作成するため、以下のように入力値と期待値を整理したリストを作成しました。

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

テストケースとしては、各勤務帯の境界値の他に、日付のまたがりに対するテストケースが付与されているので、まあ良いのではないかと思う。
ソフトウェアテスト考#12を取り上げていただいたブロッコリーさんのブログに、より詳細なテストケースの設計についての考え方が整理されているが、この生成AIの出力をベースに確認することは有効だと考える。

ちなみに、ソフトウェアテスト考#12で記述したように、勤務帯の開始時刻だけに着目して、以下のような仕様を入力してみる。

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

テストケースの生成仕様

結果は以下のようになった。

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

期待値が日時ではなく時刻となっただけで、入力値の考え方は日時を確認するテストケースと変わっていない。
ただ、これは日時を確認するテストケースと連続して作業させてしまったため、一つ前の入力に影響されてしまったことも考えられる。

長く成ったので、Gemini、Copilotについては次回確認していく。

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