日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

うちでもユニットテストできるの?

今までマイコンのプログラムのデバッグは専ら実機を使っていたが、

どうも、最近着手したプロジェクトでは実機でのデバッグに限界がありそうなんだよね。

もちろんハードウェアが絡むことは実機でしっかり確認する必要があるし、

代表的な動作は実機で結合テストするわけだけど、様々な条件の組み合わせを網羅的に見るのは難しそう。

そこでマイコン開発環境のエミュレータ機能をうまく使えないかなということでちょっと試していた。


ソフトウェアの検証にもいろいろあるが、大きく分ければ単体テスト(ユニットテスト)と結合テストだろうと。

単体テストはプログラムを構成する要素単位でのテスト、結合テストは要素を結合しての実際の動作を見るテストということだ。

結合テストは実機でやるべきだが、単体テストは必ずしも実機でやる必要はないだろう。

マイコンのペリフェラル、例えばA/Dコンバータを使った機能のテストとかは実機でやるべきですがね。

そして、単体テストは自動化が進んだ分野なので、その知見をうまく活用できれば、効率化が期待できる。


とはいえ、エミュレータとはいえマイコンの低レベルな環境で、世の中で使われているテストフレームワークが適用できるものなのか。

まず、プログラミング言語はCなので、Cで使えるテストフレームワークを探すと CUnit だろうと。

他のテストフレームワーク、例えばJava用のJUnitとかそうらしいんだけど、テスト用のmain関数などを作成する必要はないんだよね。

ところがCUnitはCでできる範囲で作られているので、ユニットテスト用のmain関数を作る必要があるなど、手間がかかる。

裏返せばCUnit自体はシンプルってことですけどね。でも、何も無しでユニットテスト書くのとは全く違うよ。

CUnitをダウンロードしてきて、Linuxでmakeして、必要なファイルをマイコンの開発環境に連れてきた。

標準入出力が使えれば実行結果の表示などはできそうで、どうもマイコンもデバッグ環境ではコンソール入出力は使えるらしい。

sprintf(stdout,…) というのを printf(…) に変更するなどの細工は必要だったが、意外とすんなり動いた。


あとはDebug, Releaseとある実行環境に、UnitTestという環境を追加して、これをユニットテスト用の構成にして、

1つのプロジェクトで実機でも、エミュレータでのユニットテストにも対応できるようにしてみた。

UnitTestを選んで、デバッグ実行とすると、実行したテストのうちOK・NGの個数、NGの詳細が表示されると。

なかなかいい感じ。

モダンなソフトウェア開発からは縁遠いと思っていたが、ここだけ見ればなかなかモダンですね。

あと、使っている開発環境の機能で、エミュレータで動作させると、コードカバレッジの測定をやる機能があるようで、

これを使うと、単体テストで各要素内の命令(機械語)を網羅できたことが確認出来るようだ。C0カバレッジってやつですね。

テストの網羅性の参考にはなりそう。


ただし、エミュレータには実際のマイコンのペリフェラルは付いていないですからね。

ハードウェアから切り離してテストすることを考慮した構造にしておく必要がありそう。

ただ、ブレークポイントをうまく使えばペリフェラルを模擬したりすることもできるみたい。

これも調べていて知ったんだけど、けっこうブレークポイントっていろいろな機能を持たせられるらしい。

ブレークポイントで一時停止→ファイルからデータをロード→変数に格納→再開 なんてこともできるようだ。

どこまでエミュレータでやるかって話ですけどね。


ただ、実機とはいろいろな意味で違う環境にならざるを得ないですけどね。

以前、開発していたプロジェクトにユニットテストを追加する実験をやってみたのだが、

ユニットテストを実行するには実際に使っているマイコンではリソース不足で動かせないと出てきた。

確かにもともとプログラム容量がカツカツだったんだよね。コンパイラの最適化オプションを正しく設定しないとエラーになった覚えがある。

なので、ユニットテスト用環境では同じシリーズのより容量の大きいものを選んで動かす必要があるようだ。

その他、実機と違う点がいろいろとありそう。

だけど、単体テストとしては十分だと思うんだよね。単体テストってそういうもんじゃないの。


というわけで、わりとできそうですよって提案してみようかなと。

今回、実機到着までやたらと時間があるみたいだし、ちょうどいいんじゃないの。

これまで、コードを書いてはユニットテストを書いて、という文化のなかった職場なので、そこはハードルがあるが、

実機がないということは、作ってもすぐに実機で動かせないってことだからね。

そういうところも後押しになるかなと。もっとも、コーディングするのは自分だけの予定だから、テスト書くのも自分だけってことだけど。


Author : hidemaro
Date : 2018/04/12(Thu) 21:15
日常 | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools