Slide 1

Slide 1 text

複数条件が関わるお題を用いて テスト設計から 自動テストのケース作成まで 考えてみたの ブロッコリー (@nihonbuson)

Slide 2

Slide 2 text

はじめに:本日のお題 下記の画像は座席順番待ちシステムの入力画面です。 この店では、大人と子供合わせて最大4名まで予約できます。 氏名は10文字まで入力可能であり、入力必須です。 この入力画面を用いて、 順番待ちの登録ができるかどうかのテストを考えてください。

Slide 3

Slide 3 text

今回の発表の楽しみ方 ● 最初に問題を提示するので、 それをお手元で解いた上で参加すると楽しめます ● WACATE 2021冬に参加した方は、 「デシジョンテーブルで振る舞いを整理しよう」の セッションを思い出しつつ参加すると楽しめます

Slide 4

Slide 4 text

自己紹介 ● 風間裕也(ブロッコリー) ● @nihonbuson ● 社外活動 ○ JaSST Review実行委員長 ○ WACATE実行委員 ● 執筆活動 ○ 『テストコードの注入から始める レガシーコードのリファクタリング』 ○ 『Agile Testing Condensed』翻訳 ○ 『Testing in DevOps』翻訳

Slide 5

Slide 5 text

アジェンダ ● 今回のお題発表 ● 愚直にデシジョンテーブルを書く ● デシジョンテーブルを簡単化する ● テストプロセスを踏まえて今回のお題を解く ● 別のテスト技法を用いて考える ● テスト設計の成果物を元にテスト実装を行う ● PICTを用いて解いてみる ● 自動テストへの適用を考える

Slide 6

Slide 6 text

アジェンダ ● 今回のお題発表 ● 愚直にデシジョンテーブルを書く ● デシジョンテーブルを簡単化する ● テストプロセスを踏まえて今回のお題を解く ● 別のテスト技法を用いて考える ● テスト設計の成果物を元にテスト実装を行う ● PICTを用いて解いてみる ● 自動テストへの適用を考える 時間の許す限り話す 最低ここまで話す

Slide 7

Slide 7 text

45分以上喋っちゃうかも?

Slide 8

Slide 8 text

注意点 ● 今回の発表は発表者個人のやり方・考えを 述べたものです。 ● お題に対して「これが正解」という話ではありません ○ 「私が考えたやり方がより良い!」という 意見がありましたら、ぜひ教えてください! ● 今回の発表を行うにあたり、JSTQB、JISなどを参考に したものの、表記ルールはそれらに沿っていません。

Slide 9

Slide 9 text

今回のお題

Slide 10

Slide 10 text

お題 下記の画像は座席順番待ちシステムの入力画面です。 この店では、大人と子供合わせて最大4名まで予約できます。 氏名は10文字まで入力可能であり、入力必須です。 この入力画面を用いて、 順番待ちの登録ができるかどうかのテストを考えてください。

Slide 11

Slide 11 text

解法の方針

Slide 12

Slide 12 text

解法の方針 ● 順番待ちの登録(予約)ができるかどうかについては、 入力値の条件の組み合わせパターンを考えた方が良さそう ● そこで、デシジョンテーブルを使って 組み合わせパターンを洗い出すことにした

Slide 13

Slide 13 text

因子水準を考える

Slide 14

Slide 14 text

因子水準を考える

Slide 15

Slide 15 text

愚直に全組み合わせの デシジョンテーブル を書く

Slide 16

Slide 16 text

条件と期待値を記述する

Slide 17

Slide 17 text

全組み合わせを書こうとする ※今回は、同一因子内の  各水準が排他関係  である前提で  適用したい条件は"◯"  適用しない条件は空欄  で表記しています。

Slide 18

Slide 18 text

全組み合わせを書こうとする (名前)×(大人の人数)×(子供の人数)×(印刷) = 3×5×5×2 =150通り

Slide 19

Slide 19 text

予約番号の印刷を 任意にする

Slide 20

Slide 20 text

予約番号の印刷は結果に影響しない(無則) 今回、 テストしたい内容は 「順番待ちの登録」 ができるかどうか なので、 予約番号の印刷は スコープ外として 考える。 →「-」と表記

Slide 21

Slide 21 text

予約番号の印刷は結果に影響しない(無則) 今回、 テストしたい内容は 「順番待ちの登録」 ができるかどうか なので、 予約番号の印刷は スコープ外として 考える。 →「-」と表記

Slide 22

Slide 22 text

予約番号を任意にして書いてみる (名前)×(大人の人数)×(子供の人数)×(印刷) = 3×5×5×1 =75通り

Slide 23

Slide 23 text

予約番号の印刷の因子を外す 予約番号の印刷は 今回の デシジョンテーブル の因子から外した。

Slide 24

Slide 24 text

名前の因子と人数の因子 を別表にする

Slide 25

Slide 25 text

それぞれで因子水準を分けて書いてみる 名前と人数の組み合わせで予約できるかを 網羅的に確認する必要が無さそうなので、 それぞれで因子水準表を分けて記述する

Slide 26

Slide 26 text

別々にデシジョンテーブルを書いてみる (名前)+(大人の人数)×(子供の人数) = 3+5×5 =28通り ※↑は、もはや デシジョンテーブルでは ないですが…

Slide 27

Slide 27 text

あれ?ちょっと待って! ここで書いた表はそれぞれ単体の条件で エラーメッセージが出るか確認する表です。 両方ともエラーの場合は別の表にした方が良さそうです。 それだと、 人数も名前も適切じゃない時に、 きちんと両方とも エラーメッセージが出るか 確認してないじゃないか!

Slide 28

Slide 28 text

両方とも無効なテストは別にして考える

Slide 29

Slide 29 text

両方とも無効なテストは別にして考える

Slide 30

Slide 30 text

両方とも無効なテストは別にして考える

Slide 31

Slide 31 text

両方とも無効なテストは別にして考える 別のテスト

Slide 32

Slide 32 text

同値クラスを整理する

Slide 33

Slide 33 text

当然のように書いていたけど… 各文字数ごとに 水準を分けても 記述できる。 そうしなかったのは 「1文字〜10文字」を 有効同値クラス として捉えたため。 (同値分割法)

Slide 34

Slide 34 text

人数の同値クラスを考える 1名〜3名を同値クラスとして捉えた。

Slide 35

Slide 35 text

デシジョンテーブルを書いてみる (大人の人数)×(子供の人数) = 3×3 =9通り となった。

Slide 36

Slide 36 text

デシジョンテーブルを書いてみる (大人の人数)×(子供の人数) = 3×3 =9通り となった。 ただし、?が出てきてしまった… 例えば、 ・大人1名、子供1名…◯ ・大人3名、子供2名…×

Slide 37

Slide 37 text

合計人数という因子を加えてみる 合計人数が予約可否の 判断に関わるので、 合計人数を因子として 加えて表現する。

Slide 38

Slide 38 text

合計人数の因子も含めたデシジョンテーブル 実施不可能なもの(禁則)の期待値には N/A(Not Applicable、適用不可)と表記する 例)大人の人数が0名、子供の人数が0名で、   合計人数が1〜3名の設定はできない

Slide 39

Slide 39 text

N/Aの部分(禁則)を省略する N/Aの部分は自明なので、省略して記述する。

Slide 40

Slide 40 text

デシジョンテーブル見比べると… ?の部分が、 2つのケースに 分かれて 表現された

Slide 41

Slide 41 text

ここまでの まとめ

Slide 42

Slide 42 text

ここまでのまとめ ● 愚直に全て書き出すと150通り ● 予約番号の印刷は予約登録の期待結果に 影響しないため、因子から除外(150→75通り) ● 名前の因子と人数の因子を別々に考える (3×5×5=75→3+5×5=28通り) ● 人数の同値クラスを考える ○ 合計人数という因子も含めてみる (28→3+10=13通り)

Slide 43

Slide 43 text

それぞれの デシジョンテーブル における テスト観点図を考える

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 テスト手順 作成 自動テスト スクリプト作成 デシジョン テーブル作成

Slide 46

Slide 46 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) デシジョン テーブル作成 テスト手順 作成 自動テスト スクリプト作成 テスト 観点図作成

Slide 47

Slide 47 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル作成 テスト手順 作成 自動テスト スクリプト作成

Slide 48

Slide 48 text

初期のテスト観点

Slide 49

Slide 49 text

初期のテスト観点 (名前)×(大人の人数)×(子供の人数)×(印刷) = 3×5×5×2 =150通り

Slide 50

Slide 50 text

無則な観点を削る

Slide 51

Slide 51 text

無則な観点を削る (名前)×(大人の人数)×(子供の人数)×(印刷) = 3×5×5×1 =75通り

Slide 52

Slide 52 text

名前と人数で条件を別々にまとめた場合

Slide 53

Slide 53 text

名前と人数で条件を別々にまとめた場合 (名前)+(大人の人数)×(子供の人数) = 3+5×5 =28通り ※↑は、もはや デシジョンテーブルでは ないですが…

Slide 54

Slide 54 text

合計人数の条件を含めた場合

Slide 55

Slide 55 text

人数の同値クラスと合計人数で考える (名前のテスト)+(人数のテスト)= 3+10 =13通り

Slide 56

Slide 56 text

150通り 75通り

Slide 57

Slide 57 text

3+25通り 3+10通り

Slide 58

Slide 58 text

別のテスト技法を 用いて考える

Slide 59

Slide 59 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル作成 テスト手順 作成 自動テスト スクリプト作成

Slide 60

Slide 60 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル作成 テスト手順 作成 自動テスト スクリプト作成 別のテスト 設計技法

Slide 61

Slide 61 text

ドメイン分析で考える x+y≦4 y≦4 x≦4 x≧0 y≧0 x+y≧1 赤色の部分が、予約できる範囲

Slide 62

Slide 62 text

ドメイン分析で考える y≦4 x≦4 x≧0 y≧0 ONポイント OFFポイント OFFポイント(テスト不可) x+y≦4 x+y≧1

Slide 63

Slide 63 text

【注意】ドメイン分析技法は応用です

Slide 64

Slide 64 text

テスト設計の 成果物を元に テスト実装を行う

Slide 65

Slide 65 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル作成 テスト手順 作成 自動テスト スクリプト作成 別のテスト 設計技法

Slide 66

Slide 66 text

名前についてのテスト設計成果物

Slide 67

Slide 67 text

名前についてのテスト実装の例

Slide 68

Slide 68 text

テスト設計とテスト実装の関係性

Slide 69

Slide 69 text

テスト設計とテスト実装が1:1とは限らない

Slide 70

Slide 70 text

テスト設計とテスト実装が1:1とは限らない

Slide 71

Slide 71 text

実装実施時要検討事項の存在 テスト設計に出てこない条件 =実装実施時要検討事項

Slide 72

Slide 72 text

実装実施時要検討事項の出所

Slide 73

Slide 73 text

実装実施時要検討事項を考慮しないと… 出てくるパラメータを 全てテスト条件として、組み合わせを考えよう! →全組み合わせ(今回の場合150通りのテストパターン)  が出てきてしまう

Slide 74

Slide 74 text

各テスト設計のテスト条件との関係性

Slide 75

Slide 75 text

PICTを用いて ペアワイズテストを 書いてみる

Slide 76

Slide 76 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル テスト手順 作成 自動テスト スクリプト作成 ドメイン分析 技法

Slide 77

Slide 77 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル テスト手順 作成 自動テスト スクリプト作成 ドメイン分析 技法 PICTを用いた ペアワイズテスト法

Slide 78

Slide 78 text

PICTでテストパターンを書き出す 150通り→25通りになった!

Slide 79

Slide 79 text

PICTで作成したテストパターンだと… 予約可能パターンのうち、 #1, #15, #16 は予約できず #20は予約できた。 (#1, #15, #16が期待値通り にならない不具合) 不具合の原因はどこ?

Slide 80

Slide 80 text

自動テストの 理解容易性にも 影響する

Slide 81

Slide 81 text

テスト実行するまでの過程 テスト 分析 テスト 設計 テスト 実装 テスト 実行 テストプロセス(JSTQBより) テスト 観点図作成 デシジョン テーブル テスト手順 作成 自動テスト スクリプト作成 ドメイン分析 技法 PICTを用いた ペアワイズテスト

Slide 82

Slide 82 text

PICTで作成したテストパターンだと… 予約可能パターンのうち、 #1, #15, #16 は予約できず #20は予約できた。 (#1, #15, #16が期待値通り にならない不具合) 不具合の原因はどこ?

Slide 83

Slide 83 text

PICTの場合でテスト実行

Slide 84

Slide 84 text

そもそも今回のお題でPICTを使うのはNG 詳しくはブログに書いてます。 「全網羅テスト」という言葉について 〜または、ペアワイズ法、直交表、PICT活用時の落とし穴〜 #テストアドカレ https://nihonbuson.hatenadiary.jp/entry/AllCoverageTrap

Slide 85

Slide 85 text

【注意】ペアワイズテストは応用です ペアワイズ テスト 直交表など

Slide 86

Slide 86 text

デシジョンテーブルで作成したテストパターン

Slide 87

Slide 87 text

デシジョンテーブルの場合でテスト実行

Slide 88

Slide 88 text

おわりに

Slide 89

Slide 89 text

まとめ ● テスト観点で整理すると、 適切な因子水準を考えることができる ● 直接組み合わせる必要がないものは、 別々のデシジョンテーブルにすることで、 テストパターンが掛け算ではなく足し算になる ● 複数の因子の組み合わせで別の因子が出てくる場合、 ドメイン分析が活用できる ● テスト実装の際は、テスト設計の成果物で理解した 必要な情報のみを記載する ● 適切なテスト設計は自動テストの理解容易性も高まる

Slide 90

Slide 90 text

アドベントカレンダーの記事にします! ● 今回のお題発表 ● 愚直にデシジョンテーブルを書く ● デシジョンテーブルを簡単化する ● テストプロセスを踏まえて今回のお題を解く ● 別のテスト技法を用いて考える ● テスト設計の成果物を元にテスト実装を行う ● PICTを用いて解いてみる ● 自動テストへの適用を考える ソフトウェアテスト Advent Calendar22日目 自動テスト・テスト自動化 Advent Calendar 24日目

Slide 91

Slide 91 text

ちゃんとした書き方を知りたい人はこちら https://speakerdeck.com/imtnd/analyze-the-behavior-with-decision-table

Slide 92

Slide 92 text

おしまい