Google Testのセットアップ(Visual Studio編)

TDD(TestDrivenDevelopment)って一度やってみたいとずっと思ってたんです。
でもずっと組み込みC言語のクロスコンパイル環境というプアな環境だったためなかなかチャレンジが難しくできずにいました。
しかし今はVisual StudioWindows用アプリを書いています。これはチャンス!ということでまずはセットアップから。

環境

手順

基本的には参照先の通り。ただしライブラリへのリンクは#pragma commentではなくプロジェクトのプロパティにて行ないました。Debug/Release両方でユニットテストするかどうかは謎ですが、ソースコード上に書くと静的にリンクしてしまうのでプロパティに書くより自由度が減ると思ったためです。

  • プロジェクトのプロパティ | リンカ | 入力 | 追加の依存ファイル
    • Debug構成時:gtestd.lib gtest_maind.lib の追加
    • Release構成時:gtest.lib gtest_main.lib の追加

実環境への適用

サンプル動きましたー。じゃあ本番のプログラムでもやってみようか…とするところでまたつまづくわけです。どうやって既存のプロジェクトに当てはめていけばいいもんかと。
本当はこのページのようにユニットテスト用のTestプロジェクトを追加→Releaseビルド時はビルド対象から外す…としたかったのですけど、リンクエラーが解決できなくて断念(本番プログラムがサードパーティライブラリをスタティックリンクしまくってるせいだと思うんすけど)。
しょうが無いので、

  1. 構成マネジャでTestっていう構成を追加
  2. main関数だけ別ファイル化(main.cpp)
  3. Testフォルダをプロジェクトに追加し、この中にテストファイルを随時追加する
  4. Test構成時はmain.cppをビルド対象から外す
  5. Debug/Release構成時はTestフォルダ内の全ファイルをビルド対象から外す、main.cppをビルド対象とする

という感じで強引に。

これで本番のプログラムにおいてもユニットテストのオンオフが出来るようになりました。

それでもまだはまったこと

これ以降は完全に個人的な問題ですが。

  • 構造体メンバのアライメントに気をつけろ!
    • テスト被対象プロジェクトとGoogle Testプロジェクトの構造体メンバのアライメントは揃える必要があります。これをしないとビルドは通るのに実行時にエラーで落ちます(これに気づくのに時間がかかった…)。外部と通信するようなプログラムはアライメントを1にするかと思います。このようなときは要注意。
      • 構成プロパティ|C/C++|コード生成|構造体メンバのアライメント
  • #pragma packに気をつけろ!
    • プロパティ上は同じ設定でビルドしてあっても、ソースコード上で#pragma packしてるとやっぱりビルドは通るのに実行時にエラーで落ちます。

最後に

ここまで準備してさあやるぞって段になって急遽アサイン変更、このプロジェクトから離れることに。なんてこったい…。