Visual StudioでC++のGoogle Testを使ってみた

# 目的
- Visual StudioでC++のGoogle Testを使ってみたのでその手順をまとめてみました。

# 前提
- 作業環境
    - Windows 10
    - Visual Studio 2017 Communityがインストール済みであること
    - Visual Studio でVisual C++のプロジェクトが新規生成できること

# 1.Visual Studio でテスト対象のクラスライブラリを作る
1.1. Visual Studioを起動し、[ファイル]-[新規生成]-[プロジェクト]メニューを実行します。
![2019-05-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/eb40db15-ddc3-5f90-f364-063d6145a5c4.png)

1.2. 左のタブで[Visual C++]-[Windows デスクトップ]を選択し、[スタティックライブラリ]を選択します。名前をここでは「MyInt」にして、場所は任意です。名前と場所を指定したら[OK]を押してプロジェクトを新規生成します。
![2019-05-12 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/9560cb96-56d0-c3de-5119-40aee4186ecc.png)

1.3. [プロジェクト]-[クラスの追加]メニューを実行します。
![2019-05-12 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/8b0bb0b3-823b-6bf9-8e3b-dc3769f94449.png)

1.4. クラス名を[MyInt]にして[OK]してクラスを作成します。
![2019-05-12 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/cb0b8b1c-2347-b8e4-d60e-1a223957f66c.png)

1.5. MyIntクラスの定義
MyIntクラスについては@tjunさんの[こちらの記事のサンプルコード](https://qiita.com/tjun/items/8047bf50930e6de36bdc)をお借りさせていただきました。
1.5.1. MyInt.hの定義

````cpp
class MyInt
{
public:
  MyInt(int num);
  bool isOdd();
  bool isEven();
private:
  int num_;
};
````

1.5.2. MyInt.cppの定義

````cpp

// include部分は若干引用元と異なります。
#include "stdafx.h"
#include "MyInt.h"

MyInt::MyInt(int num)
:num_(num)
{}

bool MyInt::isOdd()
{
  // 奇数かどうかを判定する
  return (num_ % 2) != 0 ? true : false;
}

bool MyInt::isEven()
{
  return isOdd();  // 例として、ここにバグがある
}
````

1.6. ソリューションをビルドしてこのプロジェクトを閉じます。

# 2.テストを実行するプロジェクトを作成する
2.1. Visual Studioを起動し、[ファイル]-[新規生成]-[プロジェクト]メニューを実行します。
2.2. 左側のタブで[Visual C++]-[テスト]を選択し、[Google Test]を選択します。名前を[MyIntGoogleTest]とし、場所を任意の場所にします。[OK]してプロジェクトを作成します。
![2019-05-12 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/fcc07121-1edf-cb50-f982-b19a1375ae40.png)
2.3. 下記のような画面が表示されたら[Google Testの使用法：]を[スタティックライブラリ(.dll)]、[C++ランタイムライブラリ:]を[動的リンク(推奨)]にして[OK]します。
![2019-05-12 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/3de26d87-f3d0-ddd4-e355-1897f6386c9d.png)
2.4. [ファイル]-[追加]-[既存のプロジェクト]メニューを実行し、1で作成したテスト対象のプロジェクトを追加します。
![2019-05-12 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/98f18fca-2710-a2c5-865f-55f36ae05ce1.png)
![2019-05-12 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/878e4416-7a98-8498-5775-94086888c4e5.png)
2.5. MyIntGoogleTestプロジェクトにMyIntの参照を追加します。ソリューションエクスプローラーで[MyIntGoogleTest]-[参照]を選択して[プロジェクト]-[参照の追加]メニューを実行します。
![2019-05-12 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/d3222b33-b372-f031-8f05-426ad3ac6b82.png)
2.6 [参照の追加]画面で[MyInt]にチェックを入れて[OK]します。
![2019-05-12 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/7c546b35-72d8-731d-e977-a6daf3722ace.png)
2.7. [MyIntGoogleTest]プロジェクトのtest.cppに以下のテストコードを書きます。

``` cpp:test.cpp
#include "pch.h"
#include "gtest/gtest.h"
// ↓はMyInt.hをどこに作成したかで異なる。
#include "../../../MyInt/MyInt/MyInt.h" 

namespace {

	class MyIntTest : public ::testing::Test {};
![2019-05-12 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/e78a7d06-b75c-b69b-c56d-51365467de73.png)

	TEST_F(MyIntTest, isOdd)
	{
		MyInt mi1 = MyInt(10);
		EXPECT_EQ(false, mi1.isOdd());
	}


	TEST_F(MyIntTest, isEven)
	{
		MyInt mi1 = MyInt(10);
		EXPECT_EQ(true, mi1.isEven());
	}

} // namespace
```
これで準備は完了です。

# 3. テストを実行する。
2で作成したプロジェクトで、[テスト]-[すべてのテストを実行]メニューを実行します。そうするとビルドが実行された後にテストコードが実行され、テストエクスプローラ上でテスト結果が表示されます。
![2019-05-12 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/4f383c4d-f6c7-cad4-a5c8-6a8a59e57e2f.png)
テストエクスプローラー上では、
 - 緑色：成功
 - 赤色：失敗
になっています。
これでテストが出来ました！！

# 課題/疑問点
 - デバッグ実行すると「gtest.ccが見つかりません」言われる。
    - 正直これが一体何者なのかググってみましたが、まだよくわかっていません。
    
    ![2019-05-12 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228736/e479e423-2335-2437-dbbf-84372cd5e948.png)