Archives

visual studio 2013でx64構成でGoogle C++ Testing Framework(gtest)を使ってテストするまで

実はvisual studio 2013は学生なら無料で使えます。しかもvisual studio 2012から追加されたダークテーマはかっちょいい。フォントはゴミのようだけどMacTypeとRictyのおかげでどうにかなる。これは乗るしかない。

実はvisual studioは2013のバージョン名が12で2012のバージョン名が11でそれぞれ.NETのバージョンがあってとかそこに慣れるまでは殺意を覚えることも多々あるのですが、それはそれとして。

C++のテストはちょっと調べてみたところ、Boost.TestかGoogle C++ Testing Framework(gtest)が良さそうだった。テストのためだけにboostをムニャムニャするのは面倒くさそうなので、gtestを使う。以下はテストできるようになるまでの手順。

  • https://code.google.com/p/googletest/downloads/listから最新版gtestのzip(僕の場合はgtest-1.7.0.zipだった)をダウンロード
  • zipを適当な場所(C:\とか$(HOME)\とか)に展開
  • gtest-1.7.0\msvc\gtest.slnをvisual studio 2013で開く
  • 「一方向のアップグレード」とか言われる -> そのまま「OK」

スクリーンショット_121513_042923_PM

  • 何やらヤバそうな変換レポートがブラウザで開かれるが気にしない

スクリーンショット_121513_043151_PM

  • 「ソリューションエクスプローラー」から「ソリューション’gtest'(4プロジェクト)」を右クリック -> 「構成マネージャー」
  • 「アクティブソリューションプラットフォーム」 -> 「新規作成」
    • 「新しいプラットフォームを…」から「x64」を選択
    • 「設定のコピー元」は「Win32」のまんま
    • 「新しいプロジェクトプラットフォームを作成する」にチェックが入っていることを確認したら、「OK」

スクリーンショット_121513_044112_PM

  • プラットフォームが全部「x64」になっていることを確認して「閉じる」(ならない場合は、「設定のコピー元」を「<空>」にしている可能性がある)
  • いよいよ「メニュー」 -> 「ソリューションのビルド」を実行
  • もし下記のようなエラーが出たとしても、「gtestのテスト」(gtest_prod_testやgtest_unittest)が失敗しただけで肝心のgtestとgtest_mainは成功しているので無視して良い

「エラー 8 error C1041: プログラム データベース ‘HOGEHOGE\gtest-1.7.0\msvc\x64\debug\vc120.pdb’ を開けません。複数の CL.EXE が同じ .PDB ファイルに書き込む場合、/FS を使用してください。」

  • C:\Users\OHTA\Downloads\gtest-1.7.0\msvc\x64\Debugが出来て「gtest_maind.lib」と「gtestd.lib」が作成されていることを確認

これでライブラリファイルが作成されました。gtestソリューションを閉じます。次に、テストを実行したいプロジェクトを含んだソリューションをvisual studioで開きます。

  • アクティブソリューションプラットフォームはもちろん「x64」。なぜなら彼もまた特別な存在だからです
  • プロジェクトを右クリック -> 「プロパティ」 -> 「構成プロパティ」 -> 「C/C++」 -> 「コード生成」 -> 「ランタイムライブラリ」を「マルチスレッド デバッグ (/MTd)」にする
  • 「表示」 -> 「プロパティマネージャー」から「Debug | x64」をダブルクリック
    • 「共通プロパティ」 -> 「VC++ディレクトリ」の「インクルードディレクトリ」に「HOGEHOGE\gtest-1.7.0\include」を追加
    • 同様に「ライブラリディレクトリ」に「HOGEHOGE\gtest-1.7.0\msvc\x64\Debug」を追加
  • 「Release | x64」にも必要であれば同じパスを追加する

このプロジェクトは以下の3つのファイルから成り立っているとします。intをstringに変換して標準出力するだけです。

  • util.h
#ifndef _MYPROJECT_UTIL_H_
#define _MYPROJECT_UTIL_H_
#include <sstream>

std::string intToString(int number);

#endif
  • util.cpp
#include "util.h"
std::string intToString(int number)
{
  std::stringstream ss;
  ss << number;
  return ss.str();
}
  • main.cpp
#include <iostream>
#include "util.h"
using namespace std

int main()
{
  cout << intToString(2) << endl;
  return 0;
}

では、関数 intToString(int number)をテストしてみます。

まず新たにutilTest.cppファイルを追加します。

  • utilTest.cpp
#include <gtest/gtest.h>
#include "util.h"

#pragma comment( lib, "gtestd.lib" )
#pragma comment( lib, "gtest_maind.lib" )

TEST(IntToStringTest, Blackbox) {
  EXPECT_EQ("2", intToString(2)); // 成功するはず
  EXPECT_EQ("", intToString(2));  // 失敗するはず
}

そしたら、mainファイルに「テストしまっせ」と言ってもらいます。

#include <iostream>
#include <gtest/gtest.h>
#include "util.h"
using namespace std

int main(int argc, char **argv)
{
#ifdef _DEBUG
  ::testing::InitGoogleTest(&argc, argv);
  RUN_ALL_TESTS();
#endif

cout << intToString(2) << endl;
  return 0;
}

デバッグ時だけテストするようにしました。

これでF5でデバッグ開始します。

スクリーンショット_121513_061326_PM

IntToStringTestのBlackboxっていうテストが失敗しましたよ、と出てきます。失敗するはずのテストを書いているので当然です。main.cppがbaseAlgorithm.cppとなっていますがそういうこともあります。

今度は EXPECT_EQ(“”, intToString(2)); をコメントアウトしましょう。

スクリーンショット_121513_061707_PM

なんということでしょう。テストが通りました。

今まではassertだったので、これからテストの威力を実感したいところです。