🌟

話題沸騰ポットに対して Property based testing を試してみる(3)沸騰/保温-状態遷移を考える

2020/10/26に公開

はじめに

話題沸騰ポットに対して Property based testing を試してみる (2)給湯(水)させるに引き続き
fast-checkを使ってProperty based testingを試しています。
題材として
テスト設計コンテストU-30クラスでテストベースに指定されている
「話題沸騰ポット要求仕様書 (GOMA‐1015型) 第7版にすることにしました.
fast-checkは状態をランダムウォークさせて失敗するテストケースを見つける方法も実装されてるみたいですのでそろそろ状態遷移を考えつつこの機能を試していきたいと思います

準備

状態遷移を表すのに良いツールは無いかと探していたところ
JavaScript製のstate-machine-catというライブラリを見つけました。
こちらを使って描画しながら状態遷移を考えていきましょう

状態遷移

以前までの状態

state-machine-cat形式のソースコード

  • initialize => offの状態遷移はconstructor()の動きと考える
    • _water = 0 にする
  • 電源on(plugIn())/off(plugOff())は蓋の状態に応じて下記と状態を行き来する
    • 蓋が閉じている場合 off <-> idle
    • 蓋が開いている場合 open/off <-> open/on
  • 同様に蓋の状態は電源on(plugIn())/off(plugOff())に応じて下記と状態を行き来する
    • 電源onの場合 idle <-> open/on
    • 電源offの場合 off <-> open/off
  • 蓋を開ける行為(open())に関して
    • 電源onの状態で蓋が開いている場合と電源offの状態で蓋が開いている場合状態を分ける
  • アイドル状態は電源が入っていて蓋が閉じている状態
  • 給湯(水)(dispense())機能は電源オンかつ蓋が閉じている場合のみ起動する
    • なおその際 中に入っている水は 10 ml / secのスピードで減少する
  • 注水(fill())は電源on/offに関わらず蓋が開いていれば(open/off or open/on)行える
    • その際は 中に入っている水に任意の量(water)追加できる

image.png

沸騰/保温状態を追加したバージョン

state-machine-cat形式のソースコード
以前との差分はこちら
image.png

  • offの場合 水温(_temperature)を室温25℃に初期化する
  • アイドル(idle)状態でもし水が10ml以上になると自動的に沸騰中(boil)に遷移する
  • 電源on中に蓋を開くと(open/on)水温(_temperature)は室温25℃にまで下がる
  • 沸騰(boil)/保温(keep)状態をまとめてactiveと表現し、電源off(plugOff)するとoffの状態に遷移する
  • active中に蓋を開くと(open/on)水温(_temperature)は室温25℃にまで下がる
  • active状態は沸騰中(boil)と保温(keep)の2つの状態がある
    • boil状態は_startを現在時刻に初期化する そして毎秒1.25℃水温( _temperature) を上昇させる
    • keep状態は常に水温(_temperature)を100℃に保つ
    • keep状態で再沸騰(reboil())ボタンを押下するとboil状態に遷移
    • keep状態で給湯(dispense())ボタンを押下すると給湯される
      • 中に入っているお湯は 10 ml / secのスピードで減少する
    • keep状態でお湯が10ml以下になった場合はidle状態に遷移する

image.png

最後に

次はテストではなく実装を状態遷移に合わせたいと思います。
また、コードにもし間違いありましたらPull requestは大歓迎です。
長くなってしまいましたが 最後まで読んでいただきありがとうございました。

Discussion