nlib
nn::nlib::testing 名前空間

C++のコードをテストするためのフレームワークです。testingライブラリの機能一覧 の説明も御覧ください。 [詳解]

クラス

class  Environment
 このクラスを継承してグローバルに実行されるSetUp()TearDown()を定義します。 [詳解]
 

関数

void InitNintendoTest (int *argc, char **argv)
 テストプログラムのコマンドラインオプションを処理します。
 
void InitNintendoTest (int *argc, wchar_t **argv)
 テストプログラムのコマンドラインオプションを処理します。
 
EnvironmentAddGlobalTestEnvironment (Environment *env)
 Environment へのポインタを渡して、全てのテストの前と後に実行されるコードを登録します。
 
AssertionResult FloatLE (const char *expr1, const char *expr2, float val1, float val2)
 val1 <= val2を検証します。[ASSERT|EXPECT]_PRED_FORMAT2に組み込んで利用します。 [詳解]
 
AssertionResult DoubleLE (const char *expr1, const char *expr2, double val1, double val2)
 val1 <= val2を検証します。[ASSERT|EXPECT]_PRED_FORMAT2に組み込んで利用します。 [詳解]
 

詳解

C++のコードをテストするためのフレームワークです。testingライブラリの機能一覧 の説明も御覧ください。

説明
PCに比べてより制限された環境でも動作するように設計・実装されたテストフレームワークです。
以下のような機能を備えています。
  • テスト関数の自動検出(CppUnitのようにaddTestメソッドを使って明示的に登録する必要がない)
  • operator<< を用いた簡便なユーザー定義の失敗メッセージの記述(ex. ASSERT_EQ(5, Foo(i)) << ” where i = ” << i;)のサポート
  • Jenkinsのようなシステムで利用できるようなJUnit形式のXMLレポート出力
  • 誤差を考慮した浮動小数点数比較
  • private関数のテスト
  • 値をパラメータ化したテスト
  • 型リストを用いた、テンプレートクラスに対する型付けテスト
  • 述語アサーション(関数とその引数を値とするテスト)
testingライブラリは、Google Testとマクロ名や関数名等である程度の互換性があり、Google Testを用いて書かれたテストコードをコンパイルできるように実装されています。
また、Google Testとは違い、std::ostreamがサポートされていない環境や、main関数の前にnewを呼ぶことができない環境でも利用することができます。
そのため、PC環境でGoogle Testを用いて作成したテストコードを幅広いターゲットマシンで動作させるための手間を低減させることが可能になっています。
testingライブラリには以下のマクロが実装されています。
これらはGoogle Testのマクロとある程度の互換性を持ちます。
ASSERT_*マクロが失敗すると、その関数からただちにリターンしますが、EXPECT_*マクロが失敗した場合、引き続きその関数内のテストを実行します。
マクロの解説については、testingライブラリの機能一覧 を参照してください。
基本的な使い方
テストコードにおいては、以下のようにGoogle Testを利用する場合に記述するヘッダファイルの代わりにtestingライブラリが提供するヘッダファイルをインクルードする必要があります。
// Include nn/nlib/testing/testing.h instead of gtest/gtest.h
#include "gtest/gtest.h" // remove this line in your test program
ここでマクロNLIB_USE_GTESTtesting.hのインクルード前に定義しておくと、Google TestのヘッダをインクルードしてGoogle Testを利用するようにすることができます。
基本的なテストコードは以下のようになります。
TEST(MyTest, simple) {
// テストコードを記述する。
// テストは自動的に登録されるのでテストを登録するコードは必要ない。
ASSERT_TRUE(真になることが期待されている条件式);
ASSERT_EQ(想定されている値, 実際の値) << "エラーになったときに表示するメッセージ" << ...;
ASSERT_STREQ("想定されている文字列", "実際の文字列");
.....
}
.....
int main(int argc, char **argv) {
return RUN_ALL_TESTS(); // 失敗すると0以外を返す
}
より高度なテストの書き方については、サンプルやリファレンスを読むか、Google Testのドキュメントを読むことをお勧めします。
Google Testとの相違点
現時点におけるGoogle Testとの主な相違点(制限)を以下に記述しておきます。
  • ASSERT_EQ(), EXPECT_EQ()について、NULLとの比較を行おうとすると警告又はコンパイルエラーになる。このためASSERT_TRUE(NULL== val); のようなコードを書く必要がある。
  • 表示にstd::ostreamを利用していないので、operator<< のオーバーロードやPrintTo()関数を実装する場合に、std::ostreamではなく、 NLIB_TESTING_OSTREAM() マクロを利用する必要がある。
  • operator<< で表示できるオブジェクトの種類が少ない。本物のstd::ostreamではないので、std::endlやマニピュレータ等は記述することができない。
  • スレッドセーフについては考慮されていない。
  • コマンドラインオプションは、以下のものだけが実装されている。
    • --gtest_output(GTEST_OUTPUT環境変数)
    • --gtest_color(GTEST_COLOR環境変数)
    • --gtest_break_on_failure(GTEST_BREAK_ON_FAILURE環境変数)
    • --gtest_also_run_disabled_tests(GTEST_ALSO_RUN_DISABLED_TESTS環境変数)
    • --gtest_repeat(GTEST_REPEAT環境変数)
    • --gtest_filter(GTEST_FILTER環境変数)
    • --gtest_shuffle(GTEST_SHUFFLE環境変数)
    • --gtest_random_seed(GTEST_RANDOM_SEED環境変数)
    • --gtest_print_time(GTEST_PRINT_TIME環境変数)
  • ASSERT_DEATH等、Deathテストは実装されていない。
  • イベントリスナーAPIはサポートされていない。