2012-02-05 64 views
2

我有一個UnitTest ++測試類,它允許我測試一個類正確解析某些字符串。在運行測試之前,我創建了一個包含多個字符串的燈具,以通過循環中的各種函數進行測試。它似乎工作正常,但問題是,如果出現錯誤,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 

回答

1

如果你的類有一個平等的經營者,你應該來代替打字能,

CHECK(something == something_else); 

使用

CHECK_EQUAL(something, something_else); 

事實上,你的課程允許==讓我可以做到這一點。如果測試失敗,你應該按照「預期的東西,但有其他東西」的方式得到一些東西。

如果您需要更多信息,還可以做其他一些事情。

一個是在測試中添加自己的自定義輸出。如果您需要知道i的值,您可以在每個CHECK之前添加打印輸出i。但是,對於大型循環而言,此輸出可能太長,因此您可以再次添加檢查。

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

另一種可能性是修改UnitTest ++本身的源代碼,然後重新編譯該庫。儘管我不知道要執行的操作的確切步驟,但我修改了UnitTest++/src/Checks.h以提高CHECK_ARRAY2D_CLOSE的輸出,因此它更具可讀性。

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) 
相關問題