第191回: 「ソフトウェアテストしようぜ」8 CDプレイヤー(1. テスト分析の前編)
◀前の記事へ 次の記事へ▶
≡ はじめに
前回は、「洗濯機」のソフトウェアテストの後編を書きました。
内容は、「操作順序を網羅しよう」でした。
トラブルのクレームが入った時に、「こういう順番で操作したら、したいことはできませんか?」と提案をして解決してしまうことがあります。
開発側からすると、「どうして、そんな使い方をするかな~」って言いたくなるケースもあります。
そこで、前回は、操作順序を網羅する方法として状態遷移図を描いて2スイッチテストをつくる方法について説明しました。GIHOZを使えば一瞬で正しい表ができるので、お勧めです。
ところが、この方法(2スイッチテスト)にはテストケースの数がそこそこ多くなるという弱点があります。
k個の操作があるときに、3つの操作順序に限定しても、1番目と2番目と3番目の操作を自由にk個の操作から選べるわけですから、kの3乗個(k×k×k個)のテストケースとなります。4→64、5→125、、、下表のとおりです。
自動化をする(ロボットにボタンを押してもらう)としても、7個の操作対象について3つの全順序の網羅(343件)が私の我慢の限度です。
°(° ˆᴗˆ °)°。
そこで、シーケンスカバリングアレイというテスト技法を紹介しました。シーケンスカバリングアレイを使えば、操作対象が10個あったときでも、網羅的観点で優先すべきテストを14件に絞り込めるからです。
私はテストを考えるときにいつも「将棋崩し」という遊びをイメージします。全体を見て、取りやすくて高得点の駒を探してそこから取るイメージです。
もっとも、「そもそも、そんなに多くの操作対象の順序を気にする必要があるアーキテクチャーにするな」という話はあります。正論で王道です。
しかしながら、開発がかなり進んでから追加要求があって実装した機能は操作順序の考慮が不足していることが多いです。
開発途中の追加機能(いわゆる仕様変更=仕変)が多数あると追加機能の単体テストは通っても、組合せや順序関係のテストが大変です。
私は、システムにセキュリティを高める仕組みを後付けして失敗しているところを何度も見ています。「ココだ!」というポイントを押さえてセキュリティ機能を実現していないソフトウェアをテストするときには十分に注意しましょう。
さて、今回はCDプレイヤーがお題です。CDプレイヤーはこれまでの題材よりも複雑なので【テスト分析】プロセスに絞っています。
≡ お題(CDプレイヤー)の説明
今回のお題は、CDプレイヤーです。操作は、CDを差し込んだらあとはリモコン操作だけです。(本体にはボタンが付いていません)
リモコンのマニュアルはこちらです。
日本語のマニュアルもありました。
≡ テスト対象を理解する
毎回書いていますが、テストをつくる前に、テスト対象を理解することが何より大切です。
■ 機能を書き出す
私は、初めにテキストエディタを開いて機能を書き出します。今回なら、上のマニュアルをみてボタンの意味を書いていきます。抜けもれのないように左上から順番に。
機能のリストを書き出しながら「へぇ?そうなのか」、「ちょっと気になるな」と思ったことはメモしておきます。(今回はメモを太字にしています)
私は、仕様そのものを書き写すことよりも、その仕様の意味(や要求)を書くことが多いです。
こんな感じです。
電源
・電源のオン・オフ
・アラームの停止(電源ボタンでアラームが止まるって変)スリープ
・アラームのスヌーズ(SleepボタンでSnoozeするってわかる?)
・おやすみ機能 10-90分(ソースが何でも働く?)
・アラーム音の選択(なぜこんなに目覚まし機能が充実してる?)ミュート
・音を消す(ミュート状態でCDからラジオに切り替えたらどうなる?)
・消した音を戻す(間に別の操作が入っても大丈夫?)ラジオ
・ラジオをつける
・FMかAMを選択する(前回どちらだったか覚えている?)CD
・CDをつける(CDを差し込んだら動き出す? いつ使う?? ラジオやAUXからの切り替えのみ??? ラジオからCDに切り替えたら再生も始まる???? CDを聴いているときに押したらどうなる?????)AUX
・外部装置を聴く(ステレオとモノラルでテストを分ける?)音量
・音量の上下(最大+1上押する)プリセット
・押す:プリセットしたラジオ局を呼び出す
・押し続ける:ラジオ局のプリセット設定をする頭出し/トラック
・押す:ラジオとCDの次の場所や前の場所に飛ぶ(最後の次や最初の前は?)
・押し続ける:ラジオ周波数とCDトラックの早送り・早戻しプレイ/一時停止
・CDの再生
・CDの一時停止停止/イジェクト
・1度押し:CDの停止
・再押し:CDの取り出し((イジェクト直後の)CDを吸い込む機能もあるかな?)Tune/MP3
・押す:ラジオとMP3のフォルダー移動
・押し続ける:ラジオとCDの早送り、早戻し(トラック移動との違いは? MP3のこと知らなすぎる!)タイム
・時計の時刻設定のときの時刻変更
・アラームの設定のときの時刻変更プレイモード
・シャッフル、リピートへの切り替え(MP3のフォルダー単位のリピートは? シャッフル+リピートできる??)
・TALK RADIO mode(なにこれ?)アラーム
・アラーム時刻のセット
・アラーム機能のオン・オフ
太字のところは、ピンポイントでテストします。
マインドマップを描くこともあります。
マインドマップを描いたあとに、短い単語にすることと、MECEに気を付けてノードの追加や削除をします。マインドマップを描いたあとには、テキストファイルは捨てます。(二つ同時にメインテナンスするのは面倒だからです)
JSTQB的には末端のノードを【テストアイテム】と呼びます。末端のノードとは、テスト対象を単体テストを考える粒度まで分割した結果として見つかった「小さなテスト対象」のことです。
■ 上の作業は何をしたのか?
“はじめに”のところで、「今回は【テスト分析】プロセスのお話しです」と書きました。実は上で行った「機能を書き出す」という作業はテスト分析の一部です。機能を書き出した結果として、【テストアイテム】をみつけることができたのですから。
なんてこと思っていたら、榊原さんがいいことつぶやいていました。
「失敗してもいい、誰だって失敗するさ。でも、挑戦しないのはだめ。- マイケル・ジョーダン」でしょうか。
余談が長くなってしまいました。
書こうとしていたことは、「どんな機能があるか書き出そう」でしていたことの意味です。
これまでしてきたことは、「リモコンのボタンの機能を書き出す」ことでした。
サクッとソフトウェア工学の基本を勉強したいという人は、以下のサイトの石川先生の講義資料を読むといいですよ。
■ 分割方法
大きくて複雑な「テスト対象」を小さくて考えやすい「テストアイテム」に分割するときには以下の4つの方法があります。(多くの人が言っているので、誰が最初に言い始めたのか見つけられませんでした。清水吉男さんも似たようなことを仰っていました)
構成で分割する
今回やった方法はリモコンの構成がボタンからなっていることを使って、CDプレイヤーの機能を分割しました。
パソコンやスマホのアプリケーションなら「メニュー」で分割してもいいですし、扇風機なら「羽根」、「操作パネル」、「モーター」といった構成部品に分割してもいいです。
外部仕様書なら機能が並んでいることが多いですから、機能で分割してもいいです。時系列で分割する
時系列は分割するよりも、1で見つけた構成要素をグルーピングし、使う順番に並べるときに使うことが多いです。あとでCDプレイヤーの結果を示します。
カスタマージャーニーマップとかユーザーストーリーマッピングとかの手法を参考に、でも、フォーマットなんて気にせずに、大雑把に時系列にシステムを使用するときの流れを書いてそこに細かい機能を張り付けていきます。例えば、宿泊予約システムなら「宿泊情報の提供」→「予約申し込み受付」→「予約」→「リマインダ」→「精算」などの流れがあり、例えば「予約申し込み受付」のなかに「空き部屋検索」や「人数、宿泊日の入力」などがあり、、、と時系列で考えて分割する方法です。状態で分割する
CDプレイヤーですと音楽の再生状態などで分割します。「CD再生中の状態のときにセットしておいたアラーム時刻になったらアラームが鳴動すること」などのテストをつくります。
また、上に書いた宿泊予約システムなら、宿泊のステートには、「未予約」、「予約」、「宿泊中」、「宿泊後」、「代金支払後」といった状態があって、「代金支払後」でないと領収証を発行する機能は使えないとか、そういうことがありますので、テストします。
また、開発者は状態よりもプロセス思考で処理の流れをプログラミングすることが多いですから、テスト側では状態で分けてテストをすると、「ユーザーが退会すると、そのユーザーの領収証を発行する方法がない」といったバグ(仕様の不備?)が見つかることがあります。共通と固有で分ける
こちらも2と同じで、構成要素をグルーピングする(これを綜合といいます)ときに使います。「母体と派生」もこの一種です。
CDプレイヤーでは「音を鳴らす」という共通部分とCD/ラジオ/AUX/アラームという固有部分に分けてテストをつくります。
というように、分割をするときには、上記の4パターンを意識するとうまくできます。基本は構成を使って要素に分けて、それを時系列のカスタマージャーニーマップに張り付けるのが良いと思います。
■ CDプレイヤーを時系列で分割
それではCDプレイヤーで実施してみます。
上に書いたとおり、「時系列で分割」は、実際には、見つけた構成要素を「時系列でグルーピング」する作業となります。
結果はこんな感じです。
こちらの表ですが、次回実施する「テストアイテムのグループ間の関係からテスト条件を見つける」作業のときに使用します。
と、今回は料理で言えば下拵えでした。ちょっと大きいテストのときにはあとで効いてくるのでおすすめします。
≡ おわりに
今回は、「CDプレイヤー」のテストがテーマでした。大きなテストとなるので、テスト分析の、それも前半だけを行いました。
以下は、ASTER主催のテストセミナーで2020年あたりから私がテストケースをつくるまでの流れの概要を説明するために使用しているPFDです。
今回は「② 分析1」のところについて書きました。②では、テスト分析の前半にあたり、「テスト対象をテストアイテムに分割」するところまでを行います。その後、上述のようにゆるく時系列でテストアイテムの再構成をするのですが、ASTERセミナーは初級者向けなので、そこまでは説明していません。
JSTQBでは「テスト分析した結果、テスト条件が得られる」としています。
ということで、次回は「③ テスト分析2」の「テストアイテムからテスト条件」を見つける作業について書きます。具体的には、
個々のテストアイテムからテスト条件を見つける
テストアイテムのグループ間の関係からテスト条件を見つける
の2つの話を書く予定です。
「① 準備」の内容が気になる人がいらっしゃるかもしれませんので、説明のスライドだけ張っておきますね。(ついでに「② 分析1」も)
「HAYST法じゃないんですね?」という声が聞こえた気がするけど気にしない。