sioaji2012のブログ

普段は組み込み開発でC言語のみです。主にプログラムや勉強日記です

組込C言語でUnitTest 2

前回のつづきから

sioaji2012.hatenablog.com

普段は、下記の本を参考にTDD(テスト駆動開発)を勉強しています。

テスト駆動開発による組み込みプログラミングC言語オブジェクト指向で学ぶアジャイルな設計」:Amazon CAPTCHA

まだ半分くらいしか読んでいません。(^_^*)

Facebook組込みTDD勉強会にも参加させて頂いています。

ツールはOSSののCppUTestです。TDDをやる理由とやり方とソースが載っています。

勉強半ばで、なかなかOUTPUTは出来ない状況です。

googletestのセットアップ

Googletestのソースを取得します

GitHub - google/googletest: Google Test

MinGWをいれる

インストールは、まずは、WindowsMinGW (またはCygwinでもいいですが) を入れました。 (インストール後、MinGWのbinフォルダと Msysのbinフォルダのpathが通っている事を確認しておく)

osdn.net

MinGWにMsysというコマンドライン実行ツールみたいのがついてるので、msysを起動してそこから googletestのソースをビルドしました。

googletestのビルド方法はこちらにありますが、

googletest/README.md at master · google/googletest · GitHub

googlemockを使うと思うので、こちらはスキップしてgooglemockのビルド方法を実施した方が良いと思います。

(ググった先で、2つを別々にビルドしてうまく動かなかった人がいたみたいなので)

GoogleMockのビルド(Googletestも同時ビルド)

googletest/README.md at master · google/googletest · GitHub

上記ページの真ん中くらいのコマンドを実行します。

C直下にソースを置きました。(フォルダ例)

/c/googletest/googletest
/c/googletest/googlemock
・・・・

msysを起動して、googlemockのフォルダで実行

/c/googletest/googlemock
$ autoreconf -fvi

これをやれ。と書いてあるので、

g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
    -isystem ${GMOCK_DIR}/include -I${GMOCK_DIR} \
    -pthread -c ${GTEST_DIR}/src/gtest-all.cc
g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
    -isystem ${GMOCK_DIR}/include -I${GMOCK_DIR} \
    -pthread -c ${GMOCK_DIR}/src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o

こんな感じに置き換えて順番に実施

g++ -isystem /c/googletest/googletest/include -I /c/googletest/googletest \
-pthread -c /c/googletest/googletest/src/gtest-all.cc
ar -rv libgtest.a gtest-all.o

g++ -isystem /c/googletest/googletest/include -I/c/googletest/googlemock \
-isystem /c/googletest/googlemock/include -I/c/googletest/googlemock \
-pthread -c /c/googletest/googletest/src/gtest-all.cc
g++ -isystem /c/googletest/googletest/include -I /c/googletest/googletest \
-isystem /c/googletest/googlemock/include -I/c/googletest/googlemock \
-pthread -c /c/googletest/googlemock/src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o

最後のところ。オブジェクトファイルが出来た。

$ ar -rv libgmock.a gtest-all.o gmock-all.o
a - gtest-all.o
a - gmock-all.o

フォルダ内に、リンク用のオブジェクトファイル

  • libgtest.a
  • libgmock.a

ができてると思います。

実際のテストコードをビルドするコマンド

上記ページには、こうやってビルドして。と書いてありますが、

g++ -isystem ${GTEST_DIR}/include -isystem ${GMOCK_DIR}/include \
    -pthread path/to/your_test.cc libgmock.a -o your_test

eclipseから実行したかったので、こちらのページを参考にして実施しました。

googletestのみの説明ですが、googlemockも同じ様に設定します。

(-pthread の指定がされていないかもしれないのが気になる)

GoogleTest Installation and Use in Eclipse/C++ Instructions

やっていることは、だいたいこんな感じ。


  • MINGWコンパイラに使う
  • GCC C++ Compiler の Miscellaneous の、その他フラグに、 -std=gnu++11 を最後に追加。
  • GCC C++ Compiler の Includes に、googleのソースのincludeフォルダを指定する
  • MinGW C++ Linker の Libraries に、パスを指定(上記ビルドして作ったリンク用オブジェクトファイル)、名前を設定。(libと.aを除いた部分⇛gtest と gmock)

あとは、サンプルコードで試してみればテスト出来る環境になっている事が確認出来ます。

eclipseでやるときの注意

eclipseにも、mingwが入っています。

Windowsに別途入れたMinGWeclipseminGWとではバージョンが違うので、そのままだとうまくリンク出来ないので、 eclipsemingwを使わない様にする必要があるかもしれません。

方法は、eclipseのCC C++ Compiler のビルドタブあたりに、パスを設定するとことがあるので、 eclipse/mingw32/binみたいなパスの登録を削除します。

はじめから、googletestのビルドをeclipseでビルドできれば、MINGW自体を入れる必要もないのですが・・・(出来るか不明)


つづきは、また今度