2012-04-20 92 views
10

我在幾個測試套件中訂購了一些Boost測試用例。一些測試用例有一個,多個檢查。如何判斷Boost.Test停止第一個失敗的測試用例?

但是,執行所有測試時,它們都會被執行 - 無論有多少次失敗或通過。我知道,我可以通過使用BOOST_REQUIRE而不是BOOST_CHECK來停止執行一個測試用例。但那不是我想要的。

如何告訴Boost在第一個測試用例失敗後停止整個執行?我更希望通過運行時解決方案(即運行時參數)來編譯解決方案(例如用全局固定裝置來實現)。

+1

BOOST_REQUIRE_THROW將拋出一個異常,因此應停止整個測試套件的執行。 – TemplateRex 2012-04-24 15:00:04

+0

謝謝@rhalbersma。我會嘗試的。你爲什麼不回答這個問題呢? – 2012-04-25 08:12:00

+1

Ehm,因爲在仔細閱讀Boost.Test手冊後,建議不準確。 BOOST_REQUIRE_THROW是一個單元測試,用於檢查是否拋出異常。它不會拋棄自己。 – TemplateRex 2012-04-25 08:17:23

回答

4

BOOST_REQUIRE將停止測試套件中的當前測試用例,但繼續進行其他測試用例。

當你要求一個「編譯解決方案」時,我並不真正看到你想要什麼,但是這是一個應該可以工作的技巧。我使用布爾值來檢查整個測試套件的穩定性。如果它不穩定,即BOOST_REQUIRE已被觸發,那麼我會停止整個事情。

希望它能幫助你。

//#include <...> 

//FIXTURES ZONE 
struct fixture 
{ 
    fixture():x(0.0),y(0.0){} 
    double x; 
    double y; 
}; 

//HELPERS ZONE 
static bool test_suite_stable = true; 

void in_strategy(bool & stable) 
{ 
    if(stable) 
     { 
      stable = false; 
     } 
    else 
     { 
      exit(); 
     } 
} 

void out_strategy(bool & stable) 
{ 
    if(!stable) 
     { 
      stable = true; 
     } 
} 

BOOST_AUTO_TEST_SUITE(my_test_suite) 

//TEST CASES ZONE 
BOOST_FIXTURE_TEST_CASE(my_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); 
    //... 
    //BOOST_REQUIRE() -> triggered 
    out_strategy(test_suite_stable); 
} 

BOOST_FIXTURE_TEST_CASE(another_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); //-> exit() since last triggered so stable = false 
    //... 
    //BOOST_REQUIRE() 
    out_strategy(test_suite_stable); 
} 

BOOST_TEST_SUITE_END() 

伯努瓦。

+0

感謝這個黑客:)但是在每個測試用例中調用in_/out_strategy有點偏向DRY原則。全球(或每個測試套件)是否有可能爲每個測試用例定義'before'和'after' fixtures?或者,你必須重新定義BOOST_AUTO_TEST_CASE或類似的。 – 2012-05-09 08:02:23

+0

@Torbjoern - 將進出策略調用放入燈具的ctor/dtor中。夾具是爲每個測試用例單獨創建和銷燬的。 Quanteek - 可能希望在你的答案中包括這一點? – 2014-11-03 21:39:47

1

爲什麼不只是使用assert?不僅你立即中止整個程序,你還可以在必要時看到堆棧。

相關問題