2021/03/28

[c/c++]久々のfff

普段、C言語のことは「clang」と書いていたのだが、LLVMのclangもあったんだということを思い出した。
まあそんなことはどうでもよくて、久々にC言語を使っている。
あんだけ使っていたのに、しばらく使わなかっただけで忘れてしまっているところがあるのは哀しいのだが、まあ加齢もあるから仕方あるまい。

 

で、今日は単体テストについてだ。
自分がどうやってやっていたのか思い出そうとしたところ、これが出てきた。

hiro99ma blog: [c/c++]私のC言語 (5) - FFF
https://hiro99ma.blogspot.com/2016/08/ccc-5-fff.html

モックを作る meekrosoft/fff と(これはmicrosoftと名前をかけてるのかな)、その中にgtestが入っている。gtestは google testのことか、あるいはその前身だろう。ファイルのヘッダを見ると2005年なのだが、GitHubには残っていなさそうだったのだ。今のgoogle testのgtest.hもファイルヘッダは2005年なのだが、fff/gtest/gtest.hとファイルサイズが違いすぎる。おそらく複数のファイルを1つにまとめてあるのだろう。

 


今のfffはv1.1が最新だ。

Release Release v1.1 · meekrosoft/fff
https://github.com/meekrosoft/fff/releases/tag/v1.1

というわけで、私のサンプルも更新した。といってもfff.hだけだが。

hirokuma/fff_examples: FFFを使った例
https://github.com/hirokuma/fff_examples

前回が2016年なのもあるが、fff.hの差分が多すぎて違いを見るのが難しい。

なぜか分からんが、gccのオプションに-pthreadが必要になってしまった。gtest.hでpthread関数が使われているためのようなんだけど、今回gtest.hは変わってないんだよなぁ。。。

# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)

ああ、前回はcygwinで試したからこの条件に入っていなかったのか。納得だ。

 

テストを見ていて気付いたのだが、 weak_linkingサンプルはCソースしかない。
C++じゃないといけないと思い込んでいたのだが、いつしかC言語だけでテストが書けるようになっていたのか? でも、 __attribute__((weak)) とかMakefileに書いてあるし、なんか特殊なのかもしれん。

weakについてはこちらに書かれていた。

hiro99ma blog: [nrf51]app_error_handler()はWEAK
https://hiro99ma.blogspot.com/2015/02/nrf51apperrorhandlerweak.html

昔の私は言いました。

ライブラリ関数としてweakとしておけば、ユーザコードで上書きできるよ、みたいな感じらしい。

へー。
確かにMakefileを見ると、"FFF_GCC_FUNCTION_ATTRIBUTES"に"__attribute__((weak))"を設定していて、fff.hではFFF_GCC_FUNCTION_ATTRIBUTESを使ってFUNCNAMEを修飾している。
libfakes.aは、test内のDEFINE_FAKE_VALUE_FUNCみたいな関数をアーカイブしている。これらがweakになって置き換えられるようになっている、とういことか。
難しいこと考えるねぇ。

今までそういうのはcustom_fakeで行っていたと思う。
C++だとclassが使えて、そこにstaticな関数を作ることができるので、それをcustom_fakeにしてしまえば関数内で閉じたモックを作ることができるので便利だったのだ。
・・・と思っていたのだが、この例だと関数内に関数を書くことができてるな・・・そんなことできるんだっけ。nested functionをサポートしているならできるんだろう。

 

weakの件がC言語だけでテストコードまで書ける件と関係しているのかと思って見ていたのだが、関係はないのか?

別にC++でテストを作るのに困るわけでも無いし、どっちかといえば楽かもしれん。
ただ・・・テストコードは本体のCソースよりもだいたい量が多くなってしまう。そうするとGitHubの"Languages"でC++のプロジェクトのように見られかねないのだ。

image

まあいいんだけど、気になる場合は見直してみるのもよかろう。

 

うーん、今回は(も?)煮え切らない記事になってしまった。
次がんばろう。

0 件のコメント:

コメントを投稿

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