2

UnitTest ++テストクラスがあります。これにより、クラスがいくつかの文字列を正しく解析していることをテストできます。テストを実行する前に、ループ内のさまざまな関数によってテストされるいくつかの文字列を含むフィクスチャを作成します。正常に動作しているように見えますが、問題は、エラーが発生した場合、UnitTest ++で常に同じエラー行が表示されるため、問題の原因となっている文字列が正確にわからないことです。

たとえば、次のように出力されます。

"[UnitTest++] ..\trunk\tests\Test_ChineseUtil.cpp(46): error: Failure in ParsePinyinT: ChineseUtil::parsePinyinT(pinyinT) == pinyinN" 

しかし、それはどの文字列が正しく解析されていないかを教えてくれません。

したがって、テストが失敗したときにカスタムエラーメッセージを設定する必要があります(その特定の場合は、配列の最初の項目を指定します)。基本的に、私は次のようなものが必要です:

CHECK(theTest, "my error message")

UnitTest ++にそのような関数はありますか?それとも、私がやろうとしていることを行うためのより良い方法がありますか?

詳細については、私のクラスのコードを次に示します。

#include <third_party/unittest++/UnitTest++.h>

#include <Application.h>
#include <ChineseUtil.h>

using namespace hanzi;

namespace chineseUtilTests {

class PinyinFixture {

public:

    PinyinFixture() {
        ChineseUtil::initialize();

        testData << "third tone" << QString::fromUtf8("wo3") << QString::fromUtf8("wǒ");
        testData << "no tone" << QString::fromUtf8("wo") << QString::fromUtf8("wo");
        testData << "second tone" << QString::fromUtf8("guo2") << QString::fromUtf8("guó");
        testData << "first tone" << QString::fromUtf8("jia1") << QString::fromUtf8("jiā");
        testData << "fifth tone" << QString::fromUtf8("jia5") << QString::fromUtf8("jia");
        testData << "two dots" << QString::fromUtf8("nu:") << QString::fromUtf8("nü");
        testData << "two dots and tone" << QString::fromUtf8("nu:3") << QString::fromUtf8("nǚ");
    }

    ~PinyinFixture() {

    }

    QStringList testData;

};

TEST_FIXTURE(PinyinFixture, ParsePinyinN) {
    for (int i = 0; i < testData.size(); i++) {
        QString pinyinN = testData[i][1];
        QString pinyinT = testData[i][2];
        CHECK(ChineseUtil::parsePinyinN(pinyinN) == pinyinT); 
    }
}

TEST_FIXTURE(PinyinFixture, ParsePinyinT) {
    for (int i = 0; i < testData.size(); i++) {
        QString pinyinN = testData[i][1];
        QString pinyinT = testData[i][2];
        CHECK(ChineseUtil::parsePinyinT(pinyinT) == pinyinN); 
    }
}

} // chineseUtilTests
4

2 に答える 2

1

クラスに等式演算子がある場合は、入力する代わりに、次のことができるはずです。

CHECK(something == something_else);

使用する

CHECK_EQUAL( something, something_else);

あなたのクラスが許可しているという事実は、あなた==がこれを行うことができることを私にさせます。テストが失敗した場合は、「何かを期待したが、何か他のものを手に入れました」という線に沿って何かを取得する必要があります。

さらに情報が必要な場合は、他にもいくつかできることがあります。

1つは、テストに独自のカスタム出力を追加することです。具体的にの値を知る必要がある場合は、それぞれの前にiのプリントアウトを追加できます。ただし、この出力は大きなループには長すぎる可能性があるため、もう一度チェックを追加できます。iCHECK

CHECK(ChineseUtil::parsePinyinN(pinyinN) == pinyinT);
if ( ChineseUtil::parsePinyinN(pinyinN) != pinyinT )
{
    cout << "Your own custom message " << i << endl;
}

もう1つの可能性は、UnitTest ++自体のソースコードを変更してから、ライブラリを再コンパイルすることです。あなたがやりたいことをするための正確な手順はわかりませんがUnitTest++/src/Checks.h、出力を改善してCHECK_ARRAY2D_CLOSE読みやすくするために変更しました。

于 2012-03-02T20:45:03.620 に答える
1

以下をコンパイルまたはテストしていませんが、その要点は、UnitTest ++ CHECKマクロをコピーして展開し、std :: stringであるメッセージパラメーターを取得し、それを文字列化されたバージョンの値を表す文字列と組み合わせることです。

#define CHECK_MESSAGE(value, message) \
    do \
    { \
        try { \
            if (!UnitTest::Check(value)) \
                UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), (std::string(#value)+message).c_str()); \
        } \
        catch (...) { \
            UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
                    (std::string("Unhandled exception in CHECK(" #value)+message+std::string(", ")+message+std::string(")")).c_str()); \
        } \
    } while (0)
于 2012-11-12T18:52:36.317 に答える