C ++ इकाई परीक्षण चौखटे की तुलना [बंद]


299

मुझे पता है कि C ++ यूनिट टेस्ट फ्रेमवर्क के लिए सिफारिशों के बारे में पहले से ही कुछ प्रश्न हैं, लेकिन सभी उत्तरों से मदद नहीं मिली क्योंकि वे केवल एक फ्रेमवर्क की अनुशंसा करते हैं लेकिन एक (फ़ीचर) तुलना के बारे में कोई जानकारी नहीं देते हैं।

मुझे लगता है कि सबसे दिलचस्प रूपरेखा CppUnit, Boost और नए Google परीक्षण ढांचे हैं। क्या किसी ने अभी तक कोई तुलना नहीं की है?



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

और यह एक विकास के दृष्टिकोण से शानदार है क्योंकि जब मैं अपना खुद का परीक्षण जोड़ता हूं तो मैं इसे बिना किसी और के सभी को चलाने के लिए चला सकता हूं। इसलिए मुझे पता है कि मेरा कोड काम कर रहा है।
कैशबैक

जवाबों:


99

कुछ चर्चा के लिए यह प्रश्न देखें

वे लेखों की सिफारिश करते हैं: सी ++ यूनिट टेस्टिंग फ्रेमवर्क जंगल , नोएल लोपिस द्वारा अन्वेषण। और हाल ही में: सी ++ टेस्ट यूनिट फ्रेमवर्क

मुझे एक लेख नहीं मिला है जो अभी तक अन्य रूपरेखाओं के लिए गोगलेट की तुलना करता है।


जैसा कि मैंने लिखा है: सभी उत्तर सिर्फ एक ढांचे को फिर से परिभाषित करते हैं लेकिन दूसरे से ढांचे की तुलना नहीं करते हैं।
गृहिणी

आप लेख से खुश नहीं हैं?
गिशु

7
एक आलोचना: लेख, जबकि अच्छा है, 2004 से है और इसमें Google टेस्ट शामिल नहीं है।
रिचट

2
पहले लिंक में आप दो तुलना देखेंगे। Google से नए ढांचे को छोड़कर, अधिकांश जानकारी अभी भी प्रासंगिक है (हैं?)। (और CppUnit सबसे दिलचस्प नहीं है, यह उपयोग करने के लिए बहुत ही भद्दा है)
ल्यूक हर्मिट्टे

1
लिंक को ठीक किया और एक और हालिया तुलना के साथ उत्तर का विस्तार किया
सैम सैफ्रन

120

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

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

मुख्य विशेषताएं:

  • पोर्टेबल
  • घातक और गैर-घातक दावे
  • आसान मुखर सूचनात्मक संदेश :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google टेस्ट स्वचालित रूप से आपके परीक्षणों का पता लगाता है और उन्हें चलाने के लिए आपको उन्हें एन्यूमरेट करने की आवश्यकता नहीं होती है
  • अपनी मुखर शब्दावली का विस्तार करना आसान बनाएं
  • मृत्यु परीक्षण (उन्नत गाइड देखें)
  • SCOPED_TRACE सबरूटीन लूप्स के लिए
  • आप तय कर सकते हैं कि कौन से परीक्षण चलाने हैं
  • एक्सएमएल टेस्ट रिपोर्ट जनरेशन
  • फिक्स्चर / मॉक / टेम्प्लेट ...

3
मैं वास्तव में कुछ अन्य चौखटों पर Google परीक्षण का उपयोग करने का आनंद लेता हूं, विशेष रूप से इसकी मॉकिंग क्षमताओं के साथ जो कि googlemock ढांचे में पाया जा सकता है।
माइक

8
मैं इन सभी सुविधाओं को प्रदान करता हूं (हालांकि कुछ अभी तक सार्वजनिक नहीं हैं) और मेरे नए परीक्षण ढांचे में और अधिक। लिंक के लिए मेरा जवाब देखें।
philsquared

2
Google C ++ मॉकिंग फ्रेमवर्क के साथ इसे मिलाकर इकाई परीक्षण C ++ कोड के लिए वास्तव में शक्तिशाली xUnit परीक्षण ढांचा बनाता है।
चूहाकोन

5
@CashCow बिल्ड के साथ रनिंग टेस्ट डिटेक्शन से कुछ अलग है। बिल्ड के साथ रनिंग आपके बिल्ड सिस्टम पर निर्भर करता है। परीक्षण का पता लगाने का मतलब है कि आपको किसी अन्य कक्षा में सभी परीक्षणों को सूचीबद्ध करने की ज़रूरत नहीं है , बस परीक्षण के तरीकों को बनाएं और यही है।
14

मैं हालांकि मैक्रोज़ के उनके अति प्रयोग को नापसंद करता हूं, और यह तथ्य कि TEST जैसे सामान्य शब्दों का उपयोग किया जाता है, जो किसी चीज़ से टकरा सकता है। GTEST बेहतर होगा, टकराव की संभावना कम होगी।
कैशबैक

112

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

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

इसमें ऑब्जेक्टिव-सी बाइंडिंग भी है। इस परियोजना की मेजबानी जीथब पर की गई है


कृपया जोड़ने CHECK_FLASEऔर REQUIRE_FLASEमैक्रोज़ पर विचार करें ।
एमिल कॉर्मियर

6
मेरी राय में सर्वश्रेष्ठ ढांचा।
कॉफ़ीडेवेलपर

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

@einpoklum कैच को नहीं छोड़ा गया - निर्माता लाइब्रेरी के संस्करण 2 पर काम कर रहा है। doctest कुछ बोनस डिजाइन निर्णयों के साथ कैच 1 के पुन: क्रियान्वयन की तरह है
onqtam

2
सभी परीक्षण ढांचे की तुलना करते समय मैं वास्तव में नुकसान में हूं (जिनमें से एक को अब मुझे चुनना है)। क्या आप कैच और अन्य प्रसादों के साथ अपने खुद के जवाब की तुलना और विपरीत करते हैं?
ईनपोकलूम

53

बूस्ट टेस्ट लाइब्रेरी एक बहुत अच्छा विकल्प है खासकर यदि आप पहले से ही बूस्ट का उपयोग कर रहे हैं।

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

यह समर्थन करता है:

  • स्वत: या मैनुअल परीक्षण पंजीकरण
  • कई दावे
  • संग्रह की स्वचालित तुलना
  • विभिन्न आउटपुट प्रारूप ( XML सहित )
  • फिक्स्चर / टेम्प्लेट ...

PS: मैंने इसके बारे में एक लेख लिखा है जो आपको आरंभ करने में मदद कर सकता है: C ++ यूनिट टेस्टिंग फ्रेमवर्क: एक बूस्ट टेस्ट ट्यूटोरियल


मैं बूस्ट टेस्ट का उपयोग करता था और इसे पसंद करता था सिवाय इसके कि रिलीज के बीच यह काफी बदल गया था। मेरे समय (और उनके पैसे) का अधिक खर्च किए बिना मेरे क्लाइंट के लिए यूनिट टेस्टिंग को बेचना काफी कठिन था, एपीआई बदलते समय परीक्षण को ठीक करने के बजाय, कोड को ठीक करने के लिए इसका परीक्षण करना था। अंत में मैंने इसे खाई और अपना लिखा - यह लगभग 5 साल पहले था।
घटक 10

5
ट्यूटोरियल लिंक टूट गया है
mloskot

2
@mloskot यह फिर से काम करता है।
क्रिस जस्टर-यंग

@mloskot इसके लिए क्षमा करें, यदि आप इसे तोड़ते हैं तो कृपया मुझे सीधे एक ई-मेल भेजें। टिप्पणी से खोजना आसान है। :)
वर्नट

@Wernight Yup, फिर से काम करता है। Thx
mloskot


16

मैंने हाल ही में xUnit ++ जारी किया है , विशेष रूप से Google टेस्ट और बूस्ट टेस्ट लाइब्रेरी ( तुलना देखें ) के विकल्प के रूप में। यदि आप xUnit.Net से परिचित हैं, तो आप xUnit ++ के लिए तैयार हैं।

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

मुख्य विशेषताएं:

  • अविश्वसनीय रूप से तेज़: परीक्षण समवर्ती रूप से चलते हैं ।
  • पोर्टेबल
  • स्वचालित परीक्षण पंजीकरण
  • कई जोर प्रकार (बूस्ट xUnit ++ पर कुछ भी नहीं है)
  • मूल संग्रह की तुलना करता है।
  • तीन स्तरों में मुखरता आती है :
    • घातक त्रुटियां
    • गैर-घातक त्रुटियां
    • चेतावनी
  • आसान मुखर लॉगिंग:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • टेस्ट लॉगिंग:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • फिक्स्चर
  • डेटा-चालित परीक्षण (सिद्धांत)
  • चयन करें कि किन परीक्षणों के आधार पर चलना है:
    • मेल मिलाप करना
    • नाम प्रतिस्थापन स्ट्रिंग
    • परीक्षण सूट

2
सवाल तुलना के लिए पूछ रहा है। IMO, यह प्रस्तुत करना महत्वपूर्ण है कि आपके ढांचे के बीच क्या अंतर हैं और, कम से कम, दो लोकप्रिय: googletest और Boost। खासकर, यदि आप उन दो के विकल्प के रूप में xUnit ++ का विज्ञापन करते हैं। अद्यतन होने पर +1 होगा :)
mloskot

काफी उचित। :) मुझे पहले से ही विकी पर एक तुलना तालिका मिली है , लेकिन मैं अपने उत्तर में सीधे कुछ अंतरों को समेटने की कोशिश करूंगा।
मस्जिद

1
मैंने सीधे विकी टेबल को सीधे लिंक करने का फैसला किया, यह सब बाहर सूचीबद्ध करने के लिए सारांश को बंद कर रहा था।
मस्जिद

लिंक मेरे लिए काम करता है, धन्यवाद! +1
mloskot

1
क्या आपका प्रोजेक्ट बंद कर दिया गया है? अंतिम प्रतिबद्ध दिनांक 09/2015 तक ... वैसे भी, शानदार जवाब। धन्यवाद।
zertyz

5

कैप्पेस्ट - मॉक लाइब्रेरी के साथ बहुत अच्छा, हल्का वजन फ्रेमवर्क। नजदीक से देखने पर ध्यान से देखना।


4

CPUnit ( http://cpunit.sourceforge.net ) एक ऐसा ढाँचा है, जो Google टेस्ट के समान है, लेकिन जो कम मैकोस (asserts फ़ंक्शन) पर निर्भर करता है, और जहां मैक्रो सामान्य मैक्रो बाधा से बचने के लिए उपसर्ग किए जाते हैं। टेस्ट जैसे दिखते हैं:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

वे ऑटो-रजिस्टर करते हैं, इसलिए आपको इससे अधिक की आवश्यकता नहीं है। तब यह बस संकलन और चलाने के लिए है। मैं इस ढांचे का उपयोग करना बहुत पसंद करता हूं जैसे कि JUnit का उपयोग करना, उन लोगों के लिए जिन्हें कुछ समय जावा प्रोग्रामिंग करना पड़ा है। बहुत अच्छा!



2

एपीआई सनिटी परीक्षक - C / C ++ पुस्तकालयों के लिए परीक्षण रूपरेखा:

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

उत्पन्न परीक्षणों की गुणवत्ता सरल उपयोग के मामलों में महत्वपूर्ण त्रुटियों की अनुपस्थिति की जांच करने की अनुमति देती है। उपकरण जनरेट किए गए परीक्षणों को बनाने और निष्पादित करने में सक्षम है और क्रैश (segfaults), एबॉर्ट्स, सभी प्रकार के उत्सर्जित संकेतों, गैर-शून्य प्रोग्राम रिटर्न कोड और प्रोग्राम हैंगिंग का पता लगाने में सक्षम है।

CppUnit, Boost और Google टेस्ट की तुलना में अनूठी विशेषताएं:

  • परीक्षण डेटा और इनपुट तर्कों की स्वचालित पीढ़ी (यहां तक ​​कि जटिल डेटा प्रकारों के लिए)
  • जुड़नार और टेम्पलेट्स के बजाय आधुनिक और अत्यधिक पुन: प्रयोज्य विशेष प्रकार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.