読者です 読者をやめる 読者になる 読者になる

きよしこのテスト駆動開発

もうすぐクリスマスですね!みなさん、アドベントカレンダーの進捗どうですか?

僕はクリスマスとは無縁な日々を過ごしているので、アドベントカレンダーのおかげでクリスマス気分を味わえて嬉しいです。

※ この記事は VOYAGE GROUP エンジニアブログ : Advent Calendar 2013 の9日目の記事です。

クリスマスのデート先といえばきらびやかなイルミネーションスポットですが(たぶん)、人がいっぱいいて大変ですよね(想像)。そういう時はイルミネーションを自分で作って、家に飾ればいいんじゃないですかね。

  • 用意するもの
    • LEDテープ
    • Arduino
    • ハンダ付けセット
    • クリスマスツリー

LEDテープ

今回はフルカラーシリアルLEDテープを使ってイルミネーションを作っていきます。使用したものはスイッチサイエンスさんで販売されているこのLEDテープです。1mの長さで60個のLEDモジュールが連なっています。

モジュールの制御方法ですが、制御線1本でできます。連結されている各モジュールのDINにG,R,Bそれぞれ8bitずつ24bitのデータを送ってあげることで、どんな色に光らせれば良いか教えてあげることができます。「1つ目のモジュールの24bitのバッファがたまったら、次のモジュールにそのデータを渡す」という様にデータが伝送されていき、50μs以上LOWを入力すると全モジュールでデータが確定してLEDへ出力されます。

この制御はArduinoが担当します。なので、制御プログラム(Arduino用語ではスケッチ)を書かないといけませんね。と、ここで重い腰を持ち上げるわけですが、既にLEDを制御する使い勝手の良いライブラリが存在しているので、書く量はそんなにありません。

LEDテープを制御するスケッチが書けたら、あとはハンズで買ってきたクリスマスツリー(1980円)にLEDテープを飾ってあげましょう。こんな感じに激しく光らせることができます。

きれいですね。こんな素敵なクリスマスツリーが部屋にあったら、ロマンチックなムードになること請け合いです。

テスト成功率

まあ、誰も来ない僕の部屋にこんなクリスマスツリーを飾っても虚しいだけなので、もっと別なクリスマスの楽しみ方を見つけましょう。正月が初詣に行くだけではなく、お年玉を貰ったりおせち料理を食べたりするように、クリスマスにもイルミネーションを見る以外の楽しみ方があります。

ということでテスト駆動開発(TDD)の話をしましょう。TDDでは、

  1. テストが失敗するテストを書く(RED)
  2. テストが成功するコードを書く(GREEN)
  3. リファクタリング

というサイクルを繰り返してプログラミングしていきます。

  1. テストが失敗するテストを書く(RED)
  2. テストが成功するコードを書く(GREEN
  3. リファクタリング

RED, GREEN・・・ ・・・・・・ といえばクリスマスカラー・・・

「はっ!つまり、TDDはクリスマスにまつわる聖なる行為だったんだよ!」

Ω ΩΩ<「な、なんだってー!」

ならばTDDにも、もう少しクリスマスっぽさが必要ですね。さっきのクリスマスツリーを活用して、テストの成功率をイルミネーションとして可視化したいと思います。

成功率の可視化

まずはテストが失敗することを確認するところから始めましょう。

よし、オールレッドですね。次はテストが通るように修正しました。

成功率100%です!やったね!次はリファクタリングしてみましょうか。

ありゃ、20%にまで下がってしましましたね。

というふうに、クリスマスツリーを眺めながらテスト成功率を知ることができるようになりました!これでクリスマスに清らかな気持ちでTDDできますね。

実装

今回は以下の手順で、成功率を可視化しています。

  1. RSpecのテスト結果をテキストファイルとして出力
  2. Guardでそのファイルの変更を検知して、テスト成功率を計算
  3. 成功率をシリアル通信でArduinoに送信
  4. 成功率に応じてLEDテープを制御

今回書いたコードはここに置いています。

はい、トンデモ記事でした。みなさん、思い思いのクリスマスを楽しんでくださいね。

明日の #vgadvent2013 は @takkyuuplayer さんです。

※ 本記事は「きよしこのテストカバレッジ」というタイトルでアップロードしていましたが、テストカバレッジは成功失敗に関係なく、テストがどれくらいメインのコードをカバーしているかだよねとご指摘頂いたので「きよしこのテスト駆動開発」に変更しました。