C++のテストコードを書こう！ Visual Studio - Google Test

## はじめに

RailsはRSpecを普段使ってますが、C++のテストコードは書いたことがありませんでした。
そんな中でGoogle Testを見つけたので、実際にやってみようと思います。
[C++ Tutorial: Google Test (gtest) - 2020](https://www.bogotobogo.com/cplusplus/google_unit_test_gtest.php)という記事の内容を一通りやります。

## 環境

- Visual Studio 2015
    - 手元の環境がこれなので

## 実施

### 1. プロジェクト作成

まずはVisual Studio 2015でプロジェクトを作成。

![スクリーンショット 2025-01-15 092547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/ffee1b90-8c64-7285-71bb-63a986441bea.png)

Win32 コンソールアプリケーションにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/0368b6dd-3173-996f-5854-eac248b7eb0a.png)

次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/92749400-edf0-8f03-dec8-340fdd130cf2.png)

完了

main関数のファイルが出来上がる。

```cpp
// LetsGoogleTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int main()
{
    return 0;
}


```

### 2. テスト対象の関数を作成

```cpp
#pragma once

#include <cmath>

double cubic(double d) {
	return pow(d, 3);
}

```

### 3. Google Testの導入

公式のステップは以下のようになっています

1. Download Google test
    1. Google Testをダウンロード
1. Compile gtest into a static library
    1. ダウンロードしたソースからstaticライブラリを作成
1. Create a unit test project
    1. unit test用のプロジェクトを作成
1. Make a test case
    1. テストコード作成

#### 3.1 Google Testのソースをダウンロード

冒頭で紹介した記事の`gtest-1.7.0-rc1.zip`をダウンロードするのが簡単でしたので、今回はこちらでやりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/58518833-7285-518d-f701-0201d54ad1f9.png)

ダウンロードしたzipを解凍すると以下のようなファイル群が展開されます。
この中で`src`はGoogle Testのソースファイルのディレクトリ、`include`はVisual Studioからincludeするディレクトリになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/b8c8fcbc-7d5c-8dc4-4ddd-7944167aa09e.png)

#### 3.2 Google Testのソースをコンパイル

コンパイルするためのプロジェクトを作成します。

ソリューションを右クリック > 追加(D) > 新しいプロジェクト(N)から作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/388900e1-b06a-f923-83fb-29b9503f5f04.png)

プロジェクトの種類は「Win32 プロジェクト」、名前は自由だと思いますが、今回は記事に沿って「GoogleTest」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/eaa97da6-2fd4-118a-f6d1-6d87eb1b9c5b.png)

設定画面が表示されるので

- アプリケーションの種類: スタティックライブラリ
- 追加のオプション: プリコンパイル済みヘッダーをOFF

にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/8ff7b13e-ac47-7058-0a42-399cd6a7fbe5.png)

これによってGoogle Testをコンパイルするプロジェクトが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/c16d3b76-2b62-4839-93e2-38dbe43c6a73.png)

コンパイルするためには先程ダウンロードしたソースファイルを取り込む必要があるので、プロジェクトのプロパティからインクルードディレクトリを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/a52e8e7a-b41f-9f5c-0725-3ef9f264760d.png)

次に、Google Testのソースファイル`.cc`ファイルを指定します。
Google Test > ソースファイル > 追加 > 既存の項目

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/5272dbac-4bb8-43a8-e504-e0e53f5b6331.png)

追加対象のファイルは下記２つです。
（ディレクトリは適宜読み替えてくださいm(_ _)m）

- `C:\GTEST\gtest-1.7.0\src\gtest_all.cc`
- `C:\GTEST\gtest-1.7.0\src\gtest_main.cc`

追加するとGoogle Testプロジェクト内にGoogle Testのソースファイルが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/92eebfca-4b29-0711-00b4-5df47671ba02.png)

準備はおそらく整ったのでコンパイルをします。

プロジェクト > ビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/16525575-62fd-3eeb-f2bc-a9e7757e5600.png)

成功すると以下のように`ビルド: 1 正常終了`と表示されるはずです。

```text
1>        4 ミリ秒  CopyFilesToOutputDirectory                 1 回呼び出し
1>        4 ミリ秒  InitializeBuildStatus                      1 回呼び出し
1>        7 ミリ秒  PrepareForBuild                            1 回呼び出し
1>        8 ミリ秒  SetBuildDefaultEnvironmentVariables        1 回呼び出し
1>        9 ミリ秒  _CheckForInvalidConfigurationAndPlatform   1 回呼び出し
1>      458 ミリ秒  SetCABuildNativeEnvironmentVariables       1 回呼び出し
1>      774 ミリ秒  Lib                                        1 回呼び出し
1>     2411 ミリ秒  ClCompile                                  1 回呼び出し
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
```

### 4. Unit Testの作成

Google Testの準備は整いましたので、実際にテストコードを書いていきます。

#### 4.1 Unit Testのプロジェクト作成

まずはテスト用のプロジェクトを作成します。

ソリューションを右クリック > 追加 > 新しいプロジェクトで追加します。

追加画面では、種類を「Win32 コンソールアプリケーション」にし、プロジェクト名を`unittest_simple_math`にします。

設定画面は触らずに進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/169d4202-fb88-7480-1938-d0bf67427f1a.png)

#### 4.2 テストに必要なデータをプロジェクトに追加

まずは、プロジェクトのプロパティの「インクルードディレクトリ」に、Google Testに関するファイルを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/9362d97c-b1e6-620e-ff1a-f8aa779c29ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/e62e9a35-6cdb-8113-b999-f35f872e91ad.png)

次に、今回のテスト対象のsimple_mathを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/09d90792-8323-4ccb-ec2c-b49b15424e57.png)

最後に、テスト対象のsimple_mathとGoogle Testを、プロジェクトの参照に追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724444/ab1cfc3b-8d96-4b00-c8d2-c0c9844f39d6.png)

ここまででテスト用プロジェクトの設定は整ったはずです。

#### 4.3 テスト実装

ではいよいよテストを書いていきます。

Google Testのヘッダーである`gtest/gtest.h`と、今回実装したヘッダーである`simple_math.h`をincludeします。
そしてテストケース、期待結果と一緒に、実装した関数を実行します。

```cpp
#include "stdafx.h"
#include "gtest/gtest.h"
#include "simple_math.h"

TEST(testMath, myCubeTest)
{
	EXPECT_EQ(1000, cubic(10));
}

```

実行に成功すると以下のようなログが出力されるはずです。

```bash
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from testMath
[ RUN      ] testMath.myCubeTest
[       OK ] testMath.myCubeTest (0 ms)
[----------] 1 test from testMath (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (2 ms total)
[  PASSED  ] 1 test.

```

無事にUnit Testを行うことができました！

## おわりに

今回は１つの関数をテストしましたが、次はクラス等を交えたテストをやっていこうと思います。