2012-08-24 44 views
1

我想測試一個字符串類的不同構造函數。因此,我寫我自己,檢查了幾個標準的東西的測試方法:boost.test的複雜檢查方法

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的文件信息!根據輸出我無法知道第一次或第二次通話是否造成這種情況。

這是什麼常見的問題?

乾杯!

回答

0

有沒有常見的修復。這些BOOST_CHECK _...宏存在意圖避免函數調用行號丟失(除非明確傳遞爲參數)。

通過遍歷測試用例中的參數集,可以解決這個問題。

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而不是您的自定義謂詞中報告失敗。

還有另一種yuckier替代方案,通過將您的自定義斷言設置爲巨大的巨型宏也可以實現相同的結果,但是我發現如此可怕,我甚至不會展示如何實現它的示例:)。