2011年10月28日

googletestを試してみる

VisualStudioでのunit testフレームワークのgoogletestの導入方法。

googletest公式:http://code.google.com/p/googletest/
googletest日本語ドキュメント:http://opencv.jp/googletestdocs/index.html
環境:Visual Studio 2005 Professional Edition

1.ダウンロード


http://code.google.com/p/googletest/downloads/listから落としてくる。 私は、gtest-1.5.0を落としました。

2.インストール


「gtest-1.5.0/msvc/gtest.sln」を起動。変換ウィザードが出たら、「完了」でソリューションを使用しているバージョンに変換する。 その後
・gtest
・gtest_main
をDebug,Releaseでビルド。 ビルドにエラーがなければ、「gtest-1.5.0/msvc/gtest/debug,release」内にそれぞれ、
・gtest.lib
・gtest_main.lib
が出来ているはず。コイツがgoogletestライブラリになります。

Visual Studioの設定


「新規作成→プロジェクト→Win32コンソールアプリケーション」でプロジェクトを作ったら、下記の設定を行う。

「プロジェクトを選択して右クリック→プロパティ:構成プロパティ」で下記を設定する。(Debug,Release両方)
・libの設定
 「リンカ:全般:追加のライブラリディレクトリ」で、『gtest-1.5.0/msvc/gtest/debug』を追加
 「リンカ:入力:追加の依存ファイル」で、『gtestd.lib gtest_maind.lib』を追加
・includeパスの設定
 「C/C++:全般:追加のインクルードディレクトリ」で、『gtest-1.5.0/include』を追加
・ランタイムライブラリ設定
 「C/C++:コード生成:ランタイム ライブラリ」で、『マルチスレッド デバッグ(/MTd)』を選択

これで設定終わり。

テストコード書いてみる



// googletestTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include

int _tmain(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();

getchar();
return 0;
}

int add(int a,int b){return a+b;}

TEST(googletestSample, Assert) {
EXPECT_EQ(add(1,2), 3); //1+2は3なので正解
EXPECT_EQ(add(1,2), 4); //1+2は3なのでエラー
}

実行結果はこうなります。

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from googletestSample
[ RUN ] googletestSample.Assert
d:googletesttest\googletesttest.cpp(19): error: Value of: 4
Expected: add(1,2)
Which is: 3
[ FAILED ] googletestSample.Assert (0 ms)
[----------] 1 test from googletestSample (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 0 tests.
[ FAILED ] 1 test, listed below:
[ FAILED ] googletestSample.Assert


1 FAILED TEST

緑と赤に色変わっているのは、見易く私が書いてるのではなく、コンソール上でこういう色ででます。赤い色があればエラーがあると一発で分かります!!コレ超便利。

テストケースの書き方的には、

TEST(テスト名,Assert)

で定義すれば勝手にテストケースに追加してくれて、実行してくれます。超便利!!

googletestイケテル!!!


posted by purigen at 11:00| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2011年10月27日

Boostを使ってみる-VCへのインストール-

Boostを使ってみる-VCへのインストール-

ダウンロードしてくる


http://www.boostpro.com/download/
にVisual Studio用のインストーラーがあるので落とす(私は、 BoostPro 1.44.0 Installerを選択しました)。

インストール


ダウンロードしたインストーラー起動して、「Yesマン」の如くNextを押していく。途中で、VisualStudioのバージョン聞かれるので、自分の環境のを選ぶ。

boostpro_install1.jpg
とりあえず全チェックしたった(大は小を兼ねる)。その後は、またNext押したりしてけばインストール終了。

プロジェクトの設定


boost使うには、プロジェクトでパス通してあげないといけないので、

「ソリューション エクスプローラ」のプロジェクト右クリック

プロパティ

構成プロパティ

・C/C++→全般→追加のインクルードディレクトリ:"C:\Program Files\boost\boost_1_44"
・リンカ→全般→追加のライブラリディレクトリ:"C:\Program Files\boost\boost_1_44\lib"

をそれぞれ追加する。プロジェクトの設定はコレ終わり(インストール先をデフォルトから変更した人は適当にパス調整して下さい)。


これで後は、思う存分boostを弄れます。弄ります。

参考サイト:
boost公式:http://www.boost.org/
本家本元
boostpro:http://www.boostpro.com/
boostのVC用のインストーラーとか提供してくれているサイト
Let's Boost:http://www.kmonos.net/alang/boost/
日本で一番有名なboost解説サイト。このサイト見れば家のサイト見る必要ない。
posted by purigen at 11:00| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする

2011年07月12日

C++で関数内関数(inner function)をやってやるんだぜ。。。

C++って関数内関数(inner function)って作れないじゃないですか? でも、書きたい時あるよね?っで悪あがき。

1.関数内で構造体は定義できる


関数内で構造体は定義できるじゃないっすか。それを利用して、

int main(){
//構造体作ってその中で関数を定義する
struct{
void print_msg(const char *msg){
printf(msg);
}
}inner_func;

//構造体を通して関数を呼ぶ
inner_func.print_msg("inner_func!!!");

return 0;
}

問題点は、「構造体名、関数名」の二つを考えないと(記述しないと)いけないのが面倒。

2.C++ってoperatorあるじゃないですか


operatorを使って上記を書き換えると。

int main(){
//構造体作ってoperatorで関数を定義する
struct{
void operator()(const char *msg){
printf(msg);
}
}print_msg;

//operatorなので構造体インスタンス名で呼べる
print_msg("inner_func!!!");

return 0;
}

よし、関数名1個で済むようになったけど、関数内関数作りたいだけなのにstruct定義しててソース汚くない?構造体したいのか、関数内関数定義したいのか意図が読みづらいし。

3.よーし、defineに相談だ!


基本的には上記でやりたい事はできたのでdefineで化粧をする。スッピンじゃ人前に出れないし。

//関数内関数定義開始用define
#define def_start(ret,...) struct{ret operator()(__VA_ARGS__)
//関数内関数定義終了用define
#define def_end(func_name) }func_name

int main(){
def_start(void,const char *msg){
printf(msg);
}def_end(print_msg);

print_msg("inner_func!!!");

reutrn 0;
}

なんか関数っぽい!関数っぽい!っぽい!っぽい!

という分けで、C++でも関数内関数っぽい事ができますよっと。
※可変長引数のdefineはC99でしか通らないです。
ラベル:C++
posted by purigen at 10:00| Comment(0) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。