Google TestによるC++のテスト環境構築


# はじめに

[Google Test](https://github.com/google/googletest)は、Googleがオープンソースで公開しているC++のテストフレームワークです。

本稿では、Google Testを使ってC++のコードをテストするごく小さなプロジェクトの構成例を紹介します。
主に、これからGoogle Testによるテストを導入しようとしている人にとって、参考になればと思います。

筆者が作業した環境の情報は以下の通りです。

- Mac OS X El Captain
- CMake v3.8.2
- Google Test v1.8.0

Mac環境ではありますが、 [CMake](https://cmake.org/) を使っているので、大抵の環境で通用するやり方だと思います。
CMake自体は、公式サイトのバイナリや、Macであれば [Homebrew](https://brew.sh/) によってインストールできます。

NOTE:

- Google Test v1.8でディレクトリ構成が変わっているため、以降の記述について、v1.7以前を使う場合は変更が必要な部分があります。

# プロジェクト構成例

ミニマムなソースツリーの構成を示します:

```bash
myapp/
├── MyApp.cpp
├── MyApp.hpp
└── test/
    ├── CMakeLists.txt
    ├── MyAppTest.cpp
    └── lib/
        └── googletest # git submodule
```

Google TestはGit submoduleとして追加します。
そのコマンド例は、以下のようになります:

```bash:googletestをsubmoduleとして追加
# shell
mkdir -p test/lib
git submodule add https://github.com/google/googletest.git test/lib/googletest
pushd test/lib/googletest
git checkout release-1.8.0
popd
git add test/lib/googletest
git commit -m "Add submodule googletest for testing"
```

## サンプルコード

上のソースツリーを前提に、かんたんなソースコードとテストコードのサンプルを示します。

`MyApp.cpp` には、テスト用に適当なメソッドを定義します。

```cpp:MyApp.hpp
class MyApp
{
public:
    static int multiply(int i, int j);
};
```

```cpp:MyApp.cpp
#include "MyApp.hpp"

int MyApp::multiply(int i, int j)
{
    return i * j;
}
```

`test/MyAppTest.cpp` に、Google Testを使ったテストコードを記述します。

```cpp:test/MyAppTest.cpp
#include "../MyApp.hpp"
#include "gtest/gtest.h"

TEST(multiply, base)
{
    EXPECT_EQ(1, MyApp::multiply(1,1));
}
```

テストの書き方については、記事末尾で参考リソースを紹介しています。

## テスト用のCMake設定

上のようなテストコードに `MyApp.cpp` とGoogle Testをリンクしてビルドし、テスト用の実行ファイルを生成します。

CMakeの設定ファイルを、下の内容で作成します。

```CMake:test/CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(myapp-test)

# Google TestのCMakeプロジェクトを追加し、Google Testをビルド
# ※v1.7以前はディレクトリ構成が異なる
add_subdirectory(lib/googletest/googletest)

# MyApp.cppを識別名"myapp"でコンパイル
add_library(myapp ../MyApp.cpp)
# MyAppTest.cppからmyapp-test実行ファイルをビルド
add_executable(myapp-test MyAppTest.cpp)
# ライブラリをリンクする
target_link_libraries(myapp-test myapp gtest_main)
```

これで、準備が整いました。

## テストのビルドと実行

コマンド例を次に示します:

```bash
# shell
mkdir -p test/build # ビルド用ディレクトリ作成
cd test/build
cmake .. # CMakeLists.txtの内容に基づき、Makefileを生成
make # myapp-test実行ファイルをビルド
./myapp-test # テスト実行
```

例えば、次のような `Makefile` を用意しておくと、プロジェクトのルートディレクトリから簡単にテストの実行とクリーンアップが可能です。

```Makefile:Makefile
.PHONY: test clean

TEST_BUILD_DIR := test/build

test: $(TEST_BUILD_DIR)
        set -x && cd $(TEST_BUILD_DIR) && cmake .. && make && ./myapp-test

$(TEST_BUILD_DIR):
        mkdir -p $(TEST_BUILD_DIR)

clean:
        rm -rf $(TEST_BUILD_DIR)
```

# 参考

## Google TestをXcodeから実行する方法

Google Testによる公式のガイドが下ですが、筆者は試していません。

- [googletest/V1_5_XcodeGuide.md at master · google/googletest](https://github.com/google/googletest/blob/master/googletest/docs/V1_5_XcodeGuide.md)

ちなみに、本記事で示したCMakeによる環境が整っていれば、 `cmake -G Xcode` でテスト実行可能なXcodeプロジェクトを生成することは可能です。

## テストの書き方について

公式の入門ドキュメントは以下です:

- [googletest/Primer.md at master · google/googletest](https://github.com/google/googletest/blob/master/googletest/docs/Primer.md)

v1.6向けには、日本語訳があります。

- [Google Test — Google Test ドキュメント日本語訳](http://opencv.jp/googletestdocs/)

また、リポジトリ内のサンプルコードも参考にできるでしょう。

- https://github.com/google/googletest/tree/master/googletest/samples

## リンク

- https://github.com/google/googletest
- https://cmake.org/
- [GoogleTestでC++のコードをテストする - Qiita](http://qiita.com/tjun/items/8047bf50930e6de36bdc)