Archive for 2009 年 3 月 8 日
Cmockeryって何?
仕事がらみなのだが、Cソースのプログラムでいわゆる単体テストについて、話をふられた。そう言えば、実のところ、コーディングで単体テストというのをあまりまじめにやってこなかった。
言い訳がましいけど、テストよりもコーディング段階でロジックミスをつぶすのが基本だったと思う。マシン性能に頼って、トライアンドエラーの繰り返しで、そういうミスというか間違いを追い込んでつぶしていくという、まぁ趣味プログラマにはありがちな手法が中心だったのが、おそらくおもな理由。
しかし、それでもあまり大きなバグを出さないですんできたのは、コーディングスタイルとか、ロジックの方で工夫をして、ロジックミスを見つけやすかったり、出にくかったりする方法を身につけてしまっているからじゃないかな。
あ、もちろん、コードの目視だけでは追い切れなかったり、自身がなかったりするところは、モジュールを切り出して、テストアプリを別に作ったりはしていたが、あくまで、コーディングやレビューでは追い切れないと判断した時だけだった。
んなもんだから、単体テストの手法とかについて相談されてちょっと困ってしまったわけだ。実効性うんぬんの前に、とにかく「やるべきもの」としての単体テストをどう効率的にやるか?っていう相談だから、自分的には、最低限、開発者が必要と思う単体テストをやることで、品質を保てる開発体制がいいのになっていう立場だから(って、そんなダメそうな主張をおおっぴらには口にできないんだけど)…。
で、じゃぁ、今までの開発では、どんなふうに単体テストをしていたのかと聞くと、どうもデバッガで止めて、変数の値とかをすり替えて…みたいなことを、各自にやらせていたらしい…。まぁ、自分もそういう評価をやらんでもないが、どちらかというと、結合テスト段階で、もう単体テストなのか結合テストなのかわけわからんわって時だったような気がする。
そこで、ではCにおける単体テストを支援するツールというか、そういう「便利な何か」はないのか?あるとしたら、どんなものがあるのか?について、調べてみた。そうすると、CUnitみたいな感じの「単体テスト用フレームワーク」っていうのが、いろいろ見つかる。どのページでもとりあえず「単体テスト」とは何かっていう講釈があるので、これは自分にとっては意外と役に立った。今まで「単体テスト」って何か?という命題に対して、明確な「答え」を持っていなかったんだと、いまさら気付かされた、そういう感じ。
で、全部を細かく見ていったわけではないけれど、あるユニットをテストするには、それを組み込む「テストアプリケーション」を作成して、走らせなければならない。そのテストアプリの中で実行された各テストの結果が単体テストの結果セットとなるというのが基本らしい。
で、テストアプリの作成を支援するのが「単体テストフレームワーク」ってことになるようだ。で、あるユニットをテストするには、それを組み込むアプリケーションの他のモジュール群とは完全に分離された環境でテストするのが「筋」なのだそうだ。
しかし、実際のところ、ふつうアプリの一部のルーチンやクラス、モジュールというものは、だいたい他のモジュールの関数や、他のクラスのメソッド、グローバル変数、もちろん、標準や非標準のライブラリにある関数などをコールしているので、「完全に分離された環境」ってできんやろ!と思いがち。
で、「完全に分離された環境」となるテストアプリではそういった外部の関数やメソッドをアプリ内ででっち上げてあげてテストすることになる。まぁ、でっち上げた関数は、引数を受け取って、適当に返値を返してくれればいい。
で、「単体テストフレームワーク」では、この関数でっち上げと、その返値、副作用のでっち上げのコントロールの支援というのが、主な機能になるようだ。もちろん、テスト結果の出力とかの支援もあるだろうが。
そこで、いろいろある中、活きのいいものを選んでちょっと遊んでみようと思って、選んだのが昨年発表されたばかりの、Cmockeryという単体テストフレームワーク。Googleラボで作られたものだそうで、あまりごちゃごちゃしていなさそうで、simple is best.みたいな感じだったのが選択動機の大部分。
だが、残念ながらパッと見では、日本語ドキュメントがないようだ。仕方ないので、Cmockery-Manual を和訳してみた。
結果、Cmockeryに限らず、こういうフレームワークを使って、テストそのものをテストアプリ作成(ともちろん実行だが)としてしまうと、単体テストというのはすなわち「テストアプリの作成」となるし、単体テストの成果物は「単体テストアプリ」とその結果ってことになるわけで、これだと、テスト内容のレビューもやりやすいし、テストの「実際にどういう手順で何をして、結果がどうなったのか?」という、実は「テスト結果表」にはあまり表れない部分とかのあいまいさの残る余地がなくなるわけで、悪くない気がした。というか、まともな開発現場ではこんなことは、とっくに当たり前だったのかもしれないが。
ということで、単体テストについては、Cmockeryを使ったテストアプリの作成と実行ってことにしたら、いいんじゃな~い?って提案してみようかと、まぁ、そんなことをしたり、思ったりしていて写真撮りに行けなかったと…(笑)。
Plugin by wpburn.com wordpress themes