Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

AI(ChatGPT-4)によるテスト設計作成の現状を評価する #Ques20 / Ques20th

AI(ChatGPT-4)によるテスト設計作成の現状を評価する #Ques20 / Ques20th

nihonbuson

May 18, 2023
Tweet

More Decks by nihonbuson

Other Decks in Technology

Transcript

  1. 自己紹介 • 風間裕也(ブロッコリー) • 所属 ◦ 株式会社10X ◦ 株式会社iCARE フェロー(QAE技術顧問)

    ◦ B-Testing(個人事業主) • 社外活動 ◦ JaSST Review実行委員長 ◦ WACATE実行委員長 • 執筆活動 ◦ 『Agile Testing Condensed』(翻訳) ◦ 『Testing in DevOps』(翻訳) ◦ 『The BDD Books Discovery』(翻訳) ◦ 『テストコードの注入から始める レガシーコードのリファクタリング』(技術同人誌) SNS上の アイコン
  2. Copyright ©iCARE Co.,Ltd All Rights Reserved.
 健康課題を可視化するCarely 業務のデジタル化 
 4

    4 ストレスチェック 健康診断管 理 過重労働管理 面談管理 労基署提出データ 統計データ 職場巡視 衛生委員会 事業について - Carely健康管理クラウド カンパニーケアを実現するための機能がオールインワン 調査方法:インターネット調査 / 調査期間:2022年10月12日~13日 / 調査対象:産業保健業務従事者1004名 対象選定方法:アンケートを基に所定の条件に合致する対象者を抽出 / アンケートモニター提供元:ゼネラルリサーチ 健康診断管理 面談管理 業務を効率化し、情報を一元化し、課題を可視化。 カンパニーケアの基盤となる健康管理システムです。 Carely導入企業では健康管理に かかる作業時間を約4分の1に 効率化。人事労務・産業看護職が抱え る健康診断やストレスチェック、過重 労働対策などのアナログ業務をクラ ウドシステムで効率化します。 Carelyでは、健康診断やストレス チェック、産業医面談や過重労働管 理といった様々な健康にまつわる データを一元管理することができま す。3ヵ年、5ヵ年とデータを蓄積し ていくことで、組織の健康状態を可 視化します。 業務効率化 データの一元管理
  3. 将棋電王戦の歴史 • 2012年…第1回将棋電王戦 米長邦雄永世棋聖(元プロ)vsボンクラーズ • 2013年…第2回将棋電王戦 現役棋士5名vs成績上位5つのコンピュータ将棋ソフト • 2014年…第3回将棋電王戦 現役棋士5名vs成績上位5つのコンピュータ将棋ソフト

    • 2015年…将棋電王戦FINAL 現役棋士5名vs成績上位5つのコンピュータ将棋ソフト • 2016年…第1期電王戦 山崎隆之叡王vs電王PONANZA • 2017年…第2期電王戦 佐藤天彦叡王vs電王PONANZA AI 人 AI AI AI 人 AI AI AI AI 人 人 人 AI AI AI AI AI AI
  4. ChatGPTによる回答 - テストコード import { getMessage } from './thermometer'; describe('Thermometer',

    () => { test('should display "寒い" for temperature below 24.0℃', () => { expect(getMessage(23.9)).toBe('寒い'); }); test('should display "快適" for temperature between 24.0℃ and 26.0℃', () => { expect(getMessage(24.0)).toBe('快適'); expect(getMessage(25.9)).toBe('快適'); }); test('should display "暑い" for temperature above 26.0℃', () => { expect(getMessage(26.0)).toBe('暑い'); }); });
  5. ChatGPTによる回答 - 実装例 // thermometer.ts export function getMessage(temperature: number): string

    { if (temperature < 24.0) { return '寒い'; } else if (temperature >= 24.0 && temperature < 26.0) { return '快適'; } else { return '暑い'; } }
  6. テスト設計内容に対しての追加質問の回答 2値による境界値分析を適用した理由は主に次の2つです。 1. シンプルさと効率性: 室温に関する仕様が比較的単純で、大きく分けて3 つの範囲に分けられるため、それぞれの範囲の境界でテストを行うこと で、全範囲を効率的にカバーできます。境界値分析は、境界をテストす ることでエラーを見つけやすくするテスト設計テクニックであり、境界 値が明確である場合には2値の境界値分析が有効です。 2.

    バグの発生可能性の低さ: プログラムの性質上、24.0℃や26.0℃といっ た境界値における挙動は、それよりわずかに高いか低い値(例えば 23.9999℃や26.0001℃)での挙動と異なる可能性は低いと考えられま す。したがって、このケースでは2値による境界値分析を適用しても、バ グの見逃しリスクは低いと判断しました。
  7. 題材2 デシジョンテーブル ## 仕様 ### 概要 - ビールの価格算出・条件に 応じた割引プログラム -

    時間「ハッピーアワー」の際に ビールを注文すると 1杯目のみ割引が適用される - クーポンの利用でも 1杯目のビールは価格が安くなる 16:00〜18:00 ハッピーアワー 時間内は 1杯290円! クーポンを お持ちの方は 1杯目100円! 空欄の看板のイラスト - いらすとや
  8. 題材2 デシジョンテーブル ### 動作 - 通常ビールは1杯490円である - 16:00から17:59まではハッピーアワーのため、 ビールは1杯290円で提供される -

    クーポンを使用すると、利用時間にかかわらず 初めの1杯のみビールは100円で提供される - ハッピーアワー中でもクーポンの利用は可能である - 算出された金額のうち最も安い価格で提供される
  9. ChatGPTによる回答 - テスト設計結果 テスト設計結果 上記のデシジョンテーブルをもとに、以下のテストケースを作成しました。 1. ハッピーアワー外でクーポンを使用しない場合、 ビールの価格は490円であること 2. ハッピーアワー外でクーポンを使用する場合、

    ビールの価格は100円であること 3. ハッピーアワー中でクーポンを使用しない場合、 ビールの価格は290円であること 4. ハッピーアワー中でクーポンを使用する場合、 ビールの価格は100円であること
  10. ChatGPTによる回答 - テストコード import { getPrice } from './beerPriceCalculator'; test('通常価格',

    () => { expect(getPrice(false, false)).toBe(490); }); test('クーポン使用', () => { expect(getPrice(false, true)).toBe(100); }); test('ハッピーアワー中', () => { expect(getPrice(true, false)).toBe(290); }); test('ハッピーアワー中+クーポン使用 ', () => { expect(getPrice(true, true)).toBe(100); });
  11. ChatGPTによる回答 - 実装例 export function getPrice(isHappyHour: boolean, useCoupon: boolean): number

    { const regularPrice = 490; const happyHourPrice = 290; const couponPrice = 100; const prices = [regularPrice]; if (isHappyHour) { prices.push(happyHourPrice); } if (useCoupon) { prices.push(couponPrice); } return Math.min(...prices); }
  12. 私がテスト設計する場合 愚直にデシジョンテーブルを作成(8パターン) 1 2 3 4 5 6 7 8

    条件部 ハッピーアワーである Y Y Y Y N N N N 1杯目である Y Y N N Y Y N N クーポンを使用する Y N Y N Y N Y N 動作部 100円 X X 290円 X X X 490円 X X X
  13. 私がテスト設計する場合 愚直にデシジョンテーブルを作成(8パターン) 1 2 3 4 5 6 7 8

    条件部 ハッピーアワーである Y Y Y Y N N N N 1杯目である Y Y N N Y Y N N クーポンを使用する Y N Y N Y N Y N 動作部 100円 X X 290円 X X X 490円 X X X
  14. 私がテスト設計する場合 デシジョンテーブルの簡単化を実行(6パターン) 1 2 3 4 5 6 条件部 ハッピーアワーである

    Y Y Y N N N 1杯目である Y Y N Y Y N クーポンを使用する Y N - Y N - 動作部 100円 X X 290円 X X 490円 X X
  15. テスト設計内容の比較 # ハッピー アワー クーポン 使用 期待される 価格 1 いいえ

    いいえ 490円 2 いいえ はい 100円 3 はい いいえ 290円 4 はい はい 100円 # ハッピー アワー 1杯目 クーポン 使用 期待される 価格 1 はい はい はい 100円 2 はい はい いいえ 290円 3 はい いいえ ー 290円 4 いいえ はい はい 100円 5 いいえ はい いいえ 490円 6 いいえ いいえ ー 490円 ChatGPT-4の出力結果 私の作成結果 (ChatGPT-4の出力形式に合わせて表示)
  16. テスト設計内容に対する考察① # ハッピー アワー クーポン 使用 期待される 価格 1 いいえ

    いいえ 490円 2 いいえ はい 100円 3 はい いいえ 290円 4 はい はい 100円 # ハッピー アワー 1杯目 クーポン 使用 期待される 価格 1 はい はい はい 100円 2 はい はい いいえ 290円 3 はい いいえ ー 290円 4 いいえ はい はい 100円 5 いいえ はい いいえ 490円 6 いいえ いいえ ー 490円 ChatGPT-4の出力結果には 1杯目の条件の考慮がない
  17. テスト設計内容に対する考察② # ハッピー アワー クーポン 使用 期待される 価格 1 いいえ

    いいえ 490円 2 いいえ はい 100円 3 はい いいえ 290円 4 はい はい 100円 # ハッピー アワー 1杯目 クーポン 使用 期待される 価格 1 はい はい はい 100円 2 はい はい いいえ 290円 3 はい いいえ ー 290円 4 いいえ はい はい 100円 5 いいえ はい いいえ 490円 6 いいえ いいえ ー 490円 ChatGPT-4の出力結果では 簡単化の実行を行っていない
  18. テストコードに対する考察① import { getPrice } from './beerPriceCalculator'; test('通常価格', () =>

    { expect(getPrice(false, false)).toBe(490); }); test('クーポン使用', () => { expect(getPrice(false, true)).toBe(100); }); test('ハッピーアワー中', () => { expect(getPrice(true, false)).toBe(290); }); test('ハッピーアワー中+クーポン使用 ', () => { expect(getPrice(true, true)).toBe(100); }); テスト設計結果を元にした 作成ができている
  19. テストコードに対する考察② import { getPrice } from './beerPriceCalculator'; test('通常価格', () =>

    { expect(getPrice(false, false)).toBe(490); }); test('クーポン使用', () => { expect(getPrice(false, true)).toBe(100); }); test('ハッピーアワー中', () => { expect(getPrice(true, false)).toBe(290); }); test('ハッピーアワー中+クーポン使用 ', () => { expect(getPrice(true, true)).toBe(100); }); getPrice関数の引数が 分かりづらい Code Smellの1つ 「Primitive Obsession」 getPriceの 1つ目の引数と 2つ目の引数を 取り違えてしまう リスクがある。
  20. 題材3 状態遷移 ## 仕様 ### 概要 - 時間計測に使えるストップウォッチ - ボタンは「スタートボタン」「リセットボタン」の2つ

    ### 画面レイアウト - 経過時間の表示欄。数字は秒と分を「mm:ss」形式で表 示 - スタートボタン - リセットボタン ストップウォッチのイラスト - いらすとや
  21. 題材3 状態遷移 ### 動作 - ストップウォッチの初期状態は計測準備中 - 状態が計測準備中の時、経過時間の表示欄には 「00:00」を表示 -

    計測準備中にスタートボタンを押すと計測が開始 - 計測中にスタートボタンを押すと一時停止 - 一時停止中にスタートボタンを押すと再開 - 一時停止中にリセットボタンを押すと経過時間の表示 は「00:00」に戻り、計測準備中に変化
  22. ChatGPTによる回答 - テスト分析結果 テスト分析結果 以下の状態が考慮されます。 1. 計測準備中 2. 計測中 3.

    一時停止中 また、以下のアクションが考慮されます。 1. スタートボタンを押す 2. リセットボタンを押す
  23. ChatGPTによる回答 - テスト設計結果① テスト設計結果 状態遷移図: graph TD A[計測準備中] -->|スタートボタン| B[計測中]

    B -->|スタートボタン| C[一時停止中] C -->|スタートボタン| B C -->|リセットボタン| A Mermaid Live Editorによる描画
  24. ChatGPTによる回答 - テストコード import { Stopwatch } from './stopwatch'; describe('Stopwatch',

    () => { let stopwatch: Stopwatch; beforeEach(() => { stopwatch = new Stopwatch(); }); test('initial state is 計測準備中', () => { expect(stopwatch.getState()).toBe('計測準備中'); }); test('press start button in 計測準備中', () => { stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('計測中'); }); test('press start button in 計測中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('一時停止中'); }); test('press start button in 一時停止中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('計測中'); }); test('press reset button in 一時停止中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); stopwatch.pressResetButton(); expect(stopwatch.getState()).toBe('計測準備中'); }); });
  25. ChatGPTによる回答 - 実装例 class Stopwatch { private state: string; constructor()

    { this.state = '計測準備中'; } public getState(): string { return this.state; } public pressStartButton(): void { if (this.state === '計測準備中' || this.state === '一 時停止中') { this.state = '計測中'; } else if (this.state === '計測中') { this.state = '一時停止中'; } } public pressResetButton(): void { if (this.state === '一時停止中') { this.state = '計測準備中'; } } } export { Stopwatch };
  26. テストコードに対する考察① import { Stopwatch } from './stopwatch'; describe('Stopwatch', () =>

    { let stopwatch: Stopwatch; beforeEach(() => { stopwatch = new Stopwatch(); }); test('initial state is 計測準備中', () => { expect(stopwatch.getState()).toBe('計測準備中'); }); test('press start button in 計測準備中', () => { stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('計測中'); }); test('press start button in 計測中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('一時停止中'); }); test('press start button in 一時停止中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); stopwatch.pressStartButton(); expect(stopwatch.getState()).toBe('計測中'); }); test('press reset button in 一時停止中', () => { stopwatch.pressStartButton(); stopwatch.pressStartButton(); stopwatch.pressResetButton(); expect(stopwatch.getState()).toBe('計測準備中'); }); });
  27. JSTQBで示しているテストプロセス テスト 分析 テスト 設計 テスト 実装 テスト 実行 何をテスト

    するか それをどう テストするか テストの実行に 必要なものすべて を準備したか テストスイート を実行する 参考:ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J02
  28. 今回行わせた内容は主にテスト設計 テスト 分析 テスト 設計 テスト 実装 テスト 実行 やってない

    or苦手? ある程度 できそう? 作成は できそう? 実行は 不可能
  29. 今回行わせた内容は主にテスト設計 テスト 分析 テスト 設計 テスト 実装 テスト 実行 やってない

    or苦手? ある程度 できそう? 作成は できそう? 実行は 不可能
  30. テスト分析で行うこと • テスト対象の分析 ◦ テスト対象がどのような構成になっているのか 把握する • テスト要求の分析 ◦ 何をテストしてPassすれば、

    今回の内容(機能)がOKだと判断できるのか • テスト設計技法の選定 ◦ テスト設計を行う際に適用すべき テスト設計技法は何か
  31. 入力するスクリプト(おさらい) (前置きの文章) ## 仕様 ### 前提 [前提を記載] ### 画面レイアウト [画面レイアウトを記載]

    ### 動作 [動作を記載] なお出力形式は以下とします。 テストコードは[テスト技法の名前]を用いてください。 ## 出力形式 (以下略) テスト対象の分析は 既に与えられている テスト設計技法の選定は 既に指示がある
  32. ChatGPT-4を過度に評価し、その評価を流布する • ChatGPT-4などのAI開発を生業としている人が 発言することを制限する必要はない ◦ AIの発展は望ましいこと • 対象分野の専門家(今回であればテストエンジニア) が無批判に受け入れて流布するのは止めよう ◦

    AIの期待を不当に上げてしまう (自動化ハイと同様の現象) ◦ 同業者達全体の評価を下げる行為になってしまう • どの部分は活用でき、どこに伸びしろがあるか示そう ◦ この点が今回の発表のきっかけ
  33. 宣伝:WACATE • 1泊2日の宿泊型ワークショップ ◦ コロナ禍ではオンライン開催 • 半年に1度開催 • 次回はWACATE 2023

    夏(開催概要ページはこちら) ◦ 6/10,11に開催予定 ◦ 東京代々木の施設にて開催(オフライン開催!) ◦ 現在、参加者受付中(募集は5/21まで!) ◦ 参加費は8000円(35歳以下)or9000円(36歳以上) ◦ 座学を交えながら、1つのお題に対して テスト分析〜テスト設計を2日間かけて実施
  34. ©iCARE Co.,Ltd
 Confidential iCAREのQAEチームではメンバーを募集しています! チームの特徴 • 開発側と伴走しながら一緒に作り上げていきます ◦ 早期バグ発見を目指し、プロジェクトの上流から 開発チームやビジネスサイドとコミュニケーションをとって

    テスト活動に取り組んでいます • QAEチーム自体の取り組みが活発です! ◦ QAE技術顧問 ブロッコリーさん の相談会 ▪ 進行しているPJのテスト分析やテスト設計のレビュー ▪ リリース済みのPJの振り返り ▪ 開発プロセスの中でのQAEチームの動き方の相談 ◦ QAEチーム単体での勉強会 ▪ 輪読会(Agile Testing Condensed) ▪ テスト技法の勉強会(ソフトウェアテスト技法の練習帳) • 絶賛QAE募集中です!(シニアQAEも大歓迎!) 詳しくはQRか、下記で検索をお願いします! 🙏 iCARE 求人 QAE