1

文字列クラスのさまざまなコンストラクターをテストしたいと考えています。したがって、いくつかの標準的なことをチェックするテストメソッドを自分で作成しました。

void checkStringStandards(String& s, size_t length, const char* text){
    BOOST_CHECK_EQUAL(s.length(), length);
    ...
}

次に、テストメソッドを追加しました

BOOST_AUTO_TEST_CASE(String_construct){
    String s1;
    checkStringStandards(s1, 0, "");

    String s2("normal char");
    checkStringStandards(s2, 11, "normal char");
}

問題は、失敗すると、 checkStringStandards 内から行とファイルの情報しか取得できないことです。最初の呼び出しと 2 番目の呼び出しのどちらがこれを引き起こしたのか、出力からはわかりません。

そのための一般的な修正は何ですか?

乾杯!

4

2 に答える 2

2

この問題の解決策は、チェックを実行BOOST_REQUIRE(custom_predicate(args))し、さまざまなテスト ケースで使用するカスタム述語を作成することです。カスタム述語は、必要な任意の引数をboost::test_tools::predicate_result受け取ることができ、失敗時に詳細な診断メッセージを作成できる Boost.Test のアサーション マクロと互換性のある型を返します。

あなたの例を使用するには:

using namespace boost::test_tools;
predicate_result checkStringStandards(String& s, size_t length, const char* text) {
    predicate_result result{true};
    if (s.length() != length) {
        result = false;
        result.message() << "\nString " << s
            << " differs in length; expected: "
            << length << ", actual: " << s.length();
    }
    ...
    return result;
}

BOOST_AUTO_TEST_CASE(String_construct){
    String s1;
    BOOST_REQUIRE(checkStringStandards(s1, 0, ""));

    String s2("normal char");
    BOOST_REQUIRE(checkStringStandards(s2, 11, "normal char"));
}

\nメッセージの冒頭で興味深いのは、診断が出力されるときに、「文字列 ... 長さが異なります」というテキストが独自の行に出力されることです。述語が失敗した場合、テストの失敗をトリガーし、カスタム述語内ではなくBOOST_REQUIRE呼び出し行で失敗を報告します。BOOST_REQUIRE

カスタムアサーションを巨大なメガマクロとして作成することで同じ結果を達成する別のより厄介な代替手段がありますが、それを行う方法の例を示すつもりはないので、とても恐ろしいことがわかりました:)。

于 2014-08-08T20:10:47.357 に答える
0

そのための一般的な修正はありません。これらの BOOST_CHECK_... マクロは、(param として明示的に渡されない限り) 行番号が失われる関数呼び出しを避けるために存在します。

テスト ケース内のパラメータ セットをループすることで、この問題を回避できます。

于 2012-12-07T19:11:05.850 に答える