<< ブレーキワイヤーが切れた : main : 「高島貨物線踏破号」乗車の旅 >>

[MEMO] Google Testing Framework

もう半年も前の話だが,Google C++ Testing Frameworkというのが公開されていたようだ.これはCppUnitと同様に単体テストを行うものだが,CppUnitに比べて以下のような利点がある.

1. テスト関数を別途列挙する必要がない
2. 例外を使わない
2-a. std::string等に依存しない.
まず1について

C++にはリフレクション機構が存在しないので,実行時に関数名一覧を取得することができない.代わりにstatic変数の初期化がmain()の前に動作することを利用する.

CppUnitではテストをTestFixtureのメンバ関数として作成するので,TestFixtureの宣言部において関数の一覧を以下のように記述する必要がある.
CPPUNIT_TEST_SUITE(TestFixtureクラス名);
CPPUNIT_TEST(テスト関数名);
CPPUNIT_TEST_SUITE_END();

さらに,TestFixtureはCPPUNIT_TEST_SUITE_REGISTRATIONを用いてインスタンス化する必要がある.

以上の2つを忘れるとテストコードを書いたつもりでもテストが実行されない.「やったー,テストOKだー」と思っても実はそのコードが実行されてないと後でしょんぼり.

参考: CppUnit 導入ガイド

Google C++ Test Frameworkではこの問題を以下のようにして解決している.

各テストはTESTマクロ(Fixtureを使わない場合),またはTEST_F(Fixtureを使用する場合)を用いて宣言するが,このマクロは次のような構造になっている.

[include/gtest/gtest.h]
#define TEST(test_case_name, test_name)\
GTEST_TEST_(test_case_name, test_name,\
::testing::Test, ::testing::internal::GetTestTypeId())

#define TEST_F(test_fixture, test_name)\
GTEST_TEST_(test_fixture, test_name, test_fixture,\
::testing::internal::GetTypeId())

そしてGTEST_TEST_はinclude/gtest/gtest-internal/gtest-internal.hで定義されている.長いのでエッセンスだけ言葉で書くと,
1. テストごとに独立したクラスを定義する
2. そのクラスはTestFixtureまたはTestを継承する.
3. そのクラスはtest_info_という名のstaticメンバを持つ.
4. クラス定義の直後にtestInfoの初期化があり,その代入文においてMakeAndRegisterTestInfo()を呼び出して自分自身を登録するようになっている.

また,上の呼び出し時にGetTestTypeId<>()を呼んでいるが,これは型毎に異なる値を返す関数で,TypeIdHelper<型名>テンプレートクラスの中で宣言されたstaticメンバの先頭アドレスとして実装されている.

次に2について.

CppUnitではアサーションに引っかかると例外(Exception)をthrowし,テストコードの呼び出し元でそれをcatchしている.
(Asserter.cppのAsserter::fail及びDefaultProtector.cppのDefaultProtector::protectを参照)

Google C++ Test Frameworkでは大きく分けてASSERT_*とEXPECT_*の2種類の評価方法が用意されている.ホームページに書かれた説明によると「両者の違いは評価結果の扱いで,前者は評価にパスしない場合は処理が打ち切られるのに対し、後者は結果にかかわらず処理が継続される」はずなのだが,ソースを見る限りでは両者の違いはFATAL/NON-FATALというフラグ値の違いだけのように見える.(後で実行して試す必要有り)

UnitTest::AddTestPartResultにおいて,結果がSUCCESSではなくてGTEST_FLAG(break_on_failure)が設定されている場合に強制的にsegmentation faultを発生させるコードはあったが,これは上記区別とは無関係である.

これらの実装でAssertHelperというクラスが使われている.このクラスは評価のたびに一時オブジェクトとして生成され,operator=でtesting::Message()オブジェクトを受け取る.このoperator=は実際にはAssertHelper自体への代入ではなく,UnitTest::GetInstance()->AddTestPartResult()にデータを渡しているので代入の意味からは外れているが,後ろに<<を続けて標準入出力のスタイルでユーザメッセージを追加可能とするためにこうなっている.
コンピュータ > ソフトウェア : comments (253) : trackbacks (0)

Comments

replica louis vuitton glasses case にょろぷにらん | 駅の記憶
louis vuitton replica...2013/11/26 02:29 AM
cheap louis vuitton replica handbags from china にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/11/25 06:24 PM
fake hermes ebay にょろぷにらん | [MEMO] Google Testing Framework
selling fake hermes on ebay...2013/11/15 10:33 PM
replica hermes birkin 35cm にょろぷにらん | [MEMO] Google Testing Framework
mirror replica hermes bag...2013/11/14 11:21 PM
99 replica gucci handbags にょろぷにらん | [MEMO] Google Testing Framework
knock off gucci book bags...2013/11/14 03:43 PM
mbt habari shoes にょろぷにらん | [MEMO] Google Testing Framework
mbt shoes...2013/11/13 01:42 AM
fake gucci wholesale handbags にょろぷにらん | [MEMO] Google Testing Framework
fake gucci loafers for men...2013/11/11 09:14 AM
buy gucci purses wholesale にょろぷにらん | [MEMO] Google Testing Framework
replica gucci travel bags...2013/11/10 08:29 PM
replica gucci indy bag にょろぷにらん | [MEMO] Google Testing Framework
authentic gucci handbags...2013/11/10 04:13 PM
hermes replicas scarves にょろぷにらん | [MEMO] Google Testing Framework
hermes jewelry replicas...2013/11/10 12:27 PM
hermes replica bags paypal にょろぷにらん | [MEMO] Google Testing Framework
hermes leather belt replica...2013/11/10 04:09 AM
replica gucci victoire sandals にょろぷにらん | [MEMO] Google Testing Framework
gucci handbags replica luxury...2013/11/09 04:15 PM
replica hermes enamel bracelet にょろぷにらん | [MEMO] Google Testing Framework
fake hermes bangkok...2013/11/09 03:43 PM
buy gucci wallets for men にょろぷにらん | [MEMO] Google Testing Framework
replica gucci keychain...2013/11/09 11:35 AM
best imitation gucci bags にょろぷにらん | [MEMO] Google Testing Framework
replica gucci handbags canada...2013/11/09 12:32 AM
replica hermes enamel bracelet にょろぷにらん | [MEMO] Google Testing Framework
replica hermes birkin bags uk...2013/11/08 10:58 PM
fake orange hermes birkin にょろぷにらん | [MEMO] Google Testing Framework
replica hermes purses uk...2013/11/05 06:27 AM
replica gucci mens bag にょろぷにらん | [MEMO] Google Testing Framework
replica gucci gift bags...2013/11/05 02:19 AM
cheap replica gucci belts uk にょろぷにらん | [MEMO] Google Testing Framework
fake gucci phone case...2013/11/04 10:23 AM
fake gucci loafers for men にょろぷにらん | [MEMO] Google Testing Framework
fake gucci hats for men...2013/11/03 09:18 PM
cheap gucci purses online にょろぷにらん | [MEMO] Google Testing Framework
replica gucci bags 2011...2013/11/03 12:03 PM
replica gucci fabric にょろぷにらん | [MEMO] Google Testing Framework
wholesale gucci purses...2013/11/02 03:07 PM
hermes birkin bag allegro にょろぷにらん | [MEMO] Google Testing Framework
hermes replica singapore...2013/11/02 12:20 PM
hermes bracelet replica ebay にょろぷにらん | [MEMO] Google Testing Framework
hermes handbags outlet online...2013/11/02 05:25 AM
gucci 3900l replica にょろぷにらん | [MEMO] Google Testing Framework
fake gucci belts from china...2013/11/01 10:17 AM
louis vuitton replica tote bag にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/10/26 08:13 AM
replica handtaschen chanel にょろぷにらん | [MEMO] Google Testing Framework
replica gucci bags 2012...2013/10/26 01:22 AM
hermes h bag replica にょろぷにらん | [MEMO] Google Testing Framework
replica hermes italia...2013/10/25 01:53 PM
replica louis vuitton never full bags にょろぷにらん | [MEMO] Google Testing Framework
replica louis vuitton...2013/10/25 11:52 AM
good replica louis vuitton bags にょろぷにらん | [MEMO] Google Testing Framework
replica louis vuitton...2013/10/25 10:25 AM
simple shoes discount にょろぷにらん | [MEMO] Google Testing Framework
buy mbts shoes...2013/10/23 08:56 PM
aaa replica louis vuitton にょろぷにらん | [MEMO] Google Testing Framework
replica louis vuitton...2013/10/23 04:33 PM
www.replica-handbags-louis-vuitton.com にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica overnight bag...2013/10/23 11:58 AM
hermes birkin replica best にょろぷにらん | [MEMO] Google Testing Framework
hermes bag replica philippines...2013/10/23 07:56 AM
replica louis vuitton with oxidizing leather にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/10/22 08:06 PM
timberland shoes discount にょろぷにらん | [MEMO] Google Testing Framework
mbt elegant...2013/10/22 07:14 AM
hermes replica gift box にょろぷにらん | [MEMO] Google Testing Framework
hermes birkin mini replica...2013/10/22 06:31 AM
top quality replica hermes birkin にょろぷにらん | [MEMO] Google Testing Framework
replica hermes birkin bags uk...2013/10/22 12:28 AM
louis vuitton evidence glasses replica にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/10/21 10:29 AM
louis vuitton bongo backpack replica にょろぷにらん | [MEMO] Google Testing Framework
Louis Vuitton handbags monogram...2013/10/20 11:02 AM
louis vuitton replica aaa china にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/10/20 09:48 AM
louis vuitton replica wallet china にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton replica...2013/10/19 09:59 PM
louis vuitton replica bracelets にょろぷにらん | [MEMO] Google Testing Framework
louis vuitton outlet...2013/10/19 07:17 PM
perfect replica louis vuitton bags にょろぷにらん | [MEMO] Google Testing Framework
very cheap replica louis vuitton...2013/10/19 06:18 PM

Comment Form

  

Trackbacks

Trackback url
Latest Entries
Categories
Recent Comments
Recent Trackback
Archives
Profile
Other
RECOMMEND