Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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. AI(ChatGPT-4)による
    テスト設計作成の
    現状を評価する
    ブロッコリー
    @nihonbuson

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. Copyright ©iCARE Co.,Ltd All Rights Reserved.

    健康課題を可視化するCarely
    業務のデジタル化 

    4
    4
    ストレスチェック
    健康診断管

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. AIへの入力内容

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. お題1に対する
    考察

    View full-size slide

  32. テスト設計内容に対する考察
    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値による境界値分析

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  50. お題2に対する
    考察

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  56. お題3:
    状態遷移

    View full-size slide

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

    - スタートボタン
    - リセットボタン
    ストップウォッチのイラスト - いらすとや

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  73. お題3に対する
    考察

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  88. 番外編に対する
    考察

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  102. ChatGPT-4との
    付き合い方

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  105. やらない方が良いこと

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  109. おわりに

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  115. ©iCARE Co.,Ltd

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

    View full-size slide

  116. おしまい

    View full-size slide