11

I'm familiar with how the standard C++ assertion works. This has worked well in my project for a variety of testing purposes.

For example, suppose that I want to check that a certain exception is thrown by my code.

Is this possible to do without using a testing framework like CPPUnit?

4

4 に答える 4

11

CPPUnit が手動で行うのと同じことを行うことができます。

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

もちろん、このパターンを頻繁に使用する場合は、マクロを使用するのが理にかなっています。

于 2015-03-01T18:56:17.733 に答える
2

スケルトン (未テスト)

#define MY_ASSERT(f, e) {\
    try {\
        f();\
    } catch (std::exception &e) {\
        ...\
    }\
}
于 2013-03-27T20:12:32.807 に答える
1

これは、@JPlatte と @gongzhitaao の回答に基づいて作成した例外テスターです。私のテスト フレームワークには 2 つのグローバル変数がnum_testありnum_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__https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html参照)。マクロ内のポンド記号は、引数を文字列としてマクロ展開に配置するようにプリプロセッサに指示します ( http://bruceblinn.com/linuxinfo/Stringification.htmlを参照)。__LINE__

于 2017-05-22T23:18:10.677 に答える
-4

コード内アサーションは通常、この特定の関数に入る前に、特定の前提条件が満たされていることを確認するために、メソッドの先頭で使用されます。たとえば、次のようになります。

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

これらは主に、メソッドまたはクラス間の満たされていない依存関係のバグをキャッチするためにここに存在します。

テストフレームワークのアサーションは異なり、通常はユニットテストに使用され、ユニットが必要なものを返すことを確認します。

例外は通常、現実 (つまり、外部システム) によってコードが処理できない/処理できないケースが提供された場合にスローする必要があります。これは、まれではあるが予想される問題を解決する簡単な方法です。たとえば、サーバーが通常利用可能になるのを待っているタイムアウト。または、メモリが不足しています。プログラミングロジックの補助としては使用しません。

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

HTH

于 2013-03-27T20:11:30.443 に答える