2012-04-20 11 views
13

मैं सी ++ में अपने टेम्पलेटेड विधियों, कक्षाओं और कार्यों का परीक्षण करने के लिए एक अच्छा तरीका ढूंढ रहा हूं। मुझे एहसास है कि केवल एक प्रकार के साथ प्रयोग करने के लिए पर्याप्त नहीं है, और यह यूनिट परीक्षणों को डुप्लिकेट करने और प्रकारों को प्रतिस्थापित करने का अधिकार नहीं है।यूनिट परीक्षण टेम्पलेट सी ++ विधियों/कक्षाओं/कार्यों के लिए एक अच्छा तरीका क्या है?

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

नोट, मैं सीखने के उद्देश्यों के लिए ऐसा कर रहा हूं, यही कारण है कि मैं मौजूदा मैट्रिक्स कार्यान्वयन का उपयोग नहीं कर रहा हूं।

+4

"यूनिट परीक्षणों को डुप्लिकेट करने और प्रकारों को प्रतिस्थापित करने का अधिकार नहीं है।" क्यूं कर? यदि आप परीक्षण करना चाहते हैं कि यह अन्य प्रकारों के साथ भी काम करता है, तो आप इसे अन्य प्रकारों के परीक्षण के बिना कर सकते हैं। – PlasmaHH

उत्तर

12

बूस्ट टेस्ट में एक मैक्रो BOOST_AUTO_TEST_CASE_TEMPLATE है जो प्रत्येक प्रकार के लिए boost :: mpl :: सूची में टेम्पलेट पर परीक्षण चलाता है।

template<typename T> 
T Add(T lh, T rh) 
{ 
    return lh + rh; 
} 

typedef boost::mpl::list<int, float> test_types; 

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types) 
{ 
    T result = Add(T(1), T(2)); 
    BOOST_CHECK_EQUAL(T(3), result); 
} 

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

0

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

0

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

आपकी कक्षा int के साथ काम कर सकती है, लेकिन फ्लोट के लिए विफल हो सकती है।

यदि टेम्पलेट का उपयोग कुछ प्रकारों के साथ नहीं किया जाना है, तो आपको अपने कोड में कुछ static_assert जोड़ना चाहिए।

3

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

हालांकि, ऐसा करने के लिए यह अधिक हो सकता है। मुझे लगता है कि यह आपके परीक्षणों में तर्क की मात्रा पर निर्भर करता है।

संबंधित मुद्दे