はじめに
Google Test は Google 製の C++ Test Framework です。
導入については良質な解説ページがいくらでもあるので省略、ここではいつのまにか忘れてしまう事柄や、実際に使用して得た知見を備忘のために残します。
備忘録
テストケース名、テスト名について
どちらも有効な C++ の識別子でなければならず、アンダースコア(_)を使用してはいけません。Google Test ではテストの名前解決のためにアンダースコア(_)を用いて名前を連結しており、ユーザがこれに干渉するのを避けるためです。よって、テストケース名、テスト名は必然的に Camel Case(Pascal Case)となります。
参考: なぜ,テストケース名やテスト名にアンダースコアを利用してはいけないのでしょうか?
テストを一時的に無効にする
テストに DISABLED_ プレフィックスをつけることにより、テストを一時的に無効化することができます。これはテストケースにも有効です。テストケース名はすなわちテストフィクチャ(クラス)名ですので昨今の IDE であれば rename 機能で属するテストを一括で無効化できます。
テスト実行後に DISABLED なテスト(実行しなかったテスト)がレポートされるので、#if 0 で無効化するよりも安全です。
参考: テストを一時的に無効にする
メッセージ出力
ユーザ定義の失敗メッセージを出力するには、 <<演算子 を用いてメッセージをストリームに出力します。
メッセージ出力の例:
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length"; for (int i = 0; i < x.size(); ++i) { EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i; }
明示的な成功と失敗
FAIL() は致命的な失敗を生成します。ADD_FAILURE() および ADD_FAILURE_AT() は致命的ではない失敗を生成します。プログラムの制御フローによって成功/失敗を判断するときに使用します。
制御フローによって判断する例:
switch(expression) { case 1: ... some checks ... case 2: ... some other checks ... default: FAIL() << "We shouldn't get here.";
SUCCEED() は成功を生成します。テスト全体を成功させるわけではなく、テスト実行時にそこに含まれるすべてのアサーションが失敗しなかった場合にのみ、そのテスト全体が成功したとみなします。
参考: 明示的な成功と失敗
Private メンバのテスト
private なクラスメンバはそのクラスや friend クラスからのみアクセス可能です。クラスの private メンバにアクセスするにはテストフィクスチャをそのクラスの friend に宣言して、フィクスチャクラスにアクセサを定義します。
実装例:
#ifdef WITH_GTEST #include"gtest/gtest_prod.h" #endif template <class T, int N=10> class Stack { T data_[N]; int index_; #ifdef WITH_GTEST friend class StackTestF; #endif ...
class StackTestF : public ::testing::Test { protected: template <class T> autoget_index(T& s){ return s.index_; } ...
参考: Private クラスメンバ
テストの部分的な実行
デフォルトでは、Google Test はユーザが定義したすべてのテストを実行します。GTEST_FILTER 環境変数、または --gtest_filter フラグでフィルタ文字列を設定するとこれにマッチしたテストケース、テストを実行します。
フラグ(フィルタ文字列)の指定例:
参考: テストの部分的な実行ヘルプを表示するサポートされているフラグと使い方の一覧をみるにはテストプログラムに --help フラグをつけて実行します。
フラグ(フィルタ文字列) | 説明 |
---|---|
./foo_test | フラグの指定なし。すべてのテストを実行する |
./foo_test —gtest_filter=* | * は任意の文字列にマッチ。すべてのテストを実行する |
./foo_test —gtest_filter=FooTest.* | テストケース FooTest 内の全てのテストを実行する |
./foo_test —gtest_filter=*Null*:*Constructor* | 完全な名前に "NULL"、または "Constructor" を含むテストを全て実行する |
./foo_test —gtest_filter=-*DeathTest.* | Death テスト 以外 を実行する |
./foo_test —gtest_filter=FooTest.*-FooTest.Bar | テストケース FooTest 内の全てのテストを実行する。ただし、FooTest.Bar は除く |
monipet
動物病院の犬猫の見守りをサポート
病院を離れる夜間でも安心
ASSE/CORPA
センサー、IoT、ビッグデータを活用して新たな価値を創造
「できたらいいな」を「できる」に
OSGi対応 ECHONET Lite ミドルウェア
短納期HEMS開発をサポート!
GuruPlug
カードサイズ スマートサーバ
株式会社ジェイエスピー
横浜に拠点を置くソフトウェア開発・システム開発・
製品開発(monipet)、それに農業も手がけるIT企業
※コメント投稿者のブログIDはブログ作成者のみに通知されます