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


はじめに

Google Testは、Googleがオープンソースで公開しているC++のテストフレームワークです。

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

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

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

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

NOTE:

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

プロジェクト構成例

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

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

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

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 には、テスト用に適当なメソッドを定義します。

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

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

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

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の設定ファイルを、下の内容で作成します。

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)

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

テストのビルドと実行

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

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

例えば、次のような 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による公式のガイドが下ですが、筆者は試していません。

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

テストの書き方について

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

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

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

リンク