こちらから最新のものをダウンロードします。
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
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>