モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

GoogleTest (C++ テストフレームワーク) の基本的な使用方法

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/06/06
最終更新最終更新
2022/07/28
記事区分記事区分
一般公開

目次

    AWSとAzureが好きです。

    0
    ステッカーを贈るとは?

    ダウンロード

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

    ビルド方法

    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>
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    AWSとAzureが好きです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事