2014年7月18日金曜日

ArduinoUnitでTDDを試してみる

Arduino開発でのTDDについて少し調べてみましたが、C/C++でやるというのが多いようです。Arduino IDEは、スケッチをC++に変換してビルド、実機へ転送する仕組みになっているので、そこを使うようです。TDDのサイクルを早くするためには、実機への転送時間とかを考えるとC++でやるのがいいのかもしれません。
とはいえ、スケッチでできるユニットテストのフレームワーク「ArduinoUnit」もありました。手軽にやるにはこちらのほうがよさそうなので、これを試してみることにします。

ArduinoUnit

ArduinoUnitは、Arduino向けのユニットテストのフレームワークです。
以下の環境で試してみます。
  • Arduino UNO Rev.3
  • Mac OS X 10.9.4
  • Arduino IDE 1.0.5

準備

  1. Githubからクローンしてきてます。ZIPファイルでダウンロードしてもかまいません。
  2. srcフォルダをArduinoUnitとリネーム、もしくは別フォルダにコピーします。ここでつけた名前が、Arduino IDEで表示されるライブラリ名になります。
  3. 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 件のコメント:

コメントを投稿

RedmineプラグインをGitHub Actionsでテストする

Redmine Advent Calendar 2019 の Qiita で書きました。追っかけで もう一つ 。 Travis-CIで行っていたRedmineプラグインのCIを、GitHub Actionsに変更したものです。 GitHub Actionsをやってみようという...