理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> C++ Tips >> GoogleTest
このエントリーをはてなブックマークに追加

Google Testの使い方

作成日:2015.1.6
環境:Mac OS X 10.10.1, gcc version 4.8.3 (MacPorts gcc48 4.8.3_4)
  1. はじめに
  2. Google Testのコンパイル
  3. テストコード作成方法

はじめに

Google TestはGoogle C++ Testing Frameworkのことで,C++用のコードのテストを簡単に書くための補助ライブラリです。

ここではテスト対象のソースコード及びGoogle Testのソースコードを次のように配置することにします。

google_test_sample_code/
├makefile
├main.cc
├atom.h
├atom.cc (テストしたいクラスのソース)
└gtest/  (テスト関連ファイルを入れるディレクトリ)
 ├makefile
 ├main.cc (テスト時のメインソース)
 ├atom_test.cc (Atomクラスのテストを書いたソース)
 └gtest-1.7.0/ (Google Testのソース一式)
  ├・・・
このページで使ったサンプルソースはGitHubにアップしました。 そこから取得できます。 Google Testのソースコードはこちらから取得できます。

Google Testのコンパイル

上記のディレクトリ構造のgoogle_test_sample_code/gtest/にGoogle Testのコードを置いて,その場で展開します。

  1. $ cd google_test_sample_code/gtest
  2. $ wget https://googletest.googlecode.com/files/gtest-1.7.0.zip
  3. $ unzip gtest-1.7.0.zip
  4. $ cd gtest-1.7.0

次に,取得したGoogle Testのソースからライブラリを作成する2つの方法を紹介します。

configureを使う方法

Google Testに同梱されているconfigureスクリプトを使えば,簡単にライブラリを作成できます。

  1. $ ./configure
  2. $ make
makeが終わった時点で,lib/内にlibgtest.laが,include/gtest/内にgtest.hが入ります。 このあと続けて,
  1. $ sudo make install
を実行すれば/usr/local/以下にライブラリ,ヘッダファイルともにインストールできます。(しかし,ここでは行わない。)

拡張子.laのファイルはLibtoolライブラリで,他のオブジェクトとリンクするときにはLibtoolが必要になります。

  1. $ cd ../
  2. $ glibtool --mode=link --tag=CXX c++ -o gtest -L./gtest-1.7.0/lib -lgtest \
  3. ../atom.o atom_test.o main.o
Mac OS XにデフォルトでインストールされているlibtoolはBSD由来のコマンドで使用方法が異なるので,Mac Portなどを使ってGNU Libtoolをインストールする必要があります。 コマンド名はglibtoolになります。

スタティックライブラリを手動で作成する方法

Libtool用のライブラリではなく,通常のライブラリを作成してリンクすることもできます。 この場合,configureは使わずに手動でgtest-all.ccをコンパイルします。

  1. $ cd gtest-1.7.0
  2. $ c++ -I./include -I. -c src/gtest-all.cc
  3. $ mkdir -p lib
  4. $ ar -rv lib/libgtest.a gtest-all.o
  5. $ rm gtest-all.o
作成したライブラリlibgtest.aをテストコードにリンクさせて実行ファイルを作成します。
  1. $ cd ../
  2. $ c++ -o gtest -L./gtest-1.7.0/lib -lgtest ../atom.o main.o atom_test.o

テストコード作成方法

テスト対象のクラス

テスト対象のクラスをAtomクラス,そのソースファイルをatom.cc,ヘッダファイルをatom.hとします。 Atomクラスは二次元の座標と元素記号を持つクラスです。

  1. /* === atom.h === */
  2. #include<string>
  3. class Atom{
  4. private:
  5. int m_x;
  6. int m_y;
  7. std::string m_element;
  8. public:
  9. Atom(int x, int y, std::string str);
  10. virtual ~Atom();
  11. int getX(void);
  12. int getY(void);
  13. std::string getElement(void);
  14. };
  1. /* === atom.cc === */
  2. #include <sstream>
  3. #include "atom.h"
  4. int Atom::getX(void){
  5. return m_x;
  6. }
  7. int Atom::getY(void){
  8. return m_y;
  9. }
  10. std::string Atom::getElement(void){
  11. return m_element;
  12. }
  13. Atom::Atom(int x,int y,std::string str):m_x(x),m_y(y),m_element(str){}
  14. Atom::~Atom(void){}

main.ccの書き方

テストコードのmain.ccはフォーマットにしたがって作成するだけです。 gtestディレクトリ以下に作成します。

  1. #include <gtest/gtest.h>
  2. int main(int argc, char **argv){
  3. ::testing::InitGoogleTest(&argc,argv);
  4. return RUN_ALL_TESTS();
  5. }

テストコードの書き方

このatomクラスのテストをgtestディレクトリ以下に作成しよう。 まずはテストを記述するためのファイルatom_test.ccを準備します。

  1. /* === atom_test.cc === */
  2. #include <gtest/gtest.h>
  3. #include "../atom.h"
  4.  
  5. TEST(AtomTest,coordinate){
  6. Atom atom(3,7,"Au");
  7. ASSERT_EQ(3,atom.getX());
  8. ASSERT_EQ(7,atom.getY());
  9. }
  10.  
  11. TEST(AtomTest,element){
  12. Atom atom(3,7,"Au");
  13. ASSERT_EQ("Au",atom.getElement());
  14. }
このファイルをコンパイルするときには,gtest.hのパスを-Iオプションで指定する必要があります。
  1. $ c++ -c atom_test.cc -I./gtest-1.7.0/include
atom_test.ccに書かれているマクロ関数TEST(test_case_name,test_name)がテスト用関数です。 この中にテスト内容を書きます。 第一引数のtest_case_nameには,例えば《クラス名+Test》などテストのグループ名を与えます。 第二引数のtest_nameには,例えば《element》のように,もう少し細かいテスト名を任意につけることができます。 これらの文字列をテストを実行したときの出力で利用されます。

7行目のASSERT_EQ()はテストに使うマクロ関数で,第一引数と第二引数が等しいかどうかをチェックしています。 その他のマクロ関数は『Google Testドキュメント日本語訳』を参照してください。

Google Testのライブラリとテストコードをリンクさせる方法は前節で少し説明していますが,glibtoolを使う場合は,

  1. $ glibtool --mode=link --tag=CXX g++ -o gtest \
  2. > -L./gtest-1.7.0/lib -lgtest ../atom.o main.o atom_test.o

テストを実行すると,次のような出力が得られます。

  1. $ ./gtest
  2. [==========] Running 2 tests from 1 test case.
  3. [----------] Global test environment set-up.
  4. [----------] 2 tests from AtomTest
  5. [ RUN ] AtomTest.coordinate
  6. [ OK ] AtomTest.coordinate (0 ms)
  7. [ RUN ] AtomTest.element
  8. [ OK ] AtomTest.element (0 ms)
  9. [----------] 2 tests from AtomTest (0 ms total)
  10.  
  11. [----------] Global test environment tear-down
  12. [==========] 2 tests from 1 test case ran. (0 ms total)
  13. [ PASSED ] 2 tests.

参考サイト・参考文献