第186回: 「ソフトウェアテストしようぜ」3 シーリングライト
◀前の記事へ 次の記事へ▶
≡ はじめに
前回は、「庫内スイッチ」のソフトウェアテストの話を書きました。
内容としては、「機能間の結びつき」をテストしているというものでした。そして、「機能間の結びつきが複雑になってきたらFRAMでモデル化(図化)して疑問点は作った人に確認してテストしている」という話を書きました。
冷蔵庫内の照明スイッチだけで、そんなことを考えるのか?と思われた人もいるかもしれませんが、【私は、それを考えることがパズルを解くときのように面白いから普通にするけど……】というだけの話です。
さて、今回のお題は、私の部屋の天井についている「シーリングライト」です。
≡ お題(シーリングライト)の説明
前回の再掲になりますが、お題の説明です。

私の部屋の天井についているシーリングライト(照明機器)です。シーリングライトのくせに間接照明になっている点が気に入っています。
リモコンはこちらです。

それぞれのボタンの意味は以下の通りです。
全灯: 一番明るく点灯する(100%点灯モード)
お好みの明るさ: 明暗ボタンで明るさを10段階変化できる(調光モード)
ブルーライト(💡): ブルーライトが点灯する(ブルーライトモード)
消灯: 明かりが消える
明: 明るくなる(明るさは記憶する)
暗: 暗くなる(明るさは記憶する)
です。ブルーライトとはこんなのです。

※ ブルーライトの明るさの強さは変えられません。
≡ テスト対象を理解する
テストを作る前に、テスト対象を理解することが何より大切です。
前回の公開直後、こんなツイートをいただきました。
次回のお題のシーリングライトリモコン、この手のものはチャネル切替スイッチがあるはずなんだが、扱いをどうするのかな。(写真の機種は右側面のはず)
— AA (@ahiruhiyoko) July 16, 2022
チャネル間違って「目的の照明が点灯/消灯しない」というエラー(ユーザーによっては回避・回復不可能で致命的)が起こるのだけど。 https://t.co/6uZMujfyGw
AAさん、勘がよすぎです。リプライツイは、
あああ。だからリモコン左側から写したのにもうバレてる。
— あきやま🍧 (@akiyama924) July 16, 2022
みなさん、鋭すぎます。
「みなさん」って書いたけど、AAさんだけかもしれません。
リモコンを別角度から撮ってみます。

該当箇所をリモコンの裏から撮ってみます。

このように、CH 1,2,3の3つの周波数チャンネルの切り替えができます。この機能があることで、例えば大広間に複数のシーリングライトが設置してあるときに、一つのリモコンで3つのライトを操作することができます。
ところが、この機能、AAさんが指摘されたとおり、普通の部屋で使うときには、
チャネル間違って「目的の照明が点灯/消灯しない」というエラー(ユーザーによっては回避・回復不可能で致命的)が起こるのだけど。
なんですよね。何かの拍子にスイッチが切り替わって、「リモコンが利かなくなった」って騒ぐやつです。(笑)
今、「何かの拍子」と書きましたが、切替スイッチはけっこうかたいので、それと知らない小さなお子さんが切り替えちゃったか、もっとあるのが、自分が「これってなんだろう?」って思って、切り替えたことを忘れてしまうパターンかと思います。
以上のことから、仕事のテストのときなら真っ先に確認したいUI/UXのテストです。カテゴリでいえば、「使用性の非機能テストタイプ」かな。
また、リナさんからは以下の指摘をいただきました。
明るさってどうやって測るのかよくわからんけど、測れるとしたら、100%の明るさはかって、そこから暗いで10%ずつ暗くなるのとその逆をしてみるよね。
— リナ? (@____rina____) July 18, 2022
あと、白いのと黄色いのは試したい
リモコンどっかいったらどうなるのかな?
こちらの観点はまったく考えていなかったので、すばらしいなーと思いました。確かに、例えば、水道の蛇口とか、同じだけ動かしても開くときと締めるときでは水量に違いがあるんですよね。
白いのと黄色いのは蛍光灯の種類のことかな。リモコンがどっかいったときの話は後で出てきます。
また、
自分が普段の生活で使うならーが基本にあって、知らないことは調べつつさらに疑問があれば掘ってく感じぽい
— リナ? (@____rina____) July 18, 2022
仕様とか要件見るのその後とか並行して見そう
は、仕事でテストするときにも思い出したいお言葉です。バリデーションの観点大事です。
≡ テストを作成する(ステップ1)
それでは、今回も2ステップに分けて、“私はこういうテストを考えた”ってことを書いていきます。
私の場合は、2段階に分けてテストを作成しています。
ステップ1では、直感で「これはするだろう」というテストを書き出します。そして、ステップ1で思いついたテストは、「論理的に考えると不要そうに見えても実施する」ことにしています。
(案外、テストでは「直感があたる」から)
今回は、
リモコンで切り入りしたときと、部屋の物理スイッチとの関係
をテストしたいと思いました。

上は、部屋の物理スイッチの写真です。どこの家庭にもあると思います。
仕様に書いていないことを「ずるい」と思わないでください。「『暗黙の仕様』を考慮すべき」と前回、書いたとおりです。
実際、全灯のときに、物理スイッチを「早く切り入り」すると、シーリングライトはブルーライトモードになります。「調光モードだったときにはどうなるのか?」などなど気になりますよね。
一般的な話をすれば、「同じ機能を複数の操作で実現できる個所は念入りにテストする」ことをお勧めします。
私が知っているだけでも、「携帯電話で音楽を聴いているときに電話が来たので、イヤホンの途中にある音量切替スイッチで音楽を停めたら着信が切れた(携帯電話本体で音楽を停めたら通話に進める)」とか、「内視鏡装置本体の撮影ボタンだと問題なく写真が撮れるのに、足で操作するフットボタンだと失敗するケースがある」とか「高速プリンターで操作パネルからの印刷中止はいつでも問題なく利くのに、本体についている緊急停止ボタンが利かないケースがある」などたくさんあります。
最初のケースは携帯電話の大リコール(回収)になり連日報道されていたのでご存じの方もいらっしゃるかもしれません。
≡ テストを作成する(ステップ2)
次にステップ2です。
こうして、直感でしたいと思うテストのほかに、仕様を網羅するテストも考えます。こちらは、「表」と「裏」を考えます。
■ 表のテスト
まずは、普通に仕様を網羅するテストを作ります。今回でいえば、状態遷移モデルを利用します。
状態遷移テストをつくるのには、GIHOZを使うことをお勧めします。簡単にきれいな図が描けますし、そこから、テストパターンの生成もおこなってくれるからです。
まずは、仕様を確認し、そこから状態遷移図をGIHOZで描きます。
全灯: 一番明るく点灯する(100%点灯モード)
お好みの明るさ: 明暗ボタンで明るさを10段階変化できる(調光モード)
ブルーライト(💡): ブルーライトが点灯する(ブルーライトモード)
消灯: 明かりが消える
明: 明るくなる(明るさは記憶する)
暗: 暗くなる(明るさは記憶する)
状態遷移図は、「状態」を先に見つけるとよいです。この仕様でいえば、「100%点灯モード」、「調光モード」、「ブルーライトモード」、「消灯」が状態となります。
状態を辞書で引くと、「移り変わってゆく、人や物事のある時期におけるありさま」とあります。まずは、この意味で見つけたら良いと思います。
今回なら、「シーリングライトのある時期におけるありさま」です。
シーリングライトのありさまとして区別できるのは「点いてる」、「消えてる」、「ブルーライト」です。
今回は「明るさを10段階変化できる」仕様ですから、「点いている」を「明るさ1」、「明るさ2」、「明るさ3」、「明るさ4」、「明るさ5」、「明るさ6」、「明るさ7」、「明るさ8」、「明るさ9」、「明るさ10」に分けて、そこに「消えてる」と「ブルーライト」の2つの状態を加えた12の状態があります。(リナさんの指摘を考慮すると「明るさ〇(〇は2-8)」は、「明るさ〇ー1から[明]ボタンを押した明るさ〇」と、「明るさ〇+1から[暗]ボタンを押した明るさ〇」の2つに分かれますから、さらに8個の状態が増えます。そういう意味では全灯状態と調光中のもっとも明るい状態は、たとえ同じ明るさだったとしても分ける方が良いでしょう。
「ソフトウェアテストではこのように最大のテストを考えてそこから、同値分割法で、『これとこれは同じとみなしてしまおう』と減らすほうが良いです」
ここでは、最初に考えた4つの状態で話を進めます。GIHOZにアクセスして状態を入力します。

ここまで行けば、あとは、状態から状態へ線が引ける(=遷移できる)かなと考えて線を引けばOKです。

なんか、ごちゃごちゃして線の引き忘れがないか、心配になりますが、GIHOZでは状態遷移図の下ににある[状態遷移表とテストケースを更新]ボタンを押せば大丈夫です。

ボタンを押すと以下の状態遷移表が得られます。この表で線の引き忘れに気が付きます。
1スイッチテストを実施することで、調光した明るさを記憶していることを確認できます。

CSVとして手元にも保存できるのはうれしいですね。
画面をスクロールしていくと、テストケースの一覧表がでてきますので、こちらをテストします。これが「表」のテストです。


ここで、1つ注意してほしいことがあります。それは「1スイッチのテストケース」には、「無効遷移」が現れないことです。
例えば、「消灯」状態のときに、「消灯ボタン」を押すと、無効遷移なので「消灯」状態のままでいるテストは「状態遷移表のテストケース」にはあらわれますが、「1スイッチのテストケース」にはでてきません。無効遷移のテストは非常に重要ですので、必ず「状態遷移表のテストケース」も実施します。消灯のケースでいえば、「消灯時に消灯ボタンを押すと全灯になる」バグがあるかもしれないから。
あと、GIHOZが、テストケースをテストしやすい順番に並び替えるテスト実装の機能をサポートするようになると、さらに良いなあと思いました。
つまり、1スイッチテストケース表を終了状態が開始状態につながるように並び替える機能があるといいのになと思いました。
■ 裏のテスト
裏のテストでは、意地悪な条件を考えます。この図でいえば、調光モードで一番暗い「明るさ1」のときに[暗]ボタンを押してみるなどです(ループして一番明るくならないかを確認するテストです)。
今ためしに、「明るさ1」のときに[暗]ボタンを押してみたら、薄暗いままでした。
しかも、これ以上暗くならないことを知らせる意味で「ピッ」っという音が鳴っていました。そんなことマニュアルに書いていないのに。
仕様書にも書いていないかもしれないので「裏」のテスト大切です。
≡ 次回のお題
次回のお題はこちらです。

リビングの天井についているシーリングファン(ライト付き)です。
こちらも、リモコンの写真をつけます。

それぞれのボタンの意味は以下の通りです。(右上側面のチャンネル切り替えスイッチの説明は省きます)
こちらの説明はマニュアルを書き写したものです。
【ファン】ファン停止・運転ボタン: ボタンを押すごとに【運転⇔停止】と切り替わります
【照明】照明切/入ボタン: 照明の点灯・消灯をおこないます
【▲▼】ファン風向切替・照明調光ボタン: ファンの風向切替 照明の調光をおこないます
【弱中強】ファン風量切替ボタン: ファン運転時、ファンの風量:弱・中・強をダイレクトに選択できます
上記に加えて、「メモリー機能」として「最後に設定した状態を自動的に記憶する機能です。運転停止後、再びボタンを押すとファン(風向/風量)、証明(調光)それぞれ停止前の状態で運転(点灯)します。停電などで通電が停止したのちの電源通電時は、通電停止前の状態で運転・点灯します」と書いてあります。
≡ おわりに
今回は、「シーリングライト」のテストがテーマでした。
次回のシーリングファンですが、今回と似ていると思います。機能がファンの運転と照明の2つになったときにテストをどう考えるのか、そのあたりがテーマとなります。
