【C++ユニットテスト】LinuxにGoogle Test(Google C++ Testing Framework)をビルドしてみた

【2015/3/15 追記】Google TestをLinux上のプロジェクトに組み込む方法を書きました

はじめに

Linux環境にGoogle Test(Google C++ Testing Framework)をビルドしてみました。
これから使う人は参考にしてみてください。

準備

ソースコードhttps://code.google.com/p/googletest/downloads/listから取得できます。
執筆時点の最新版はgtest-1.7.0.zipでした。

zipファイルの格納先は${HOME}/tmp/gtest-1.7.0.zip、ビルド先は${GTEST_DIR}としておきます。
お使いの環境に合わせて適宜読み替えてください。

ビルドにかかる前に解凍して、展開先のディレクトリに移動しておきましょう。

cd ${HOME}/tmp
unzip ./gtest-1.7.0.zip
cd ./gtest-1.7.0

ビルド方法

ビルド方法(静的ライブラリ)

まずは静的ライブラリとしてのビルド方法から。

mkdir lib
cd lib
cmake ..
make

コンパイルはこれだけです。 次にビルド先へ展開ディレクトリごと移動しちゃいます。

cd ${HOME}/tmp
mv ${HOME}/tmp/gtest-1.7.0 ${GTEST_DIR}

最後に、${HOME}/.bashrcの末尾に以下のステートメントを追加します。

export CPLUS_INCLUDE_PATH="${GTEST_DIR}/include:${CPLUS_INCLUDE_PATH}"
export LIBRARY_PATH="${GTEST_DIR}/lib:${LIBRARY_PATH}"

ビルド方法(共有ライブラリ)

続いては共有ライブラリとしてのビルド方法を示します。

cmakeコマンドに-DBUILD_SHARED_LIBS=ONオプションを追加していることに注意してください。

mkdir lib
cd lib
cmake -DBUILD_SHARED_LIBS=ON ..
make

静的ライブラリと同様にディレクトリを移動させます。

cd ${HOME}/tmp
mv ${HOME}/tmp/gtest-1.7.0 ${GTEST_DIR}

${HOME}/.bashrcには以下の三行を追加してください。
三行目があるので、コンパイラが共有ライブラリとして認識してくれます。

export CPLUS_INCLUDE_PATH="${GTEST_DIR}/include:${CPLUS_INCLUDE_PATH}"
export LIBRARY_PATH="${GTEST_DIR}/lib:${LIBRARY_PATH}"
export LD_LIBRARY_PATH="${GTEST_DIR}/lib:${LD_LIBRARY_PATH}"

テストコード

以下のコードが実行できれば成功です。
Makefileも一緒に載せておきます。

静的ライブラリ、libgtest.a使用

#include <gtest/gtest.h>

TEST(MathTest, OnePlusOneIsTwo) {
    EXPECT_EQ(2, 1+1);
}

GTEST_API_ int main(int argc, char **argv)
{
    printf("Running main() from gtest_main.cc\n");
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
# Makefile

.PHONY: all clean

CC       =g++
CFLAGS   =-Wall -ansi -pedantic
TARGET   =test
SRC      =test.cpp
HEADERS  =
INCLUDES =
LDFLAGS  =
LIBS     =-pthread -lgtest

all: $(TARGET)

$(TARGET): $(SRC) $(HEADERS) Makefile
  $(CC) -o $@ $(CFLAGS) $(SRC) $(INCLUDES) $(LDFLAGS) $(LIBS)

clean:
  rm -f $(TARGET)

静的ライブラリ、libgtest_main.a使用

libgtest_main.aを使う場合はメイン関数が不要です。

#include <gtest/gtest.h>

TEST(MathTest, OnePlusOneIsTwo) {
    EXPECT_EQ(2, 1+1);
}
# Makefile

.PHONY: all clean

CC       =g++
CFLAGS   =-Wall -ansi -pedantic
TARGET   =test
SRC      =test.cpp
HEADERS  =
INCLUDES =
LDFLAGS  =
LIBS     =-pthread -lgtest -lgtest_main

all: $(TARGET)

$(TARGET): $(SRC) $(HEADERS) Makefile
  $(CC) -o $@ $(CFLAGS) $(SRC) $(INCLUDES) $(LDFLAGS) $(LIBS)

clean:
  rm -f $(TARGET)

動的ライブラリ、libgtest.so使用

libgtest.soからリンクされているのでMakefile-pthreadは必要ありません。

#include <gtest/gtest.h>

TEST(MathTest, OnePlusOneIsTwo) {
    EXPECT_EQ(2, 1+1);
}

GTEST_API_ int main(int argc, char **argv)
{
    printf("Running main() from gtest_main.cc\n");
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
# Makefile

.PHONY: all clean

CC       =g++
CFLAGS   =-Wall -ansi -pedantic
TARGET   =test
SRC      =test.cpp
HEADERS  =
INCLUDES =
LDFLAGS  =
LIBS     =-lgtest

all: $(TARGET)

$(TARGET): $(SRC) $(HEADERS) Makefile
  $(CC) -o $@ $(CFLAGS) $(SRC) $(INCLUDES) $(LDFLAGS) $(LIBS)

clean:
  rm -f $(TARGET)

静的ライブラリ、libgtest_main.so使用

libgtest.soがlibtest_main.soからリンクされているため、Makefileから-lgtestをとってしまって問題ありません。

#include <gtest/gtest.h>

TEST(MathTest, OnePlusOneIsTwo) {
    EXPECT_EQ(2, 1+1);
}
# Makefile

.PHONY: all clean

CC       =g++
CFLAGS   =-Wall -ansi -pedantic
TARGET   =test
SRC      =test.cpp
HEADERS  =
INCLUDES =
LDFLAGS  =
LIBS     =-lgtest_main

all: $(TARGET)

$(TARGET): $(SRC) $(HEADERS) Makefile
  $(CC) -o $@ $(CFLAGS) $(SRC) $(INCLUDES) $(LDFLAGS) $(LIBS)

clean:
  rm -f $(TARGET)

実行結果

ついでに実行結果も載せます。

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from MathTest
[ RUN      ] MathTest.OnePlusOneIsTwo
[       OK ] MathTest.OnePlusOneIsTwo (0 ms)
[----------] 1 test from MathTest (0 ms total)

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

上手くいかなかったらコメントください。