ぼくのかんがえたさいきょうの組み込み用ユニットテストツール

TDDの勉強を始めたら、組み込み用のユニットテストツールを作りたくなってきた。

C言語用のユニットテストツールはいろいろあるのでいくつか調べてみた。

  • CUnit。たぶんC言語のxUnitでは一番有名だと思う。アサートマクロが豊富。コンソールモードをTDDというより検査用ツールとして使ったことがある。テストケース毎のsetup,teardownができないのと、ASSERT失敗時の引数の値が表示できないのが残念。(setup,teardownはtrunkでは実装されているらしい)
  • Cutter。使ったことはないけど、ドキュメントみるとすごく高機能みたい。でもglib必須なので組み込みでは使いづらい。
  • embUnit。名前の通り、組み込み向けxUnit。標準ライブラリすら依存しないらしい。setup,teardown,RepeatedTestもあるし、これいいなーと思ったら、ASSERTに失敗するとすぐテスト関数からreturnしてしまうようだ。
  • CUnit for Mr.Ando。こちらも組み込み向け。すごくシンプルでコンパクト。規模によってはこれくらいで十分なのかもしれない。でもこれもASSERT失敗でreturnしてしまう。
  • Unity。TDD for Embedded Cで使われている。CygwinでビルドしようとしたらRubyスクリプトが失敗してしまった。とりあえず調査はせず放置。

組み込み向けのユニットテストツールは何が重要なのだろうか?
機能?移植性?サイズの小ささ?

個人的には、CUnitはメジャーだしコンソールモードもあるので、基本的な使い方はCUnitのベーシックモードorコンソールモード + 足りない機能を補う感じがいいと思う。
あと組み込み向けに使うので、embUnitのように標準ライブラリや外部ライブラリへの依存をなくして、できるだけ多くのコンパイラでビルドできるように移植性を高くしたい。


というわけで、PCUnit(Portable C Unit)という組み込み用ユニットテストツールを作った。

リポジトリは以下。GitとMercurialの違いだけで中身はどちらも同じです。


機能・特徴はこんな感じ。CUnitユーザーにもすんなり使えるようにCUnitの仕様を真似た。

  • テスト関数の作り方はCUnitと同じでvoid test_XXX(void)を作っていく。
  • アサートマクロはCUnitのCU_プレフィックスをPCU_にするだけでほとんど同じ。
  • setup,teardown対応。initializeとcleanupはCUnitと同じ。
  • ASSERT失敗時の引数の値表示。
  • printf形式で追加メッセージを表示できる。
  • テスト結果のカラー表示。
  • RepeatedTest対応。
  • データ駆動テストのようなことをできるようにした。
  • インタラクティブなコンソールモード対応。CUnitと大体同じ。
  • 標準ライブラリが使えなくても、条件コンパイルでビルドできるようにした。
  • ユーザー定義のputchar/getcharを指定すればシリアル入出力とかを使ってターゲット上でも実行可能。
  • ビルド方法はなるべく簡単になるように、ソース丸ごとテストプロジェクトにくっつけてビルドでOK。
  • 一応スタティックライブラリをビルドするMakefileも用意した。最近はHDDも大容量なのでダイナミックリンクよりも簡単に使えるほうがいいと思った。
  • とりあえず動作確認したコンパイラgcc,VC++2010,ルネサスのHEW(H8のシミュレータ),h8300-elf-gcc(KOZOS用に買ったH8/3069マイコンボード)
  • zlibライセンス。

TODO

  • 条件コンパイルで機能制限(コンソールモード削除)してコードサイズを減らせるようにする。
  • よくあるxUnitの機能のXML出力。(何に使うのかよくわかってない)

ツールの機能に凝るより、TDDの実践をすることが大事なんだけど、いろいろと凝ってしまった。ライブラリのサイズは10〜20KBくらいになった。

組み込み向けに作ったけど、ホスト用でも使えると思います。
ご意見やツッコミをいただけるとうれしいです。