複数条件が関わるお題を用いてテスト設計から自動テストのケース作成まで考えてみたのブロッコリー(@nihonbuson)
View Slide
はじめに:本日のお題下記の画像は座席順番待ちシステムの入力画面です。この店では、大人と子供合わせて最大4名まで予約できます。氏名は10文字まで入力可能であり、入力必須です。この入力画面を用いて、順番待ちの登録ができるかどうかのテストを考えてください。
今回の発表の楽しみ方● 最初に問題を提示するので、それをお手元で解いた上で参加すると楽しめます● WACATE 2021冬に参加した方は、「デシジョンテーブルで振る舞いを整理しよう」のセッションを思い出しつつ参加すると楽しめます
自己紹介● 風間裕也(ブロッコリー)● @nihonbuson● 社外活動○ JaSST Review実行委員長○ WACATE実行委員● 執筆活動○ 『テストコードの注入から始めるレガシーコードのリファクタリング』○ 『Agile Testing Condensed』翻訳○ 『Testing in DevOps』翻訳
アジェンダ● 今回のお題発表● 愚直にデシジョンテーブルを書く● デシジョンテーブルを簡単化する● テストプロセスを踏まえて今回のお題を解く● 別のテスト技法を用いて考える● テスト設計の成果物を元にテスト実装を行う● PICTを用いて解いてみる● 自動テストへの適用を考える
アジェンダ● 今回のお題発表● 愚直にデシジョンテーブルを書く● デシジョンテーブルを簡単化する● テストプロセスを踏まえて今回のお題を解く● 別のテスト技法を用いて考える● テスト設計の成果物を元にテスト実装を行う● PICTを用いて解いてみる● 自動テストへの適用を考える時間の許す限り話す最低ここまで話す
45分以上喋っちゃうかも?
注意点● 今回の発表は発表者個人のやり方・考えを述べたものです。● お題に対して「これが正解」という話ではありません○ 「私が考えたやり方がより良い!」という意見がありましたら、ぜひ教えてください!● 今回の発表を行うにあたり、JSTQB、JISなどを参考にしたものの、表記ルールはそれらに沿っていません。
今回のお題
お題下記の画像は座席順番待ちシステムの入力画面です。この店では、大人と子供合わせて最大4名まで予約できます。氏名は10文字まで入力可能であり、入力必須です。この入力画面を用いて、順番待ちの登録ができるかどうかのテストを考えてください。
解法の方針
解法の方針● 順番待ちの登録(予約)ができるかどうかについては、入力値の条件の組み合わせパターンを考えた方が良さそう● そこで、デシジョンテーブルを使って組み合わせパターンを洗い出すことにした
因子水準を考える
愚直に全組み合わせのデシジョンテーブルを書く
条件と期待値を記述する
全組み合わせを書こうとする※今回は、同一因子内の 各水準が排他関係 である前提で 適用したい条件は"◯" 適用しない条件は空欄 で表記しています。
全組み合わせを書こうとする(名前)×(大人の人数)×(子供の人数)×(印刷)= 3×5×5×2 =150通り
予約番号の印刷を任意にする
予約番号の印刷は結果に影響しない(無則)今回、テストしたい内容は「順番待ちの登録」ができるかどうかなので、予約番号の印刷はスコープ外として考える。→「-」と表記
予約番号を任意にして書いてみる(名前)×(大人の人数)×(子供の人数)×(印刷)= 3×5×5×1 =75通り
予約番号の印刷の因子を外す予約番号の印刷は今回のデシジョンテーブルの因子から外した。
名前の因子と人数の因子を別表にする
それぞれで因子水準を分けて書いてみる名前と人数の組み合わせで予約できるかを網羅的に確認する必要が無さそうなので、それぞれで因子水準表を分けて記述する
別々にデシジョンテーブルを書いてみる(名前)+(大人の人数)×(子供の人数)= 3+5×5 =28通り※↑は、もはやデシジョンテーブルではないですが…
あれ?ちょっと待って!ここで書いた表はそれぞれ単体の条件でエラーメッセージが出るか確認する表です。両方ともエラーの場合は別の表にした方が良さそうです。それだと、人数も名前も適切じゃない時に、きちんと両方ともエラーメッセージが出るか確認してないじゃないか!
両方とも無効なテストは別にして考える
両方とも無効なテストは別にして考える別のテスト
同値クラスを整理する
当然のように書いていたけど…各文字数ごとに水準を分けても記述できる。そうしなかったのは「1文字〜10文字」を有効同値クラスとして捉えたため。(同値分割法)
人数の同値クラスを考える1名〜3名を同値クラスとして捉えた。
デシジョンテーブルを書いてみる(大人の人数)×(子供の人数)= 3×3 =9通り となった。
デシジョンテーブルを書いてみる(大人の人数)×(子供の人数)= 3×3 =9通り となった。ただし、?が出てきてしまった…例えば、・大人1名、子供1名…◯・大人3名、子供2名…×
合計人数という因子を加えてみる合計人数が予約可否の判断に関わるので、合計人数を因子として加えて表現する。
合計人数の因子も含めたデシジョンテーブル実施不可能なもの(禁則)の期待値にはN/A(Not Applicable、適用不可)と表記する例)大人の人数が0名、子供の人数が0名で、 合計人数が1〜3名の設定はできない
N/Aの部分(禁則)を省略するN/Aの部分は自明なので、省略して記述する。
デシジョンテーブル見比べると…?の部分が、2つのケースに分かれて表現された
ここまでのまとめ
ここまでのまとめ● 愚直に全て書き出すと150通り● 予約番号の印刷は予約登録の期待結果に影響しないため、因子から除外(150→75通り)● 名前の因子と人数の因子を別々に考える(3×5×5=75→3+5×5=28通り)● 人数の同値クラスを考える○ 合計人数という因子も含めてみる(28→3+10=13通り)
それぞれのデシジョンテーブルにおけるテスト観点図を考える
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)何をテストするかそれをどうテストするかテストの実行に必要なものすべてを準備したかテストスイートを実行する参考:ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2018V3.1.J03
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成テスト手順作成自動テストスクリプト作成デシジョンテーブル作成
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)デシジョンテーブル作成テスト手順作成自動テストスクリプト作成テスト観点図作成
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成デシジョンテーブル作成テスト手順作成自動テストスクリプト作成
初期のテスト観点
初期のテスト観点(名前)×(大人の人数)×(子供の人数)×(印刷)= 3×5×5×2 =150通り
無則な観点を削る
無則な観点を削る(名前)×(大人の人数)×(子供の人数)×(印刷)= 3×5×5×1 =75通り
名前と人数で条件を別々にまとめた場合
名前と人数で条件を別々にまとめた場合(名前)+(大人の人数)×(子供の人数)= 3+5×5 =28通り※↑は、もはやデシジョンテーブルではないですが…
合計人数の条件を含めた場合
人数の同値クラスと合計人数で考える(名前のテスト)+(人数のテスト)= 3+10 =13通り
150通り75通り
3+25通り3+10通り
別のテスト技法を用いて考える
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成デシジョンテーブル作成テスト手順作成自動テストスクリプト作成別のテスト設計技法
ドメイン分析で考えるx+y≦4y≦4x≦4x≧0y≧0x+y≧1赤色の部分が、予約できる範囲
ドメイン分析で考えるy≦4x≦4x≧0y≧0ONポイント OFFポイント OFFポイント(テスト不可)x+y≦4x+y≧1
【注意】ドメイン分析技法は応用です
テスト設計の成果物を元にテスト実装を行う
名前についてのテスト設計成果物
名前についてのテスト実装の例
テスト設計とテスト実装の関係性
テスト設計とテスト実装が1:1とは限らない
実装実施時要検討事項の存在テスト設計に出てこない条件=実装実施時要検討事項
実装実施時要検討事項の出所
実装実施時要検討事項を考慮しないと…出てくるパラメータを全てテスト条件として、組み合わせを考えよう!→全組み合わせ(今回の場合150通りのテストパターン) が出てきてしまう
各テスト設計のテスト条件との関係性
PICTを用いてペアワイズテストを書いてみる
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成デシジョンテーブルテスト手順作成自動テストスクリプト作成ドメイン分析技法
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成デシジョンテーブルテスト手順作成自動テストスクリプト作成ドメイン分析技法PICTを用いたペアワイズテスト法
PICTでテストパターンを書き出す150通り→25通りになった!
PICTで作成したテストパターンだと…予約可能パターンのうち、#1, #15, #16 は予約できず#20は予約できた。(#1, #15, #16が期待値通りにならない不具合)不具合の原因はどこ?
自動テストの理解容易性にも影響する
テスト実行するまでの過程テスト分析テスト設計テスト実装テスト実行テストプロセス(JSTQBより)テスト観点図作成デシジョンテーブル テスト手順作成自動テストスクリプト作成ドメイン分析技法PICTを用いたペアワイズテスト
PICTの場合でテスト実行
そもそも今回のお題でPICTを使うのはNG詳しくはブログに書いてます。「全網羅テスト」という言葉について〜または、ペアワイズ法、直交表、PICT活用時の落とし穴〜#テストアドカレhttps://nihonbuson.hatenadiary.jp/entry/AllCoverageTrap
【注意】ペアワイズテストは応用ですペアワイズテスト直交表など
デシジョンテーブルで作成したテストパターン
デシジョンテーブルの場合でテスト実行
おわりに
まとめ● テスト観点で整理すると、適切な因子水準を考えることができる● 直接組み合わせる必要がないものは、別々のデシジョンテーブルにすることで、テストパターンが掛け算ではなく足し算になる● 複数の因子の組み合わせで別の因子が出てくる場合、ドメイン分析が活用できる● テスト実装の際は、テスト設計の成果物で理解した必要な情報のみを記載する● 適切なテスト設計は自動テストの理解容易性も高まる
アドベントカレンダーの記事にします!● 今回のお題発表● 愚直にデシジョンテーブルを書く● デシジョンテーブルを簡単化する● テストプロセスを踏まえて今回のお題を解く● 別のテスト技法を用いて考える● テスト設計の成果物を元にテスト実装を行う● PICTを用いて解いてみる● 自動テストへの適用を考えるソフトウェアテスト Advent Calendar22日目自動テスト・テスト自動化 Advent Calendar 24日目
ちゃんとした書き方を知りたい人はこちらhttps://speakerdeck.com/imtnd/analyze-the-behavior-with-decision-table
おしまい