2012-04-20 13 views
10

मुझे कई परीक्षण सूट में आदेश देने वाले कई बूस्ट परीक्षण मामले हैं। कुछ परीक्षण मामलों में से एक है, कुछ से अधिक चेक।बूस्ट को कैसे बताने के लिए सबसे पहले परीक्षण मामले को रोकने के लिए?

हालांकि, सभी परीक्षणों को निष्पादित करते समय, वे सभी निष्पादित होते हैं - चाहे कितने असफल हों या पास हों। मुझे पता है, कि BOOST_CHECK के बजाय BOOST_REQUIRE का उपयोग करके मैं कई परीक्षणों के साथ एक परीक्षण मामले के निष्पादन को रोक सकता हूं। लेकिन यह नहीं चाहता कि मैं चाहता हूं।

पहला परीक्षण केस विफल होने के बाद मैं पूरे निष्पादन को रोकने के लिए बूस्ट को कैसे बता सकता हूं? मैं एक रनटाइम समाधान (यानी रनटाइम पैरामीटर) पर एक संकलित समाधान (उदाहरण के लिए वैश्विक स्थिरता के साथ महसूस किया) पसंद करेंगे।

+1

BOOST_REQUIRE_THROW एक अपवाद फेंक देगा ताकि पूरे टेस्ट सूट का निष्पादन रोका जा सके। – TemplateRex

+0

धन्यवाद @rhalbersma। मैं कोशिश करूँगा। आप इसका जवाब क्यों नहीं देते? –

+1

एहम, क्योंकि Boost.Test मैन्युअल के अधिक सावधानीपूर्वक पढ़ने के बाद, सुझाव गलत था। BOOST_REQUIRE_THROW एक यूनिट परीक्षण है यह जांचने के लिए कि कोई अपवाद फेंक दिया गया है या नहीं। यह खुद को फेंक नहीं देता है। – TemplateRex

उत्तर

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 सिद्धांत की ओर थोड़ा सा है। क्या वैश्विक स्तर पर (या प्रति टेस्ट सूट) को 'पहले' परिभाषित करने की संभावना नहीं है और 'प्रत्येक टेस्ट केस के लिए' फिक्स्चर चलाने के बाद? वैकल्पिक रूप से किसी को BOOST_AUTO_TEST_CASE या समान रूप से फिर से परिभाषित करना होगा। –

+0

@ टोरबोजोर्न - स्थिरता के सीटीओआर/डीटीआर में इन/आउट रणनीति कॉल डालें। स्थिरता * प्रत्येक * परीक्षण मामले के लिए अलग से बनाई गई है और नष्ट कर दी गई है। Quanteek - शायद आपके जवाब में शामिल करना चाहते हो सकता है? –

1

क्यों न केवल ज़ोर का उपयोग करें? न केवल आप पूरे कार्यक्रम को रोकते हैं, यदि आवश्यक हो तो आप भी ढेर को देख पाएंगे।