GoogleTest (C++ テストフレームワーク) の基本的な使用方法
[履歴] [最終更新] (2020/03/24 00:49:16)
最近の投稿
注目の記事

ダウンロード

こちらから最新のものをダウンロードします。

ビルド方法

cmake ("c" は cross-platform を意味) を利用します。

静的ライブラリをビルドする場合

tar zxvf googletest-release-1.8.1.tar.gz
cd googletest-release-1.8.1/googletest/
mkdir build
cd build/
cmake ..
make

成果物 (*.a ファイル)

$ /path/to/googletest-release-1.8.1/googletest/build$ ls -ltr
total 1856
-rw-r--r-- 1 username username    6330 Sep 24 21:20 Makefile
-rw-r--r-- 1 username username    1568 Sep 24 21:20 cmake_install.cmake
-rw-r--r-- 1 username username   14818 Sep 24 21:20 CMakeCache.txt
-rw-r--r-- 1 username username 1857374 Sep 24 21:20 libgtest.a
-rw-r--r-- 1 username username    4108 Sep 24 21:20 libgtest_main.a
drwxr-xr-x 6 username username    4096 Sep 24 21:20 CMakeFiles

動的ライブラリをビルドする場合

tar zxvf googletest-release-1.8.1.tar.gz
cd googletest-release-1.8.1/googletest/
mkdir build
cd build/
cmake .. -DBUILD_SHARED_LIBS=1
make

成果物 (*.so ファイル)

$ /path/to/googletest-release-1.8.1/googletest/build$ ls -ltr
total 1128
-rw-r--r-- 1 username username    6330 Sep 24 21:25 Makefile
-rw-r--r-- 1 username username    1568 Sep 24 21:25 cmake_install.cmake
-rw-r--r-- 1 username username   14816 Sep 24 21:25 CMakeCache.txt
-rwxr-xr-x 1 username username 1099896 Sep 24 21:25 libgtest.so
-rwxr-xr-x 1 username username   17160 Sep 24 21:25 libgtest_main.so
drwxr-xr-x 6 username username    4096 Sep 24 21:25 CMakeFiles

レポジトリ管理下にある場合などは以上で完了です。そうではなく、システム全体で利用できるようにしたい場合は適当な場所に移動させてリンクなども作っておきます。

移動

sudo mv googletest-release-1.8.1 /usr/local/
sudo chown -R root: /usr/local/googletest-release-1.8.1/

シンボリックリンク

sudo ln -s /usr/local/googletest-release-1.8.1/googletest/include/gtest /usr/local/include/gtest
sudo ln -s /usr/local/googletest-release-1.8.1/googletest/build/libgtest_main.a /usr/lib/libgtest_main.a
sudo ln -s /usr/local/googletest-release-1.8.1/googletest/build/libgtest.a /usr/lib/libgtest.a
sudo ln -s /usr/local/googletest-release-1.8.1/googletest/build/libgtest_main.so /usr/lib/libgtest_main.so
sudo ln -s /usr/local/googletest-release-1.8.1/googletest/build/libgtest.so /usr/lib/libgtest.so

動作確認

sample.cpp

#include <gtest/gtest.h>

TEST(TestCaseName, TestName) {
    EXPECT_EQ(1,1);
}

ビルド例は以下の通りです。gtest を -l オプションで指定すると libgtest.(a|so) がリンクされます。pthread アーカイブにも依存しているためオプション指定しておきます。

g++ sample.cpp -I/path/to/googletest-release-1.8.1/googletest/include -L/path/to/googletest-release-1.8.1/googletest/build -lpthread -lgtest_main -lgtest

上述のインストール手順において、標準のインクルードパスおよびライブラリーパスにシンボリックリンクを生成している場合には -I および -L オプションは不要です。

g++ sample.cpp -lpthread -lgtest_main -lgtest

ビルドされたバイナリを実行してみましょう。

./a.out
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestCaseName
[ RUN      ] TestCaseName.TestName
[       OK ] TestCaseName.TestName (0 ms)
[----------] 1 test from TestCaseName (0 ms total)

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

サンプルコード

入門ガイド上級ガイドを参照してテストを記述します。

sub.h

#ifndef SUB_H_20141218_1351_
#define SUB_H_20141218_1351_

void MyFunc();
extern int intval;

#endif

sub.cpp

#include "sub.h"
#include <iostream>

void MyFunc() {
    std::cout << "MyFunc" << std::endl;
}
int intval = 128;
char charval = 'a';

main.cpp

#include "sub.h"
#include <iostream>
using namespace std;

int main() {
    MyFunc();
    cout << intval << endl;
    extern char charval;
    cout << charval << endl;
    return 0;
}

Makefile (以下の空白四つはタブです。コピペ時に注意してください)

CC = g++
CFLAGS = -g -Wall

ALL: main.o sub.o
    $(CC) $(CFLAGS) -o main main.o sub.o

main.o: main.cpp
    $(CC) $(CFLAGS) -o main.o -c main.cpp

sub.o: sub.cpp sub.h
    $(CC) $(CFLAGS) -o sub.o -c sub.cpp

test.cpp

#include "sub.h"
#include <gtest/gtest.h>

TEST(MyTestCase, MyTest2) {
    EXPECT_EQ(intval, 128) << "custom failure message" << 123;
    EXPECT_STREQ("string", "string");
    EXPECT_STRCASEEQ("ignore case", "Ignore Case");
    EXPECT_NE(intval, -128);
    EXPECT_STRNE("string", "_string");
    EXPECT_STRCASENE("ignore case", "_Ignore Case");
    EXPECT_TRUE(true);
    EXPECT_FALSE(false);
}

テストの実行例

$ g++ test.cpp sub.cpp -lpthread -lgtest_main -lgtest
$ ./a.out 
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from MyTestCase
[ RUN      ] MyTestCase.MyTest2
[       OK ] MyTestCase.MyTest2 (1 ms)
[----------] 1 test from MyTestCase (1 ms total)

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

ビルドおよび実行例

$ make
g++ -g -Wall -o main.o -c main.cpp
g++ -g -Wall -o sub.o -c sub.cpp
g++ -g -Wall -o main main.o sub.o
$ ./main 
MyFunc
128
a

JUnit test レポートの生成

CI 等で JUnit 形式の XML が必要になる場合は以下のオプションを付与します。

./a.out --gtest_output=xml:output.xml

出力例

$ cat output.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="1" failures="0" disabled="0" errors="0" time="0" timestamp="2020-03-24T00:47:30" name="AllTests">
  <testsuite name="TestCaseName" tests="1" failures="0" disabled="0" errors="0" time="0" timestamp="2020-03-24T00:47:30">
    <testcase name="TestName" status="run" result="completed" time="0" timestamp="2020-03-24T00:47:30" classname="TestCaseName" />
  </testsuite>
</testsuites>
関連ページ