Slide 1

Slide 1 text

AI(ChatGPT-4)による テスト設計作成の 現状を評価する ブロッコリー @nihonbuson

Slide 2

Slide 2 text

自己紹介 ● 風間裕也(ブロッコリー) ● 所属 ○ 株式会社10X ○ 株式会社iCARE フェロー(QAE技術顧問) ○ B-Testing(個人事業主) ● 社外活動 ○ JaSST Review実行委員長 ○ WACATE実行委員長 ● 執筆活動 ○ 『Agile Testing Condensed』(翻訳) ○ 『Testing in DevOps』(翻訳) ○ 『The BDD Books Discovery』(翻訳) ○ 『テストコードの注入から始める レガシーコードのリファクタリング』(技術同人誌) SNS上の アイコン

Slide 3

Slide 3 text

引用元:10X プロダクト本部・エンジニアリング本部 紹介資料

Slide 4

Slide 4 text

Copyright ©iCARE Co.,Ltd All Rights Reserved.
 健康課題を可視化するCarely 業務のデジタル化 
 4 4 ストレスチェック 健康診断管 理 過重労働管理 面談管理 労基署提出データ 統計データ 職場巡視 衛生委員会 事業について - Carely健康管理クラウド カンパニーケアを実現するための機能がオールインワン 調査方法:インターネット調査 / 調査期間:2022年10月12日~13日 / 調査対象:産業保健業務従事者1004名 対象選定方法:アンケートを基に所定の条件に合致する対象者を抽出 / アンケートモニター提供元:ゼネラルリサーチ 健康診断管理 面談管理 業務を効率化し、情報を一元化し、課題を可視化。 カンパニーケアの基盤となる健康管理システムです。 Carely導入企業では健康管理に かかる作業時間を約4分の1に 効率化。人事労務・産業看護職が抱え る健康診断やストレスチェック、過重 労働対策などのアナログ業務をクラ ウドシステムで効率化します。 Carelyでは、健康診断やストレス チェック、産業医面談や過重労働管 理といった様々な健康にまつわる データを一元管理することができま す。3ヵ年、5ヵ年とデータを蓄積し ていくことで、組織の健康状態を可 視化します。 業務効率化 データの一元管理

Slide 5

Slide 5 text

個人事業主としても動いてます 引用元:B-Testing.net

Slide 6

Slide 6 text

本発表でお伝えしたいこと ● 現在のAIによるテスト設計成果物を眺める ● 作成されたテスト設計成果物に対して、 正しいかどうかを評価する ● AIによる作成が得意な分野と苦手な分野を示す

Slide 7

Slide 7 text

本発表の結論 https://twitter.com/mty_mno/status/1634016843513085952

Slide 8

Slide 8 text

はじめに 〜AIを評価するとは〜

Slide 9

Slide 9 text

ボードゲームとAIの歴史 ● チェス…1996年、 IBMのディープ・ブルーが 世界チャンピオンのガルリ・カスパロフ相手に勝利 (全体の成績は1勝3敗2引き分け) ● 囲碁…2015年、 GoogleのAlphaGoが トッププロ棋士の李世乭(イ・セドル)相手に勝利 ● 将棋…2005年頃に、 オンライン将棋で実力がプロレベルまで来たと 言われるようになった 画像引用元:IEEE Spectrum

Slide 10

Slide 10 text

将棋電王戦 画像引用元:第2期電王戦

Slide 11

Slide 11 text

将棋電王戦の歴史 ● 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

Slide 12

Slide 12 text

永瀬六段の角不成 2015年の将棋電王戦FINALでの出来事 永瀬六段(当時)は、自分自身が明らかに優勢な段階で AI側の不具合を指摘した。 「Seleneのプログラムには飛車と角と歩を成れるのに 成らない手を認識する機能が抜け落ちていた。」 引用元:マイナビニュース 画像引用元:マイナビニュース

Slide 13

Slide 13 text

「AIを評価する」とは ● 現時点のAIの出力結果に対してレビューを行う ○ 単に「分かりづらい」とかではなく、 どのようにすれば良いかも示す ● 出力結果は複数の要素が絡んでいることを留意する ○ 入力内容 ○ 出力結果のランダム性 ○ AIのバージョン ● 「AIが使えない」と言いたいわけではない ○ AIの発展を応援している立場である

Slide 14

Slide 14 text

AIへの入力内容

Slide 15

Slide 15 text

入力するスクリプト まず、以下の2つを守ってください ・まとめや結論は指示以外では書かないでください ・詳細でないことや重要ではないことも省略せずに書いて ください 以下の仕様をもとにjestのテストコードを作成してくださ い。 また、仕様を満たしあなたが出力したテストコードを通過 する関数をTypeScriptで作成してください。 ChatGPTの 接待モードを OFFするため(*) (*)参考:https://note.com/mryy/n/nd0aff5c9fc4f

Slide 16

Slide 16 text

入力するスクリプト ## 仕様 ### 前提 [前提を記載] ### 画面レイアウト [画面レイアウトを記載] ### 動作 [動作を記載]

Slide 17

Slide 17 text

入力するスクリプト なお出力形式は以下とします。 テストコードは[テスト技法の名前]を用いてください。 ## 出力形式 - 概要 - テスト分析結果 - テスト設計結果 - テストコード - 実装例

Slide 18

Slide 18 text

使用するお題 ● 同値分割、境界値分析(★) ● デシジョンテーブル(★) ● 状態遷移(★) ● 組み合わせテスト (★)は『ソフトウェアテスト技法練習帳』からお題を拝借

Slide 19

Slide 19 text

使用するお題の一部 ● 『ソフトウェアテスト技法練習帳』 に掲載の問題から抜粋して出題 ○ テスト設計技法を練習するには 最適の1冊! ● 執筆者はJaSST Tohoku実行委員会の 皆さん ○ JaSST'23 Tohokuは5/26開催! ○ https://www.jasst.jp/symposium/jasst23tohoku.html https://www.amazon.co.jp/dp/429711061X

Slide 20

Slide 20 text

使用するAI ● 使用するAI ○ ChatGPT ● バージョン ○ GPT-4 ● 使用日 ○ 4月20日

Slide 21

Slide 21 text

お題1: 同値分割・境界値分析

Slide 22

Slide 22 text

お題1 同値分割・境界値分析 ## 仕様 ### 前提 - 室温計のプログラム ### 画面レイアウト - 室温表示欄 - メッセージ欄 25.3℃ 快適

Slide 23

Slide 23 text

お題1 同値分割・境界値分析 ### 動作 - 室温が「24.0℃未満」の場合、メッセージ欄に「寒 い」と表示 - 室温が「24.0℃以上26.0℃未満」の場合、メッセージ 欄に「快適」と表示 - 室温が「26.0℃以上」の場合、メッセージ欄に「暑 い」と表示

Slide 24

Slide 24 text

お題1 同値分割・境界値分析 テストコードは同値分割法(Equivalence Partitioning Testing)と境界値分析(Boundary value analysis)を用い てください。

Slide 25

Slide 25 text

お題1に対する ChatGPT-4の回答

Slide 26

Slide 26 text

ChatGPTによる回答 - 概要とテスト分析結果 概要 室温計プログラムにおいて、室温に応じてメッセージ欄に「寒い」「快適」 「暑い」のいずれかが表示されるようにテストコードを作成し、そのテスト コードを通過する関数をTypeScriptで実装します。 テスト分析結果 同値分割法(Equivalence Partitioning Testing)と境界値分析(Boundary value analysis)を用いて、以下のように分析します。 1. 室温が24.0℃未満の場合 (寒い) 2. 室温が24.0℃以上26.0℃未満の場合 (快適) 3. 室温が26.0℃以上の場合 (暑い)

Slide 27

Slide 27 text

ChatGPTによる回答 - テスト設計結果 テスト設計結果 室温が23.9℃の場合、「寒い」が表示されることを確認 室温が24.0℃の場合、「快適」が表示されることを確認 室温が25.9℃の場合、「快適」が表示されることを確認 室温が26.0℃の場合、「暑い」が表示されることを確認

Slide 28

Slide 28 text

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('暑い'); }); });

Slide 29

Slide 29 text

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 '暑い'; } }

Slide 30

Slide 30 text

ChatGPTによる回答 - まとめ 以上のテストコードと実装例により、室温に応じてメッセージ欄に 「寒い」「快適」「暑い」が表示されることが確認できます。

Slide 31

Slide 31 text

お題1に対する 考察

Slide 32

Slide 32 text

テスト設計内容に対する考察 2値による境界値分析 を用いている ※ChatGPT-3.5では 3値による境界値分析を利用 23.9 24.0 25.9 26.0 23.9 24.0 25.9 26.0 24.1 2値による境界値分析 3値による境界値分析

Slide 33

Slide 33 text

テスト設計内容に対しての追加質問 今回のテスト設計結果では、 2値による境界値分析を適用しているように見えます。 一方、境界値分析には3値による境界値分析を適用することも可能です。 2値による境界値分析を適用するに至った判断基準を教えてください。 「なぜ3値による境界値分析を適用しなかったのですか?」 と質問すると、 「ごめんなさい、3値による境界値分析を適用した方が良いですね」 などといった回答がくるので注意

Slide 34

Slide 34 text

テスト設計内容に対しての追加質問の回答 2値による境界値分析を適用した理由は主に次の2つです。 1. シンプルさと効率性: 室温に関する仕様が比較的単純で、大きく分けて3 つの範囲に分けられるため、それぞれの範囲の境界でテストを行うこと で、全範囲を効率的にカバーできます。境界値分析は、境界をテストす ることでエラーを見つけやすくするテスト設計テクニックであり、境界 値が明確である場合には2値の境界値分析が有効です。 2. バグの発生可能性の低さ: プログラムの性質上、24.0℃や26.0℃といっ た境界値における挙動は、それよりわずかに高いか低い値(例えば 23.9999℃や26.0001℃)での挙動と異なる可能性は低いと考えられま す。したがって、このケースでは2値による境界値分析を適用しても、バ グの見逃しリスクは低いと判断しました。

Slide 35

Slide 35 text

お題2: デシジョンテーブル

Slide 36

Slide 36 text

題材2 デシジョンテーブル ## 仕様 ### 概要 - ビールの価格算出・条件に 応じた割引プログラム - 時間「ハッピーアワー」の際に ビールを注文すると 1杯目のみ割引が適用される - クーポンの利用でも 1杯目のビールは価格が安くなる 16:00〜18:00 ハッピーアワー 時間内は 1杯290円! クーポンを お持ちの方は 1杯目100円! 空欄の看板のイラスト - いらすとや

Slide 37

Slide 37 text

題材2 デシジョンテーブル ### 動作 - 通常ビールは1杯490円である - 16:00から17:59まではハッピーアワーのため、 ビールは1杯290円で提供される - クーポンを使用すると、利用時間にかかわらず 初めの1杯のみビールは100円で提供される - ハッピーアワー中でもクーポンの利用は可能である - 算出された金額のうち最も安い価格で提供される

Slide 38

Slide 38 text

題材2 デシジョンテーブル テストコードはデシジョンテーブル(Decision Table)を作 成し、それを参考に試作業を行なってください。

Slide 39

Slide 39 text

お題2に対する ChatGPT-4の回答

Slide 40

Slide 40 text

ChatGPTによる回答 - 概要 概要 この課題では、ビールの価格を算出し、条件に応じた割引プログラムを実装 する関数とそのテストコードを作成します。条件には、通常価格、ハッピー アワー中の価格、クーポンを使用した価格が含まれます。

Slide 41

Slide 41 text

ChatGPTによる回答 - テスト分析結果 テスト分析結果 テストケースを洗い出すために、デシジョンテーブルを作成しました。それ ぞれの条件(ハッピーアワー中かどうか、クーポンを使用するかどうか)に よって、ビールの価格が変わることを確認するためのテストケースを作成し ます。 ケース ハッピーアワー クーポン使用 期待される価格 1 いいえ いいえ 490円 2 いいえ はい 100円 3 はい いいえ 290円 4 はい はい 100円

Slide 42

Slide 42 text

ChatGPTによる回答 - テスト設計結果 テスト設計結果 上記のデシジョンテーブルをもとに、以下のテストケースを作成しました。 1. ハッピーアワー外でクーポンを使用しない場合、 ビールの価格は490円であること 2. ハッピーアワー外でクーポンを使用する場合、 ビールの価格は100円であること 3. ハッピーアワー中でクーポンを使用しない場合、 ビールの価格は290円であること 4. ハッピーアワー中でクーポンを使用する場合、 ビールの価格は100円であること

Slide 43

Slide 43 text

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); });

Slide 44

Slide 44 text

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); }

Slide 45

Slide 45 text

ChatGPTによる回答 - まとめ これらの関数とテストコードを用いて、ビールの価格算出・条件に応じた 割引プログラムを実装し、正しく動作することを確認できます。

Slide 46

Slide 46 text

お題2に対する 人間(私)の回答

Slide 47

Slide 47 text

私がテスト設計する場合 愚直にデシジョンテーブルを作成(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

Slide 48

Slide 48 text

私がテスト設計する場合 愚直にデシジョンテーブルを作成(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

Slide 49

Slide 49 text

私がテスト設計する場合 デシジョンテーブルの簡単化を実行(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

Slide 50

Slide 50 text

お題2に対する 考察

Slide 51

Slide 51 text

テスト設計内容の比較 # ハッピー アワー クーポン 使用 期待される 価格 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の出力形式に合わせて表示)

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

テスト設計内容に対する考察② # ハッピー アワー クーポン 使用 期待される 価格 1 いいえ いいえ 490円 2 いいえ はい 100円 3 はい いいえ 290円 4 はい はい 100円 # ハッピー アワー 1杯目 クーポン 使用 期待される 価格 1 はい はい はい 100円 2 はい はい いいえ 290円 3 はい いいえ ー 290円 4 いいえ はい はい 100円 5 いいえ はい いいえ 490円 6 いいえ いいえ ー 490円 ChatGPT-4の出力結果では 簡単化の実行を行っていない

Slide 54

Slide 54 text

テストコードに対する考察① 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); }); テスト設計結果を元にした 作成ができている

Slide 55

Slide 55 text

テストコードに対する考察② 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つ目の引数を 取り違えてしまう リスクがある。

Slide 56

Slide 56 text

お題3: 状態遷移

Slide 57

Slide 57 text

題材3 状態遷移 ## 仕様 ### 概要 - 時間計測に使えるストップウォッチ - ボタンは「スタートボタン」「リセットボタン」の2つ ### 画面レイアウト - 経過時間の表示欄。数字は秒と分を「mm:ss」形式で表 示 - スタートボタン - リセットボタン ストップウォッチのイラスト - いらすとや

Slide 58

Slide 58 text

題材3 状態遷移 ### 動作 - ストップウォッチの初期状態は計測準備中 - 状態が計測準備中の時、経過時間の表示欄には 「00:00」を表示 - 計測準備中にスタートボタンを押すと計測が開始 - 計測中にスタートボタンを押すと一時停止 - 一時停止中にスタートボタンを押すと再開 - 一時停止中にリセットボタンを押すと経過時間の表示 は「00:00」に戻り、計測準備中に変化

Slide 59

Slide 59 text

題材3 状態遷移 テスト設計では状態遷移図および状態遷移表をMermaid形 式で作成してください。 その後、仕様と状態遷移図と状態遷移表をインプットにし てテストコードを作成してください。

Slide 60

Slide 60 text

お題3に対する ChatGPT-4の回答

Slide 61

Slide 61 text

ChatGPTによる回答 - 概要 概要 ストップウォッチアプリケーションのテストコードをJestを使用して作成し ます。また、アプリケーションの実装をTypeScriptで行います。

Slide 62

Slide 62 text

ChatGPTによる回答 - テスト分析結果 テスト分析結果 以下の状態が考慮されます。 1. 計測準備中 2. 計測中 3. 一時停止中 また、以下のアクションが考慮されます。 1. スタートボタンを押す 2. リセットボタンを押す

Slide 63

Slide 63 text

ChatGPTによる回答 - テスト設計結果① テスト設計結果 状態遷移図: graph TD A[計測準備中] -->|スタートボタン| B[計測中] B -->|スタートボタン| C[一時停止中] C -->|スタートボタン| B C -->|リセットボタン| A Mermaid Live Editorによる描画

Slide 64

Slide 64 text

ChatGPTによる回答 - テスト分析結果② テスト設計結果 状態遷移表: 状態\アクション スタートボタン リセットボタン 計測準備中 計測中 - 計測中 一時停止中 - 一時停止中 計測中 計測準備中

Slide 65

Slide 65 text

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('計測準備中'); }); });

Slide 66

Slide 66 text

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 };

Slide 67

Slide 67 text

ChatGPTによる回答 - まとめ 上記のコードは、ストップウォッチアプリケーションの状態遷移を表現した TypeScript実装と、そのテストコードをJestを使用して作成したものです。 テストコードは、状態遷移図と状態遷移表を参考にして、ストップウォッチ の動作を確認します。

Slide 68

Slide 68 text

お題3に対する 人間(私)の回答

Slide 69

Slide 69 text

私がテスト設計する場合 状態遷移図を作成

Slide 70

Slide 70 text

私がテスト設計する場合 状態遷移表を作成 前状態\アクション スタートボタン リセットボタン 計測準備中 計測中 - 計測中 一時停止中 - 一時停止中 計測中 計測準備中

Slide 71

Slide 71 text

私がテスト設計する場合 状態遷移図に記載がない遷移を確認 前状態\アクション スタートボタン リセットボタン 計測準備中 計測中 - 計測中 一時停止中 - 一時停止中 計測中 計測準備中

Slide 72

Slide 72 text

私がテスト設計する場合 状態遷移図に追記

Slide 73

Slide 73 text

お題3に対する 考察

Slide 74

Slide 74 text

テスト設計内容(状態遷移図)の比較 私の作成結果 (ChatGPT-4の出力形式に合わせて表示) ChatGPT-4の出力結果

Slide 75

Slide 75 text

テスト設計内容(状態遷移表)の比較 私の作成結果 ChatGPT-4の出力結果

Slide 76

Slide 76 text

テスト設計内容に対する考察① 状態遷移表は ほぼ相違点無し

Slide 77

Slide 77 text

テスト設計内容に対する考察② ChatGPT-4の出力結果 状態遷移表を元にした アクションの追加があると なお嬉しい 状態遷移図…全体感を把握する 状態遷移表…抜け漏れを発見する 状態遷移表で見つけた抜け漏れを 状態遷移図に反映する

Slide 78

Slide 78 text

テストコードに対する考察① 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('計測準備中'); }); });

Slide 79

Slide 79 text

テストコードに対する考察② テストコードで行なっているテストケース一覧 ● 初期状態は計測準備中である ● 初期状態からスタートボタンを1回押すと計測中になる ● 初期状態からスタートボタンを2回押すと一時停止中になる ● 初期状態からスタートボタンを3回押すと計測中になる ● 初期状態からスタートボタンを2回押した後に リセットボタンを押すと計測準備中になる 経過時間の表示欄に関する テストが存在しない

Slide 80

Slide 80 text

番外編: 組み合わせテスト

Slide 81

Slide 81 text

番外編 組み合わせテスト 因子A たらこ,いくら 因子B ご飯,ジャスミンライス 因子C 海苔,昆布巻き 因子D サランラップ,アルミホイル 因子E お母さん,お父さん これで二因子間網羅を満たす直交表で組み合わせテストを 作って ※これは書籍『ソフトウェアテスト技法練習帳』に載っていないお題です  お題のネタ元はこちら 昆布のおにぎり・おむすびのイラスト - いらすとや

Slide 82

Slide 82 text

番外編に対する ChatGPT-4の回答

Slide 83

Slide 83 text

ChatGPTによる回答① 直交表を使用すると、全ての可能な組み合わせを最小限の試行で網羅的にテ ストすることができます。以下に各因子間で二因子間網羅を満たす直交表を 作成しました。 5つの因子 (A-E) があり、それぞれ2つのレベルがあります。ですから、適切 な直交表は L8(2^7) 表となります。ただし、この表は8行7列の表であり、 我々の要件には余分な列が存在します。従って、必要な5列だけを利用しま す。

Slide 84

Slide 84 text

ChatGPTによる回答② 以下の直交表で、A-Eに対応する各列を見てください。0は各因子の1つ目のレ ベルを、1は2つ目のレベルを示します。

Slide 85

Slide 85 text

ChatGPTによる回答③ これを因子に置き換えると次のようになります。

Slide 86

Slide 86 text

番外編に対する 人間(私)の回答

Slide 87

Slide 87 text

私がテスト設計する場合 直交表(L8)を用いて作成

Slide 88

Slide 88 text

番外編に対する 考察

Slide 89

Slide 89 text

テスト設計内容の比較 ChatGPT-4の出力結果 私の作成結果

Slide 90

Slide 90 text

テスト設計に対する考察 ChatGPT-4の出力結果は 直交表の定義を 満たしていない 直交表とは,任意の2因子(列) について,その水準の すべての組合せが同数回ずつ 現れるという性質をもつ 実験のための割り付け表です. 参考:(株)日科技研:直交表とは (実験計画法)

Slide 91

Slide 91 text

ChatGPT-4の 得意なこと 苦手なこと

Slide 92

Slide 92 text

JSTQBで示しているテストプロセス テスト 分析 テスト 設計 テスト 実装 テスト 実行 何をテスト するか それをどう テストするか テストの実行に 必要なものすべて を準備したか テストスイート を実行する 参考:ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J02

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

テスト分析で行うこと ● テスト対象の分析 ○ テスト対象がどのような構成になっているのか 把握する ● テスト要求の分析 ○ 何をテストしてPassすれば、 今回の内容(機能)がOKだと判断できるのか ● テスト設計技法の選定 ○ テスト設計を行う際に適用すべき テスト設計技法は何か

Slide 96

Slide 96 text

入力するスクリプト(おさらい) (前置きの文章) ## 仕様 ### 前提 [前提を記載] ### 画面レイアウト [画面レイアウトを記載] ### 動作 [動作を記載] なお出力形式は以下とします。 テストコードは[テスト技法の名前]を用いてください。 ## 出力形式 (以下略) テスト対象の分析は 既に与えられている テスト設計技法の選定は 既に指示がある

Slide 97

Slide 97 text

テスト要求の漏れの例① 「何杯目かによる 価格の確認」 というテスト要求 が漏れていた。

Slide 98

Slide 98 text

テスト要求の漏れの例② 「経過時間の 表示確認」 というテスト要求 が漏れていた。

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

テスト設計において完璧でない部分もあり 「ある程度できている」 ということは 「できていない部分を 見極めるのが大変」

Slide 101

Slide 101 text

ごもっともな意見 https://b.hatena.ne.jp/entry/4732946883558293700/comment/hogeaegxa

Slide 102

Slide 102 text

ChatGPT-4との 付き合い方

Slide 103

Slide 103 text

ChatGPT-4との付き合い方 ● 完璧な答えが無いものに対しての案出しとして使う ○ メソッド名の提案など ● レビュアーの1人として使う ○ 人間が成果物を作成し、成果物へのダメ出しをする ● 叩かれること前提の叩き台として使う

Slide 104

Slide 104 text

叩かれること前提の叩き台として使う https://twitter.com/yoshikiito/status/1649780697178214400

Slide 105

Slide 105 text

やらない方が良いこと

Slide 106

Slide 106 text

やらない方が良いこと ● ChatGPT-4が出力した内容を盲信すること ○ 抜けがあること前提で扱おう ● ChatGPT-4を過度に評価し、その評価を流布すること ○ その分野に対する内容が発展しなくなる恐れがある

Slide 107

Slide 107 text

ChatGPT-4を過度に評価し、その評価を流布する 発言例) 「ChatGPT-4でこんなテスト設計ができるようになった もう、テストエンジニアはいらないね!」 この発言による良くない影響例 ● 出力した内容が合っていなかったとしても、 それを正す人がいなくなってしまう ● もっと質の良いテスト設計を行なっている人がいても 「ChatGPT-4で代替できるんでしょ」と言われ 正当に評価されなくなる

Slide 108

Slide 108 text

ChatGPT-4を過度に評価し、その評価を流布する ● ChatGPT-4などのAI開発を生業としている人が 発言することを制限する必要はない ○ AIの発展は望ましいこと ● 対象分野の専門家(今回であればテストエンジニア) が無批判に受け入れて流布するのは止めよう ○ AIの期待を不当に上げてしまう (自動化ハイと同様の現象) ○ 同業者達全体の評価を下げる行為になってしまう ● どの部分は活用でき、どこに伸びしろがあるか示そう ○ この点が今回の発表のきっかけ

Slide 109

Slide 109 text

おわりに

Slide 110

Slide 110 text

本発表のまとめ ● テスト設計やテスト実装にはある程度使えそう ● テスト分析はまだまだ伸びしろが多い ● 出力結果を盲信せず、抜けがあること前提で向き合う ● 過度に評価し、流布するのは控えよう

Slide 111

Slide 111 text

本発表の結論(再掲) https://twitter.com/mty_mno/status/1634016843513085952

Slide 112

Slide 112 text

宣伝:WACATE 自分でテスト分析やテスト設計を できるようになるためには、実践が大切! →そこでWACATE!

Slide 113

Slide 113 text

宣伝:WACATE ● 1泊2日の宿泊型ワークショップ ○ コロナ禍ではオンライン開催 ● 半年に1度開催 ● 次回はWACATE 2023 夏(開催概要ページはこちら) ○ 6/10,11に開催予定 ○ 東京代々木の施設にて開催(オフライン開催!) ○ 現在、参加者受付中(募集は5/21まで!) ○ 参加費は8000円(35歳以下)or9000円(36歳以上) ○ 座学を交えながら、1つのお題に対して テスト分析〜テスト設計を2日間かけて実施

Slide 114

Slide 114 text

引用元:10X プロダクト本部・エンジニアリング本部 紹介資料

Slide 115

Slide 115 text

©iCARE Co.,Ltd
 Confidential iCAREのQAEチームではメンバーを募集しています! チームの特徴 ● 開発側と伴走しながら一緒に作り上げていきます ○ 早期バグ発見を目指し、プロジェクトの上流から 開発チームやビジネスサイドとコミュニケーションをとって テスト活動に取り組んでいます ● QAEチーム自体の取り組みが活発です! ○ QAE技術顧問 ブロッコリーさん の相談会 ■ 進行しているPJのテスト分析やテスト設計のレビュー ■ リリース済みのPJの振り返り ■ 開発プロセスの中でのQAEチームの動き方の相談 ○ QAEチーム単体での勉強会 ■ 輪読会(Agile Testing Condensed) ■ テスト技法の勉強会(ソフトウェアテスト技法の練習帳) ● 絶賛QAE募集中です!(シニアQAEも大歓迎!) 詳しくはQRか、下記で検索をお願いします! 🙏 iCARE 求人 QAE 

Slide 116

Slide 116 text

おしまい