とはいえ、スケッチでできるユニットテストのフレームワーク「ArduinoUnit」もありました。手軽にやるにはこちらのほうがよさそうなので、これを試してみることにします。
ArduinoUnit
ArduinoUnitは、Arduino向けのユニットテストのフレームワークです。以下の環境で試してみます。
- Arduino UNO Rev.3
- Mac OS X 10.9.4
- Arduino IDE 1.0.5
準備
- Githubからクローンしてきてます。ZIPファイルでダウンロードしてもかまいません。
- srcフォルダをArduinoUnitとリネーム、もしくは別フォルダにコピーします。ここでつけた名前が、Arduino IDEで表示されるライブラリ名になります。
- Arduino IDEで、スケッチ -> ライブラリを使用 -> Add Library...をクリックして、ダイアログで先のフォルダを選択します。
すると、ライブラリとしてArduinoUnitが追加されます。
また、Arduino Libraries Directoryに選択したフォルダがコピーされます。GithubのREADMEでは、まずArduino Libraries Directoryにフォルダを作るとありますが、選択すればコピーされるので不要でした。
ちなみに、私の環境では、~/Documents/Arduino/librariesにコピーされました。
サンプルを動かす
READMEのGetting Startedにあるサンプルを動かしてみます。新規のスケッチにコピペしてArduinoに転送、シリアルモニタを開くと以下のように出力されました。
結果が2回出力されてます。頭の方はなんか変ですし。。。転送とシリアルモニタを開くタイミングとかかなと思い、loop()のテスト実行前にdelayを入れたらきれいに出ました。
あとで気づいたんですが、シリアルモニタを開くたびにテストが実行されるようです。delayがない状態でもシリアルモニタを再度開くと、正しく結果が出力されました。
やってみる
TDDでコードを書いてみました。https://github.com/two-pack/ArduinoExample/tree/master/ArduinoUnitExample
コミットのここからここまでで、細かくコミットしています。
- LEDを点滅させるコードを書いてます。簡単な例なので直接ピンの状態を見たりしています。センサーが絡んだりしてくるとそうもいかないので、実機に絡む関数をラップしたりしないとダメそうです。C++でやる場合は、モックのライブラリもありそうです。
- テスト用のソースを分けて、setup()とloop()を持つソースでは#define、#ifdefでテストとプロダクトの場合分けをしました。テスト用のソースを消せば、プロダクトのコードだけをビルドできるはず。
- 実機への転送時間とシリアルモニタを開くのにかかる待ち時間は、やっぱり気になりました。特にシリアルモニタが転送時に一度閉じてしまうのが邪魔です。転送はサイズが大きくなるともっと気になるかな。
- やっぱりこういうのがあるのはいいです。C++を持ち出すほどのスケッチを書かないなら、ArduinoUnitである程度割り切りながらテストを書いていくのもいいと思いました。
0 件のコメント:
コメントを投稿