【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.
上手くいかなかったらコメントください。