2013-03-27 10 views
7

標準のC++アサーションの仕組みに精通しています。これは私のプロジェクトでさまざまなテスト目的のためにうまくいきました。例外がスローされたことを確認するC++アサーション関数

たとえば、コードによって特定の例外がスローされているかどうかを確認したいとします。

これは、CPPUnitのようなテストフレームワークを使用せずに可能ですか?

+0

投稿に基づいて:http://stackoverflow.com/questions/37473/how-can-i-assert-without-using-abort '' catch''を使うマクロを書くのはどうですか? – gongzhitaao

答えて

-2

におけるコードアサーションは、通常、特定の前提条件は、例えば、この特定の機能 のエントリの前に、満たされたことを確認するために、方法の最初に使用されている:

Window::paint() 
{ 
    assert(m_device != NULL); 
    m_device->repaintRegion(); 
} 

それらはここにあります主にバグのメソッドまたはクラス間のunmet依存関係をキャッチします。

テストフレームワーク内のアサーションは、通常はユニットテストに使用されます。

リアリティ(つまり外部システム)がコードで処理できない/処理してはいけないケースが通常は例外がスローされるはずです。稀ではあるがまだ予想される問題のための簡単な方法。たとえば、通常は利用可能なサーバーを待っているタイムアウトです。または十分なメモリがありません。私はプログラミングロジックの援助としてそれを使用しません。

あなたの質問には、try-catchでテストされたユニットを囲んでテストフレームワークで例外をキャッチする方法があるかもしれません。しかし、私は本当に望ましいかどうかは分かりません。

HTH

+1

これはどのように役立つのか分かりません。 –

2

スケルトン(TESTED NOT)

#define MY_ASSERT(f, e) {\ 
    try {\ 
     f();\ 
    } catch (std::exception &e) {\ 
     ...\ 
    }\ 
} 
6

手動で同じことCPPUnit does行うことができます:あなたはこのパターンをたくさん使用している場合は、もちろん

bool exceptionThrown = false; 

try 
{ 
    // your code 
} 
catch(ExceptionType&) // special exception type 
{ 
    exceptionThrown = true; 
} 
catch(...) // or any exception at all 
{ 
    exceptionThrown = true; 
} 

assert(exceptionThrown); // or whatever else you want to do 

を、それこのためにマクロを使用するのが理にかなっています。

0

@JPlatteと@ gongzhitaaoの回答に基づいて書いた例外テスターです。私のテストフレームワークでは、実行するテストの数と成功したテストの数を追跡する2つのグローバル変数num_testnum_test_successがありますが、これはニーズに合わせて変更できます。

int num_test; 
int num_test_success; 

#define UT_ASSERT_THROW(expression, ExceptionType) {   \ 
                   \ 
    try {              \ 
     expression;            \ 
     printf("test %d: *** FAILURE ***  %s:%d:%s,%s\n", \ 
       num_test, __FILE__, __LINE__,     \ 
       #expression, #ExceptionType);     \         
    } catch (const ExceptionType &) {       \ 
     printf("test %d: success\n", num_test);    \ 
     ++num_test_success;          \ 
    } catch (...) {            \ 
     printf("test %d: *** FAILURE ***  %s:%d:%s,%s\n", \ 
       num_test, __FILE__, __LINE__,     \ 
       #expression, #ExceptionType);     \ 
    }               \ 
                   \ 
    ++num_test;             \ 
                   \ 
} 

マクロ__FILE____LINE__現在のファイルと行番号(https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.htmlを参照)に展開されます。マクロの中のポンド記号は、プリプロセッサに引数を文字列としてマクロ展開に渡します(http://bruceblinn.com/linuxinfo/Stringification.html参照)。

関連する問題