C ++ कोड के लिए यूनिट परीक्षण - उपकरण और कार्यप्रणाली [बंद]


134

मैं एक बड़े c ++ सिस्टम पर काम कर रहा हूं जो कुछ वर्षों से विकास में है। मौजूदा कोड की गुणवत्ता को सुधारने के प्रयास के रूप में हम एक बड़ी दीर्घकालिक रिफैक्टिंग परियोजना पर लगे हुए हैं।

क्या आप एक अच्छा उपकरण जानते हैं जो मुझे C ++ में यूनिट टेस्ट लिखने में मदद कर सकता है? शायद जुनित या नुनित के साथ भी कुछ ऐसा ही हो?

क्या कोई मॉड्यूल के लिए यूनिट परीक्षण लिखने की कार्यप्रणाली पर कुछ अच्छी सलाह दे सकता है जिसे यूनिट परीक्षण के बिना लिखा गया था?


1
इस सवाल की जाँच करें: stackoverflow.com/questions/3150/…
Aardvark

जवाबों:


83

विरासत कोड के साथ इकाई परीक्षणों को लागू करना बहुत महत्वपूर्ण कारण था लिगेसी कोड के साथ कार्य करना प्रभावी रूप से लिखा गया था। माइकल फेयर्स लेखक हैं - जैसा कि अन्य उत्तरों में उल्लेख किया गया है, वह कैप्पुनिट और कैप्पनीटलाइट दोनों के निर्माण में शामिल थे ।

वैकल्पिक शब्द


4
एक थंबनेल जोड़ा गया - मतदान किया। किताब किसी भी टूल से ज्यादा मदद करती है।
गिशु

2
मुझे लगता है कि CPPUnit परीक्षण लिखने को सरल बना सकता है। हम CPPUnit का उपयोग करते हैं, लेकिन मैं संतुष्ट नहीं हूं। मुझे प्रत्येक परीक्षण के लिए दो फ़ाइलों को अपडेट करने की आवश्यकता है, और मेरी राय में, एक परीक्षण लिखने के लिए उतना ही सरल होना चाहिए: 'टेस्ट ("टेस्टनाम") {ASSERT (1 == 1);}' दूसरी ओर पुस्तक; सभी के लिए जरूरी है, न केवल उन लोगों के लिए जो विरासत कोड के साथ काम करते हैं, बल्कि उन लोगों के लिए भी हैं जो इसे बनाते हैं;)
daramarak

9
सी ++ विरासत कब है ?!
निल्स

9
आईटी यह नहीं है कि सी ++ विरासत है - अगर मैं सही ढंग से याद करता हूं, तो यह पुस्तक एक विरासत परियोजना को परिभाषित करती है, जिसके लिए कोई नहीं है, या बहुत कम इकाई परीक्षण हैं। इस तरह की परियोजनाएं यूनिट परीक्षणों को लिखने में / कठिन / कठिन होती हैं, क्योंकि परीक्षण संचालित विकास ने कभी भी कोड आधार को प्रभावित नहीं किया है कि उन्हें लिखना तुच्छ है।
अराफंगियन

7
@ निल्स: पुस्तक के अमेज़ॅन समीक्षकों में से एक के रूप में उल्लेख किया गया है, "विरासत कोड इकाई परीक्षणों के बिना कोड है," जो वास्तव में इस प्रश्न के बारे में है।
डेविड जॉनस्टोन

40

Google ने हाल ही में Google परीक्षण नामक इकाई परीक्षण C ++ एप्लिकेशन के लिए अपनी लाइब्रेरी जारी की।

Google कोड पर प्रोजेक्ट


1
क्या वीसी ++ के साथ इसका इस्तेमाल संभव है
यशराज

बहुत ठीक लगता है, विशेष रूप से जिस तरह से उन्हें प्रत्येक अभिकथन में विवरण जोड़ना पड़ता है। नीचे की तरफ, मैं व्यक्तिगत रूप से मैक्रोज़ के बजाय एक यूनिट टेस्ट क्लास रखना पसंद करता हूं जो वास्तव में कक्षाओं की तरह नहीं दिखता है।
वर्नट

3
एक और अच्छी बात यह है कि नकली संभावनाएं हैं: code.google.com/p/googlemock
फिलिप

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

30

कई उपलब्ध सुइट्स के बीच एक उत्कृष्ट तुलना की जाँच करें । उस लेख के लेखक ने बाद में UnitTest ++ को विकसित किया ।

मैं इसके बारे में विशेष रूप से पसंद करता हूं (इस तथ्य के अलावा कि यह अपवादों को अच्छी तरह से संभालता है) यह है कि परीक्षण मामलों और परीक्षण जुड़नार परिभाषा के आसपास 'प्रशासन' की बहुत सीमित मात्रा है।


2
Isnt 'कि हमारी मौलिक पतनशीलता? उन्हें उपलब्ध परियोजनाओं में अच्छी अंतर्दृष्टि मिली है - लेकिन उन्हें सुधारने के बजाय, वह अपनी शुरुआत करते हैं।
पीटरचेन

@peterchen: हाँ; लेकिन तब UnitTest ++ इतना छोटा और हल्का है कि एक अलग परियोजना होने में इसका मूल्य है - उठना और चलाना बहुत आसान है।
टिमस्टेली

24

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


4
मैं इस उत्कृष्ट टूलकिट की सिफारिश कर सकता हूं।
रोब

1
हाँ, बढ़ावा जाने का रास्ता है। कोई उपरि नहीं, बस परीक्षण और जाओ! मैं वास्तव में निराशा में अपने स्वयं के ढांचे पर काम कर रहा था जब बढ़ावा मेरे बचाव में आया। धन्यवाद सब कुछ के लिए बढ़ावा (सब कुछ के लिए!)
daramarak

आप एक लेख मैं परिचय बूस्ट यूनिट परीक्षण beroux.com/english/articles/boost_unit_testing
Wernight

21

नोएल लोपोपिस ऑफ़ गेम्स इनसाइड , सी ++ यूनिट टेस्टिंग फ्रेमवर्क जंगल की खोज के लेखक हैं, जो विभिन्न सी ++ यूनिट टेस्टिंग फ्रेमवर्क का एक व्यापक (लेकिन अब दिनांकित) मूल्यांकन है, साथ ही गेम प्रोग्रामिंग पर एक पुस्तक भी है।

उन्होंने काफी समय तक CppUnitLite का इस्तेमाल किया, विभिन्न चीजों को ठीक किया, लेकिन अंततः एक और यूनिट टेस्ट लाइब्रेरी लेखक के साथ सेना में शामिल हुए, और UnitTest ++ का उत्पादन किया । हम यहां UnitTest ++ का उपयोग करते हैं, और मुझे यह बहुत पसंद है, अब तक। इसमें (मेरे लिए) एक छोटे पदचिह्न के साथ शक्ति का सटीक सही संतुलन है।

मैंने होमग्रोन सॉल्यूशंस, CxxTest (जिसमें पर्ल की आवश्यकता होती है), और बढ़ावा :: टेस्ट का उपयोग किया है। जब मैंने अपने वर्तमान कार्य में यहां इकाई परीक्षण को लागू किया तो यह बहुत अधिक UnitTest ++ बनाम बढ़ावा :: परीक्षण के लिए नीचे आ गया।

मुझे वास्तव में सबसे अधिक बढ़ावा देने वाले पुस्तकालय पसंद हैं, जिनका मैंने उपयोग किया है, लेकिन IMHO, बढ़ावा :: परीक्षण थोड़ा बहुत भारी है। मुझे विशेष रूप से यह पसंद नहीं आया कि इसे बढ़ावा देने के लिए टेस्ट हार्नेस के मुख्य कार्यक्रम को लागू करने के लिए आपको (AFAIK) की आवश्यकता है :: टेस्ट मैक्रो। मुझे पता है कि यह "शुद्ध" टीडीडी नहीं है, लेकिन कभी-कभी हमें जीयूआई आवेदन के साथ परीक्षणों को चलाने के लिए एक तरीका चाहिए, उदाहरण के लिए जब कमांड लाइन पर एक विशेष परीक्षण ध्वज पारित किया जाता है, और बढ़ावा :: परीक्षण इस प्रकार का समर्थन नहीं कर सकता है परिदृश्य का।

यूनिटटेस्ट ++ मेरे द्वारा (सीमित) अनुभव में स्थापित और उपयोग करने के लिए सबसे सरल परीक्षण ढांचा था।


17

मैं उत्कृष्ट Boost.Test पुस्तकालय का उपयोग कर रहा हूं, जो कि बहुत कम ज्ञात लेकिन ओह- ए -कमाल टर्टल लाइब्रेरी के संयोजन में है : एक मॉक ऑब्जेक्ट लाइब्रेरी जो बढ़ावा पर आधारित है।

जैसा कि एक कोड उदाहरण शब्दों से बेहतर बोलता है, कल्पना कीजिए कि आप एक calculatorऑब्जेक्ट का परीक्षण करना चाहते हैं जो एक viewइंटरफ़ेस पर काम करता है (यह कछुए का परिचयात्मक उदाहरण है):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

देखें कि मॉक ऑब्जेक्ट पर अपेक्षा को घोषित करना कितना आसान और क्रियात्मक है? जाहिर है, अगर उम्मीदें पूरी नहीं होती हैं तो परीक्षण विफल हो जाता है।


14

मैं बस अपने ढांचे, CATCH , वहाँ से बाहर धकेल दिया है । यह अभी भी विकास के अधीन है, लेकिन मेरा मानना ​​है कि यह पहले से ही अधिकांश अन्य रूपरेखाओं को पार कर गया है। अलग-अलग लोगों के पास अलग-अलग मापदंड हैं लेकिन मैंने बहुत सारे ट्रेड-ऑफ के बिना अधिकांश जमीन को कवर करने की कोशिश की है। एक विस्मयकारी के लिए मेरे लिंक किए गए ब्लॉग प्रविष्टि पर एक नज़र डालें। मेरी शीर्ष पाँच विशेषताएं हैं:

  • हैडर ही
  • फ़ंक्शन और विधि आधारित परीक्षणों का ऑटो पंजीकरण
  • एलएचएस और आरएचएस में मानक सी ++ अभिव्यक्ति का विरोध करता है (इसलिए आपको एस्टर मैक्रोज़ के पूरे परिवार की आवश्यकता नहीं है)।
  • फ़ंक्शन आधारित स्थिरता के भीतर नेस्टेड वर्गों के लिए समर्थन
  • प्राकृतिक भाषा का उपयोग करते हुए नाम परीक्षण - फ़ंक्शन / विधि के नाम उत्पन्न होते हैं

इसमें ऑब्जेक्टिव-सी बाइंडिंग भी है।


4
सिद्धांत गति संकलन पर भारी फोकस के साथ कैच का मेरा पुन
कार्यान्वयन है

9

CxxTest एक हल्का, उपयोग करने में आसान और C ++ के लिए JUnit / CppUnit / xUnit-like फ्रेमवर्क को पार करने में आसान है।




6

मैं वर्तमान में एक यूनिट टेस्ट और मॉक फ्रेमवर्क की तलाश कर रहा हूं जिसका उपयोग हमारी कंपनी में लंबे समय तक रहने वाले कोड-बेस के लिए किया जा सकता है। जैसा कि आप जानते हैं कि c ++ के लिए यूनिट टेस्टिंग फ्रेमवर्क की सूची लंबी है, इसलिए मैंने इसे कम करने के लिए कुछ फिल्टरों को हाथ से पूरा करने के लिए लगाया, जिन्हें और अधिक बारीकी से देखा जा सकता है। पहला फ़िल्टर मानदंड यह था कि यह मुफ़्त में होना चाहिए। दूसरी कसौटी परियोजना गतिविधि थी। मैंने मॉकिंग फ्रेमवर्क की भी तलाश की क्योंकि यूनिट-टेस्ट लिखने के लिए आपको एक की आवश्यकता होती है।

मैं निम्नलिखित सूची (लगभग) गतिविधि के आधार पर आया था, शीर्ष पर उच्चतम गतिविधि:

  • GoogleTest / GoogleMock: कई योगदानकर्ता और Google द्वारा ही उपयोग किए जाते हैं। यह शायद कुछ समय के लिए यहां होगा और अपडेट प्राप्त करेगा। अपने निजी कोड-बेस के लिए मैं सबसे तेज ट्रेन पर कूदने की उम्मीद में इस संयोजन पर स्विच करूंगा।

  • बूस्टटेस्ट + कछुआ: अक्सर अद्यतन नहीं किया गया है, लेकिन परीक्षण ढांचे को बढ़ावा देने का एक हिस्सा है, इसलिए इसे बनाए रखा जाना चाहिए। दूसरी ओर कछुआ मुख्य रूप से एक आदमी द्वारा बनाए रखा जाता है, लेकिन इसमें नाराजगी की गतिविधि होती है, इसलिए यह मृत नहीं है। मैंने इस संयोजन के साथ अपने लगभग सभी परीक्षण अनुभव किए क्योंकि हम पहले से ही अपनी पिछली नौकरी में बूस्ट लाइब्रेरी का उपयोग करते थे और मैं वर्तमान में अपने निजी कोड के लिए इसका उपयोग करता हूं।

  • CppUTest: परीक्षण और मॉकिंग प्रदान करता है। यह परियोजना 2008 से 2015 तक सक्रिय रही है और इसमें हाल ही में काफी गतिविधियां हैं। यह खोज थोड़ा बेहतर थी क्योंकि वेब पर खोज करते समय काफी कम गतिविधि वाली बहुत सी परियोजनाएँ अधिक बार सामने आती हैं (जैसे CppUnit जिसका 2013 में अंतिम अद्यतन था)। मैंने इसमें गहराई से नहीं देखा है इसलिए मैं विवरण के बारे में कुछ नहीं कह सकता। संपादित करें (16.12.2015): मैंने हाल ही में इसे आज़माया और इस रूपरेखा को थोड़ा अनाड़ी और "सी-स्टाइलिश" पाया, विशेष रूप से मॉक कक्षाओं का उपयोग करते समय। इसके अलावा यह दावा किया गया था कि छोटे फ्रेमवर्क में अन्य ढांचे हैं। मुझे लगता है कि इसकी मुख्य ताकत यह है कि इसका उपयोग शुद्ध सी परियोजनाओं के साथ किया जा सकता है।

  • क्यूटेस्ट: टेस्ट लाइब्रेरी जो कि Qt फ्रेमवर्क के साथ जहाज करती है। कुछ समय के लिए Maintanance की गारंटी दी जानी चाहिए, लेकिन मैं इसका उपयोग सहायक पुस्तकालय के रूप में करता हूं, क्योंकि परीक्षण-पंजीकरण IMO अधिक अनाड़ी है तो अन्य रूपरेखाओं में। जहां तक ​​मैं इसे समझता हूं, यह आपको प्रति परीक्षण-परीक्षा में एक परीक्षा-परीक्षा के लिए बाध्य करता है। लेकिन क्यूटी-गुई कोड का परीक्षण करते समय परीक्षण सहायक फ़ंक्शन का अच्छा उपयोग हो सकता है। इसका कोई मॉक्स नहीं है।

  • कैच: इसकी हालिया गतिविधि है लेकिन मुख्य रूप से एक व्यक्ति द्वारा विकसित की गई है। इस ढांचे के बारे में अच्छी बात यह है कि वैकल्पिक स्थिरता दृष्टिकोण है जो आपको परीक्षण में पुन: प्रयोज्य स्थिरता कोड लिखने देता है। यह आपको टेस्ट नामों को स्ट्रिंग्स के रूप में सेट करने की सुविधा देता है जो कि अच्छा होता है जब आप पूरे नामों को टेस्ट नामों के रूप में लिखते हैं। मैं इस शैली को चीर कर googleTest में डाल दूंगा ;-)

नकली फ्रेमवर्क

मॉक फ्रेमवर्क की संख्या बहुत कम है, फिर टेस्ट फ्रेमवर्क की संख्या लेकिन यहां वे हैं जो मुझे हाल की गतिविधि में मिली हैं।

  • हिप्पोमॉक : 2008 यूनिट से अब सक्रिय लेकिन केवल कम तीव्रता के साथ।

  • FakeIt : 2013 यूनिट से सक्रिय अब एक आदमी द्वारा अधिक या कम विकसित।

निष्कर्ष

यदि आपका कोड-बेस लंबे समय के लिए है, तो BoostTest + Turtle और GoogleTest + GoogleMock के बीच चयन करें । मुझे लगता है कि उन दोनों का दीर्घकालिक रखरखाव होगा। यदि आपके पास केवल एक अल्पकालिक कोड-बेस है तो आप कैच को आज़मा सकते हैं जिसमें एक अच्छा वाक्यविन्यास है। तब आपको अतिरिक्त रूप से एक नकली रूपरेखा चुनने की आवश्यकता होगी। यदि आप Visual Studio के साथ काम करते हैं तो आप BoostTest और GoogleTest के लिए परीक्षण-रनर एडाप्टर्स डाउनलोड कर सकते हैं, जो आपको परीक्षण रनर GUI के साथ परीक्षण चलाने की अनुमति देगा जो VS में एकीकृत है।


3

बारीकी से संबंधित प्रश्न का उत्तर भी देखें "एक सी ++ इकाई परीक्षण उपकरण / रूपरेखा चुनना", यहां


3

वहाँ भी है TUT , खाका-यूनिट-टेस्ट, एक टेम्पलेट आधारित ढांचा। यह सिंटैक्स अजीब है (कुछ इसे टेम्प्लेट-एब्यूजिंग कहा जाता है), लेकिन इसका मुख्य लाभ यह है कि यह सब एक हेडर फ़ाइल में निहित है ।

आपको यहां TUT के साथ लिखा गया यूनिट-टेस्ट का एक उदाहरण मिलेगा ।


2
मैंने एक शीर्ष लेख केवल पुस्तकालय प्रदान किया है जिसमें मैक्रोज़ को TUT के सुनिश्चित फ़ंक्शन और टेस्ट डिक्लेरेशन कोड को शामिल किया गया है ताकि इसे सरल बनाया जा सके और विफलताओं में फ़ाइल और लाइन नंबर की जानकारी प्रदान की जा सके। यहाँ आउटपुट में अंतर और कोड के साथ-साथ github पर परियोजना के लिंक के उदाहरण के साथ एक पोस्ट का लिंक दिया गया है: codecrafter.wordpress.com/2012/12/19/tutadcape1
जोश

2

मैंने CPPunit की कोशिश की है और यह बहुत उपयोगकर्ता के अनुकूल नहीं है।

एकमात्र विकल्प जो मुझे पता है कि आप C ++ नेट का उपयोग कर रहे हैं। अपने C ++ क्लासेज और राइटिंग यूनिट टेस्ट को .NET यूनिट टेस्टिंग फ्रेमवर्क (NUnit, MBUnit आदि) में से एक के साथ लपेटें।


2

CppUTest C और C ++ यूनिट-टेस्टिंग के लिए एक उत्कृष्ट, हल्के वजन का ढांचा है।




1

CIFT ( http://www.cfix-testing.org ) पर एक नज़र डालें , यह विंडोज C / C ++ विकास के लिए विशेष है और उपयोगकर्ता मोड और कर्नेल मोड यूनिट परीक्षण दोनों का समर्थन करता है।


साझा करने के लिए धन्यवाद। मैंने हाल ही में परीक्षण के प्रयोजनों के लिए उपसर्ग का उपयोग करना शुरू किया। मैं उत्तीर्ण और असफल परीक्षण के मामलों में कॉल स्टैक को देखने का एक तरीका ढूंढ रहा था। क्या इसे प्राप्त करने के लिए उपसर्ग में कोई रास्ता है?
tryingToLearn

1

यदि आप Visual Studio 2008 SP1 पर हैं, तो मैं यूनिट परीक्षण लिखने के लिए MSTest का उपयोग करने की अत्यधिक अनुशंसा करूंगा। मैं तब मॉक लिखने के लिए Google मॉक का उपयोग करता हूं। आईडीई के साथ एकीकरण आदर्श है और अनुमति देता है और एक परीक्षण के अलावा के लिए तीन स्थानों को संपादित करने के मामले में CPPunit का ओवरहेड नहीं ले जाता है।


1

मुझे लगता है कि विज़ुअलासर्त्सर वीएस एकीकरण में बहुत अच्छा काम कर रहा है । यह आपको वीएस से परीक्षणों को चलाने और डिबग करने देता है और आपको परीक्षणों को चलाने के लिए एक निष्पादन योग्य बनाने की आवश्यकता नहीं है।


0

फ्रुक्टोज देखें: http://sourceforge.net/projects/fructose/

यह एक बहुत ही सरल ढांचा है, जिसमें केवल हेडर फाइलें होती हैं और इस प्रकार यह आसान पोर्टेबल होती है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.