2017/02/15

[c/c++]テストの分割(fff)

書くネタが無いときは、だいたい実装作業ではなく、テストをやっているような気がする。。。

 

私はCで書いたライブラリのテストをするとき、fffを使うことが多い。
meekrosoft/fff: A testing micro framework for creating function test doubles

gtestも入っているので、ASSERT_EQ()なんかを書いてそれっぽく(?)できる。
使いこなしているわけではないが、スタブというかドライバというかモックというか、そういうのを準備する手間が楽になるだけでもありがたい。


今までうまくできていなかったのが、テストのソースファイルを分割する作業だ。
テストの関数は、比較的大きくなりがちなので、1ファイルに対してテストを1つのファイルにまとめると、かなり長くなってしまう。
元のソースこそ分割すべきなのか?と悩まないでもないが、せっかくのstatic変数をファイル分割するだけのために公開するのも避けたい。

私は、テスト対象のstatic変数も見たいと思うことがあるので、ソースファイルごとincludeさせている。
https://github.com/hirokuma/fff_examples/blob/master/test_func.cpp#L12
邪道といえば邪道だが、テストだからいいと思っている。
こうしていると、テストファイルを分割するとリンク時に多重定義が発生してしまう。

それに、モック関数もある。
ファイルを分割しても、モック関数として同じ名前のものはしばしば使うことになる。
そこにFAKEマクロを使ってそれぞれのテストファイルにモック関数を作ると、これはこれで多重定義になる。
(namespaceの中に入れてもダメだったけど、なんでだろう?)


そこでようやく思い至ったのが、テスト関数もincludeしてしまえばいいやん、ということだ。
そして、モック関数もincludeする。
見た目上だけテストファイルを分割するけど、実質は1つのソースファイルとしてコンパイルしてしまえ、ということだ。

格好は悪いが、テストだから、あまりそこに力を入れたくない。
懸念は、本体のソースファイルを変更してもテストでmakeしてビルドされないというところだったが、依存関係を書いてしまえばよい。
その編を解決しようとしていたのが、数日前の依存関係のパスの書き方についてだ。
http://hiro99ma.blogspot.com/2017/02/ccmakefiledepend.html

 

うちでは、gcc+fff+gtest+lcovという構成でテストをすることが多い。
lcovはHTMLでカバレッジを見るだけだが、目視できるところがよい。
「100%にしてやるぞー!」と思ってしまい、やらなくてもよいテストまでやってしまいがちなところが難点だが、まあこれは私の課題だな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。