2009-06-08 9 views
10

का उपयोग शुरू करने में सहायता करना मैं इकाई परीक्षण शुरू करने की कोशिश कर रहा हूं। मैं कुछ सी ++ ढांचे को देख रहा हूं और बूस्ट.स्टेस्ट को आजमा देना चाहता हूं। दस्तावेज़ीकरण बहुत गहन लगता है, और यह थोड़ा जबरदस्त है, खासकर यूनिट परीक्षण के लिए कोई नया। तो यहां एक ऐसी स्थिति है जो मैं चाहता हूं:Boost.Test

मान लें कि मेरे पास 2 कक्षाएं, Foo और Bar हैं। मैं Foo के लिए परीक्षणों का एक सूट लिखना चाहता हूं और Bar के लिए परीक्षणों का एक सूट, अधिमानतः विभिन्न फाइलों में लिखना चाहता हूं। मैं केवल तभी परीक्षण करना चाहता हूं जब मैं कमांड लाइन पैरामीटर के साथ प्रोग्राम चलाता हूं। मुझे लगता है कि test_foo.cpp की तरह कुछ होना चाहिए

int main(int argc, const char* argv[]) 
{ 
    if (argc == 1 && strcmp(argv[0], "-test") == 0) 
     run_all_tests(); 
    else 
     return program_main(argc, argv); 
} 

:: तो मेरी main() कुछ ऐसा दिखाई देगा

#include "foo.hpp" 
#define BOOST_TEST_MODULE Foo test 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(Foo_Test) 

BOOST_AUTO_TEST_CASE(Foo1) 
{ 
    Foo f; 
    BOOST_CHECK(f.isValid()); 
} 

BOOST_AUTO_TEST_CASE(Foo2) 
{ 
    Foo f; 
    BOOST_CHECK(f.baz() == 5); 
} 

BOOST_AUTO_TEST_SUITE_END() 

हालांकि, मैं (1) क्या वास्तविक आदेश परीक्षण है चलाने के लिए पता नहीं है, और (2) वास्तव में लाइब्रेरी को कैसे बताना है कि मैं हर परीक्षण चलाने के लिए चाहता हूं।

तो, जो Boost.Test साथ अनुभव है? क्या कोई विस्तृत तरीके से मदद कर सकता है? बहुत बहुत धन्यवाद।

उत्तर

3

बूस्ट।टेस्ट बहुत लचीला है और आप शायद वही कर सकते हैं जो आप चाहते हैं। हालांकि जब आप कहते हैं कि आप यूनिट परीक्षण के लिए नए हैं, तो आपको शायद मानक इकाई परीक्षण संरचना का पालन करना चाहिए।

यह प्रत्येक परियोजना के लिए एक अलग परीक्षण परियोजना है जिसमें आप इकाई परीक्षण कर रहे हैं। फिर परीक्षण परियोजना बनाने के लिए आवश्यक स्रोतों और पुस्तकालयों को शामिल करें।

यह क्लीनर है क्योंकि आपके मुख्य प्रोजेक्ट में कोई परीक्षण तर्क नहीं है जो आकस्मिक रूप से चलाया जा सकता है और परीक्षणों को चलाने में आसान है क्योंकि उनके पास अपना निष्पादन योग्य है। यह दृष्टिकोण पुस्तकालयों के परीक्षण के लिए भी काम करता है। यदि आप इस संरचना का पालन करते हैं तो आप पाएंगे कि अधिकांश BOOST.Test डिफ़ॉल्ट बॉक्स के बाहर काम करते हैं और आप केवल परीक्षण और कोड लिखने के बारे में चिंता कर सकते हैं।

0

वहाँ NUnit में के रूप में

आप बस एक एकल .exe आवेदन के रूप में परीक्षण मामलों का निर्माण (यदि आप Windows पर हैं) और आप इसे

+0

मुझे समझ में नहीं आता है ... आप प्रोग्राम को सामान्य रूप से कैसे चलाते हैं (बिना परीक्षण के)? – rlbond

+0

मूल रूप से आपके test_foo.cpp को एक .exe प्रोग्राम के रूप में बनाया जाना चाहिए और अपनी लाइब्रेरी से लिंक होना चाहिए जिसमें Foo & Bar कक्षाएं हों। Boost.test शीर्षलेख फ़ाइलों में से एक पहले से ही मुख्य फ़ंक्शन को परिभाषित करता है, इसलिए मुझे नहीं लगता कि आपने जो प्रस्तावित किया है वह करने योग्य है। – oscarkuo

+1

असल में वहाँ है। इसे console_test_runner कहा जाता है। हालांकि यह ओपी समस्या से प्रासंगिक नहीं है क्योंकि उसके पास पहले से ही मुख्य है। –

12

चलाने के लिए अपनी test_foo.cpp में, मैक्रो जोड़ने कोई स्टैंडअलोन परीक्षण धावक है वैश्विक सूचियों में में परीक्षण सूट और परीक्षण के मामले: master_testsuite, जो सभी परीक्षण नोड्स की जड़ है। तुम बस, test_foo.cpp, test_boo.cpp और एक धावक की तरह सभी परीक्षण फ़ाइलें संकलन करने की जरूरत तो निष्पादन पर में उन सब को जोड़ देते हैं।

समारोह unit_test_mainmaster_testsuite में परीक्षण चलाने के लिए प्रयोग किया जाता है।

boost::unit_test::unit_test_main(
    &init_unit_test, 
    argc, 
    argv 
) 

मैक्रो के आधार पर आप <boost/test/unit_test.h>, Boost.Test पहले से ही आप के लिए main समारोह उत्पन्न हो सकता है शामिल करने से पहले परिभाषित किया। [1] उत्पन्न main बस argc और main में argv साथ unit_test_main लागू। यह उपयोग करने के लिए अनुशंसा की जाती है unit_test_main क्योंकि यह कुछ सांत्वना तर्क, run test by name तरह संसाधित कर सकें।

unit_test_main का पहला तर्क एक हुक है। BOOST_TEST_ALTERNATIVE_INIT_API पर निर्भर करता है, इसकी अलग-अलग परिभाषा है।

#ifdef BOOST_TEST_ALTERNATIVE_INIT_API 
typedef bool  (*init_unit_test_func)(); 
#else 
typedef test_suite* (*init_unit_test_func)(int, char* []); 
#endif 

आप हुक में master_testsuite को कस्टमाइज़ कर सकते हैं। दूसरे रूप में, लौटाया गया मूल्य नया मास्टर टेस्टाइट है।

[1] अगर BOOST_TEST_MAIN और BOOST_TEST_MAIN परिभाषित कर रहे हैं, लेकिन BOOST_TEST_NO_MAIN नहीं है।

5

आप मेन्यू कमांड से परीक्षण शुरू कर सकते हैं, लेकिन यह इतना आसान और दुखद रूप से अच्छी तरह से प्रलेखित नहीं है। और भी दुखी - मार्ग को पार करना संभव नहीं है जहां लॉगफाइल बनाया जाना है। मुझे खुद को ऐसा कमांडलाइन विकल्प जोड़ना पड़ा। दुर्भाग्य से मैंने अभी तक इसे सबमिट नहीं किया है। मेरे कोड इस तरह दिखता है:

#ifdef DEBUG 

#undef main 
#define BOOST_TEST_MAIN 
#include <boost/test/included/unit_test.hpp> 

int DoUnitTests() 

{ 
    char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"}; 

    bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args)/sizeof(char*), args); 

    MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" : "Goooood!"); 
    return result; 
} 

#else 
int DoUnitTests() 

{ 
} 
#endif 
+0

नहीं, आप 'char * []' 'const char * []' के साथ init नहीं कर सकते हैं। – Abyx

+0

आप किस बारे में बात कर रहे हैं? कृपया और स्पष्ट बताएं। –

+0

आपका कोड संकलित नहीं करेगा। http://coliru.stacked-crooked.com/a/760be4eb168ba404 – Abyx

0

इस स्क्रिप्ट मैंने लिखा प्रयास करें जो, एक प्रोग्राम नाम और कक्षाएं प्रत्येक वर्ग/मॉड्यूल के लिए makefile, परियोजना कंकाल और टेस्ट स्वीट कंकाल उत्पन्न होगा की सूची दी। यह इसे सब कुछ भी सेट करता है ताकि प्रत्येक वर्ग के लिए परीक्षण सूट व्यक्तिगत रूप से या एक-एक-एक वैश्विक सूट के हिस्से के रूप में चलाया जा सके।

यह makeSimple पर कॉल है और Sourceforge पर उपलब्ध है।