サラーサライラ・ワ・ライラ

千夜一夜物語復刻ライト版

日曜ゲームプログラマの「Visual Studio 2012での冷やかしGoogle Testの始め方」

動機

現在DxLibを使ってゲーム開発を行っているんですが,それとは別に大学でTDDしろ(ざっくり)みたいな課題が出ました.

TDDする,ということはつまりテストファースト,つまりテスト書かないといけない.
ここでテスト環境作らないといけないことに気づいたんですが,私の知っている(聞いたこと有る)テスト環境というと

あたり.C++で書くならGoogle Testかな,ということで冷やかしGoogle Test 始めました

問題

さて,冷やかしGoogle Test始めるのは良いし,Visual Studio 2012で導入するとなれば
Visual Studio で GoogleTest を使う - Natural Software
ブログズミ: Visual Studio 11 Beta で Google Test を使う
を読めばいい.終わり!!

……で済めばよかったんですが,

  1. TDDってよくわからんから既存のプロジェクトに適用してみよう
  2. とりあえず開発中のゲームにテスト環境入れよう
  3. そもそもwin32コンソールアプリケーションじゃないとテスト動かないよね
  4. 何なのだ、これは!どうすればいいのだ?!


というわけでちょっと困った.

とりあえずのTDD(というかテスト)のざっくりイメージとしては

  • コンパイルするとテスト走る
  • テストがフェイルしたらわかる

などという超絶なざっくり感なので,今のプロジェクトに適当にテスト書き足せるような環境が!作りたい!
ということで作りました.

前提は

  • Visual Studio 2012上で開発中のDxLibのプロジェクトを持っている
  • Visual Studio 2012で使えるGoogle Testのテストを走らせてみるプロジェクトは作れる(上記のブログ内容は終わっている)

ということにして,Release構成,Debug構成と共存できるようにTest構成を作成した方法を記述します.

やったこと

適用したいプロジェクトを立ち上げる

立ち上げます.

Test構成の作成

「ビルド」→「構成マネージャー」
「アクティブソリューション構成」のセレクトボックスで「新規作成」
名前は適当につけて(今回はTest),設定のコピー元はDebugにする.

Test構成の設定

「プロジェクト」→「プロパティ」
プロパティページの構成をTestにする.その後,
 構成プロパティ→C/C++→全般 から,追加のインクルードディレクトリにGoogle Testのincludeを追加
 構成プロパティ→リンカー→全般 から,追加のライブラリディレクトリにGoogle TestのLib(gtestd.libとgtest_maind.libのディレクトリ)を追加
 構成プロパティ→リンカー→システム から,サブシステムをコンソールに(DxLibのサイトの解説の通りにしていればWindowsになっているはず)
 構成プロパティ→C/C++プリプロセッサ から,プリプロセッサの定義で_DEBUGを何か適当なの(今回は作成中プログラムがRogebreazとかいうゲームだったので_ROGEBREAZ_TEST)に変更

設定が終わったらWindowsアプリケーションのエントリポイントを構成によって切り替えるようにします.今回はDebug,Release構成ではmain.cppから,Test構成ではtestMain.cppから起動するように設定しました.
main.cppには

#ifndef _ROGEBREAZ_TEST
int WINAPI WinMain(HINSTANCE hInstance,……){
……
……
}
#endif

と書いておき,Debug,Releaseではここから開始することにします.
testMain.cppには

#ifdef _ROGEBREAZ_TEST
#include <gtest/gtest.h>

#pragma comment( lib, "gtestd.lib" )
#pragma comment( lib, "gtest_maind.lib" )
int main(int argc, char *argv[]){
	testing::InitGoogleTest(&argc, argv);
	RUN_ALL_TESTS();
}
#endif

と書いておけば,Testビルドの際にはこちらからアプリケーションが開始し,テストが走ります.

ここまでやって気づいたけどテストコードは必ず#ifdef _ROGEBREAZ_TESTと#endifで囲んでやらんといかんので,テストコードは

#ifdef _ROGEBREAZ_TEST
#include <gtest/gtest.h>

//ここに書く

#endif

ということになりますね.

コンクルージョン

こんなわけで偶然にも適当にテストを書く権利を手に入れた俺たちは,既存のクラスのテストを書いてみようかなと思ったのだった……

ということです.「お前これ明らかにおかしいやろ」とか色々と意見がありましたらホント聞きたいのでコメントしてください!!!!