エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Google Testをインストール、しないですませる方法

久々にGoogle Testネタ。
以前ちょっとふれて宿題としておきながら放置していたことを思い出したので、そのフォロー。

fused source files are included.

バージョン1.5.0の時点で新機能(?)として「fused source files」が追加されています。先のエントリを書いた時点では調査不足でわかっていなかったんですが、名前から予想したとおり、「コピーしてincludeコンパイルしてリンクすりゃOK」というものでした。

現在最新のリリースである1.6.0のzipファイルを展開すると「fused-src」というフォルダがあり、その中に「gtest」というフォルダがひとつだけ入っています。

  • gtest-1.6.0/
    • fused-src/
      • gtest/

このフォルダの中に行数が約2万行の「gtest.h」というヘッダファイルと同じく約1万行の「gtest-all.cc」(どちらも空行コメント行なども含む)というふざけたファイルが格納されています。このふたつのファイルにGoogle Testの全実装がおさまっています。

このフォルダにはもうひとつ「gtest_main.cc」というmain関数を記述した小さなファイルがあります。テストの前後で特別になにかをするのでないばあい、main関数に書くことはいつも同じになるのでこれも一緒に提供されている模様。このファイルをコンパイル、リンクすればmain関数を自分で書く必要がないので、ただテストだけを書けばOKという状況になります。

file name file size(byte) lines
gtest.h 801,700 19,537
gtest-all.cc 337,020 9,118
gtest_main.cc 1,772 39

実際にやってみる

現在作業をしているフォルダに「gtest-1.6.0/fused-src/」の中の「gtest/」をフォルダごとコピーします。
ちなみに。丸ごとコピーという大雑把な方法以外にも、Google Testのガイドのページにも記述があるように「gtest-1.6.0/scripts/」というフォルダの中の「fuse_gtest_files.py」というスクリプトを使う方法もあります。Pythonが得意な方はこちらを使うのがよいのかもしれません。


作業しているフォルダにこんな感じの適当なテスト対象があったとして。

#ifndef SAMPLE_H
#define SAMPLE_H

template<typename T> inline const T& min(const T& lhs, const T& rhs) { return (lhs < rhs) ? lhs : rhs; }
template<typename T> inline const T& max(const T& lhs, const T& rhs) { return (lhs > rhs) ? lhs : rhs; }

#endif//SAMPLE_H


テストはこんな感じでごりごりと書いたとして。

#include "gtest/gtest.h"

#include "sample.h"

TEST(MinTest, test1) { ASSERT_EQ(min(1, 2), 1); }
TEST(MinTest, test2) { ASSERT_EQ(min(1, 1), 1); }
TEST(MinTest, test3) { ASSERT_EQ(min(1, 0), 0); }
TEST(MaxTest, test1) { ASSERT_EQ(max(1, 2), 2); }
TEST(MaxTest, test2) { ASSERT_EQ(max(1, 1), 1); }
TEST(MaxTest, test3) { ASSERT_EQ(max(1, 0), 1); }

(ちなみに。行数を圧縮して書いているのは、適当な例で幅をとっても読みにくいだろうから、というそれだけの理由だけです)
ここでのポイントは。本当にテストのコードしか書いていないというところです。


あとはこんな感じで「gtest-all.cc」と「gtest_main.cc」を一緒にコンパイル、リンクしてやるだけでテストの実行ファイルが生成されます。

g++ -o sampleTest sampleTest.cpp gtest/gtest-all.cc gtest/gtest_main.cc


実行結果。

$ ./sampleTest 
Running main() from gtest_main.cc
[==========] Running 6 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 3 tests from MinTest
[ RUN      ] MinTest.test1
[       OK ] MinTest.test1 (0 ms)
[ RUN      ] MinTest.test2
[       OK ] MinTest.test2 (0 ms)
[ RUN      ] MinTest.test3
[       OK ] MinTest.test3 (0 ms)
[----------] 3 tests from MinTest (3 ms total)

[----------] 3 tests from MaxTest
[ RUN      ] MaxTest.test1
[       OK ] MaxTest.test1 (0 ms)
[ RUN      ] MaxTest.test2
[       OK ] MaxTest.test2 (0 ms)
[ RUN      ] MaxTest.test3
[       OK ] MaxTest.test3 (0 ms)
[----------] 3 tests from MaxTest (2 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test cases ran. (9 ms total)
[  PASSED  ] 6 tests.


Google Testを使ってみたいけど環境整えるのがなんか面倒くさい」とか感じているようなばあいに、この方法をためしてみてはどうでしょうか。