2013年6月13日木曜日

組み込みソフトウェアのTDDってなんだろーかね

ファームウェアをつくる仕事になりまして。アップデートのできない前提とすると、きちんと抜けなく確かめないとじゃないですか。趣味でコードを書くことはあっても、仕事ではなかったし、自分しか見ないしで、テストとかほとんど何も考えてなかったので、この機会に勉強することにしました。自分が忘れないように書いておきます。

参考にした資料

Web系やIT系のかたがただと実践した記録が勉強会で出てきてるけど、マイコン開発だとなかなか見つからなくて。上記の書籍とサイトを参考に、自分の環境を整えました。上記サイトは幸いにもPIC向け開発のものだったのですが、32ビットPICだと若干見直さないといけない箇所があり苦労しました。そういうところはオライリーの書籍を参考にしてます。

ソフトに期待する動きを決める→テスト項目でしばる→期待する動きになるようにコードを書く→少し書いては実行してテスト、が流れなのかなと。

環境をととのえる

エディタはSublime Text 2を。今まではMPLAB Xで(テストぬきの)コードの作成から書き込み、デバッグまですべてをやっていたけれど、書き込みとデバッグのみに使おうと思います。補完やジャンプはすごいしっかりしてるけど、ビルドや書き込みで数秒間(Macごと)プチフリすることが多く、微妙にイライラしてました。

テストのフレームワークには今のところUnityを使っています。サイトと書籍のとおり。加えて、Ceedlingというビルドシステム(よい日本語が見つからない)を重ねています。先述の書籍では「テストコードを記述したあと、それを呼び出すためのmain関数を忘れずに記入するんだぞ」的なことが書いてあるのですが、この辺を自動生成してテストを呼び忘れることのないようにしてくれます。なかみはRuby。保存時に自動でビルドする設定で、そういった処理をやってくれるrakeを呼ぶようにすると、毎回のテストがはかどります。

ハードウェア依存の部分はどうすれば

I/Oとか、レジスタに直で読み書きする部分はどうしたらいいのかなと。ここはまだあまり自分のなかでまとまってないところ。書籍のほうには各種レジスタのポインタを使って…とかあるけれど。

32ビット版以外のPICだと、Microchipがsim30というシミュレータを提供していまして。マイコン用にビルドしたバイナリをターミナルから実行できてしまうのです。これを使うとポインタもなにも気にしなくていいんですが。

さいごに

TDDはものすごい上のレイヤーのエンジニアがやるもので、Cとかは泥臭いやりかたしかないんだろうなーって勝手に考えてましたが、全然そんなことはなく。外部環境に依存するものと考えれば、I/Oや割り込みなんてのもネットワークの向こうのDBサーバとかと同じ扱いなんだろうなと。あとは期待する動作とテスト項目をちゃんと考えないとね。ちゃんとってなんだろーかね。

Sublime Text 2を、ちょいとしたJavaScriptの記述以外で使いましたが、微妙な初期設定で苦労しました。ここはまた別に書きます。