Part23:ユニットテスト

凛「前回に引き続き凛のターンにゃ!」
海未「今回はテストでしたね」
凛「うん。MixとExUnitを使ったユニットテストをやってみるにゃ」

凛「お題は前回のFizzBuzzもどきだけど、仕様そのままで実装を少し変えるからコードの中身は忘れていいにゃ」
希「えーと仕様は、3の倍数だとハラショー、5の倍数だとちゅんちゅん、3と5の公倍数だとにっこにっこにー☆、やったね」
海未「fizzとかbuzzとかはどこへ行ったのでしょうか・・・」

凛「まずはテストの実行方法からいくね」

凛「Mixが生成したファイルにはテストに関係するファイルが2つあって、mix testってやるとそれが呼び出されるにゃ」
希「testの下にあるやつかな?」
凛「それにゃ。fizzbuzz_test.exsとtest_helper.exsの2つあるはずだよ。test_helper.exsの方は・・・」

凛「テストの実行開始だけにゃ。Mixから呼び出されるのはこのファイルだよ」
海未「ということは、テストの本体はもうひとつのファイルなのですね」
凛「うん。fizzbuzz_test.exsにこれからテストを書いていくにゃ」

凛「the truthっていうサンプルが入ってるけどこれは消してもいいにゃ」
希「これは何をしてるん?」
凛「assertが1件のテストになるにゃ。この場合、1 + 1 == 2は絶対真だからこのテストは絶対成功するんだよ」
海未「テストが失敗した場合何が起こるのですか?」
凛「じゃあ1 + 1 == 3にして試してみるにゃ」

凛「どこで何がどう失敗したか、レポートしてくれるにゃ」
希「何が間違えてたかすぐわかるようになっとるね」

凛「じゃあFizzBuzzに戻るにゃ。まずfizzbuzz.exをこんな感じにするにゃ」

凛「これから、テストを書きながらFizzBuzzを実装していくにゃ。これをテスト駆動開発というんだよ」

凛「最初に、テストケースを1つ書くにゃ」

凛「1のときは1になるはずだから、正しく動いていればこのassertには引っかからないはずにゃ。けど・・・」

海未「・・・まあ、実装されていませんからね」
凛「そういうことにゃ。だから、次はこのテストケースをパスするように実装するんだよ」

海未「・・・いいのですか?これは」
凛「最初はこんなもんにゃ」

凛「通ったにゃ!じゃあ、2件目のテストケースを書くよ」

凛「実行すると・・・」

希「当然のように駄目やね」

凛「こうすれば」

凛「これで通ったにゃ」

凛「じゃあ次は、3だからハラショーだよ」

希「やりたいことが分かってきたで。テストと称して仕様を書いてるんやろ?」
凛「その通りにゃ!まずどう動くべきか仕様を書いてから、それを満たすようにコードを書くにゃ」

凛「次は5だね」

凛「今回、異常系はやらないことにして・・・次の15で最後にゃ」

凛「これで最後・・・」

凛「・・・だと思った?残念バグがあったにゃ!」
海未「condは上から評価されるから、先にrem(n, 3)が成り立ってしまうのですね」

凛「こうすればいいにゃ!」

希「なるほどな、細かいサイクルでテストしてれば、バグ作り込んでもその場で見つかるんやね」
凛「直すのも楽だし、過剰実装を防ぐ意味合いもあるにゃ」

凛「最後に、全文貼っておくね」

凛「実際には、もっと異常系の入力とかもやるんだけど、基本は今回やった内容で押さえられてるはずにゃ」

希「次回やけど・・・そろそろ、マクロの話とかする?」
海未「そうですね。難解になってきますが・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です