2010-03-06 13 views
8

स्यूडोकोड में उदाहरण वर्ग:अंतहीन संभावनाओं का परीक्षण या वर्णन कैसे करें?

class SumCalculator 
    method calculate(int1, int2) returns int 

इस परीक्षण करने के लिए एक अच्छा तरीका क्या है? दूसरे शब्दों में मुझे जिस व्यवहार की आवश्यकता है उसका वर्णन कैसे करना चाहिए?

test1: canDetermineSumOfTwoIntegers 

या

test2: returnsSumOfTwoIntegers 

या

test3: knowsFivePlusThreeIsEight 

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

ऐसी कक्षाओं का परीक्षण करने का एक अच्छा तरीका क्या है?

उत्तर

10

मैं सीमा की स्थिति (अधिकतम-पूर्णांक, न्यूनतम-पूर्णांक, शून्य, सकारात्मक, नकारात्मक) और कुछ विशिष्ट मामलों का परीक्षण होगा:

test1: sumOfPosAndPos 
test2: sumOfPosAndNeg 
test3: sumOfPosAndZero 
test4: sumOfNegAndZero 
test5: sumOfMaxIntAndMinInt 

आदि

+1

शायद sumOfMaxIntAndMaxInt जोड़ें और विफलता की रिपोर्ट करने के लिए फ़ंक्शन की जांच करें। यह सबसे सीमा वाला मामला है जिसके बारे में मैं सोच सकता हूं। – pmr

+0

sumOfMaxIntAndOne को अपवाद भी होना चाहिए, है ना? यह एक और अच्छा बढ़त मामला होगा। अन्यथा मैं सहमत हूं। बस कुछ संभावनाओं के बारे में सोचें जो थोड़ा अलग हैं और इसके साथ जाते हैं। –

+1

नकारात्मक परीक्षण मामलों के बारे में मत भूलना test6: sumOfStringAndPositive (अपवाद या वापसी त्रुटि को उठाना चाहिए) –

5

कई दर्शन कर रहे हैं। The Art of Unit Testing के लेखक रॉय ओशरोव, prefer using explicit values पर दिखाई देते हैं, और प्रत्येक Equivalence Class के निम्नतम (या सबसे सरल) प्रतिनिधित्व का चयन करते हैं।

वह सिद्धांत आपके उदाहरण के लिए विशेष रूप से अच्छी तरह से लागू नहीं होता है, लेकिन कई अन्य परिदृश्यों में वास्तव में अच्छा काम करता है।

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

व्यक्तिगत रूप से, मैं एक सिद्धांत पसंद करता हूं जिसे मैं Constrained Non-Determinism पर कॉल करता हूं। यहां बिंदु यह है कि हम किसी प्रकार का कारखाना हमें दिए गए प्रकार के लिए अज्ञात चर की सेवा करते हैं, क्योंकि यह हमें सीधे परीक्षण में संबंध स्थापित करने के लिए मजबूर करता है।

मैं AutoFixture उपयोग कर रहा हूँ यह करने के लिए (लेकिन आप भी कुछ और ही इस्तेमाल कर सकते हैं), इसलिए इस मामले में मैं इस तरह SumCalculator का परीक्षण होगा:

var fixture = new Fixture(); 
var int1 = fixture.CreateAnonymous<int>(); 
var int2 = fixture.CreateAnonymous<int>(); 
var expectedResult = int1 + int2; 
var sut = fixture.CreateAnonymous<SumCalculator>(); 

var result = sut.Calculate(int1, int2); 

Assert.AreEqual(expectedResult, result); 

सिद्धांत रूप में, यह एक परीक्षण एक प्रदान करता है गणना विधि के लिए विनिर्देश। हम कभी नहीं जानते कि int1 और int2 के मूल्य क्या हैं, और यह उन सभी मामलों में बहुत उपयुक्त है जहां वास्तव में कोई फर्क नहीं पड़ता।

3

यदि आप गणितीय फ़ंक्शन का परीक्षण कर रहे हैं, तो मैं सुझाव दूंगा कि आपको इसे अपने व्यस्त कार्य के विरुद्ध परीक्षण करना चाहिए, उदाहरण के लिए: x = a + b करने वाले फ़ंक्शन के लिए, आपको यह जांचना चाहिए कि ax = -b और xb = a , यह सिर्फ चित्रण के लिए है, क्योंकि यह हर मामले पर काम नहीं करेगा।

1

परीक्षणों में डुप्लिकेशन को हटाने के लिए यहां एक और विकल्प Parameterized Test Case का उपयोग करना होगा।मूल रूप से एक तालिका में परीक्षण के लिए सभी डेटा होते हैं, एक टुपल फॉर्म ([टर्म 1, टर्म 2, योग]) में, फिर टेस्टकेस टेबल पर एक पंक्ति का परीक्षण करने के लिए पैरामीटरयुक्त टेस्टकेस को आमंत्रित करने के लिए तालिका पर पुनरावृत्ति करता है:

I नकारात्मक (ओवरफ्लो) परीक्षण भी जोड़ देगा: calculate(MAXINT, 1) क्या वापस आना चाहिए?

1

थ्योरी टेस्ट पर डेविड सैफ का काम देखें; here (PDF) एक उदाहरण है। यह मूल रूप से एक दावा करने का एक तरीका है कि कुछ (जैसे फ़ंक्शन इसके विपरीत के विपरीत है) कुछ सेट (सभी संभावित मानों के सेट सहित) के सभी मानों के लिए सत्य है - और उस परीक्षण को परीक्षण के रूप में व्यक्त करना। आप यादृच्छिक रूप से चुने गए मानों के साथ अपना परीक्षण चलाकर कुछ मजेदार सामान कर सकते हैं (यदि सेट पूरी तरह से चलाने के लिए बहुत बड़ा है), और स्वचालित रूप से असफलताओं को विशिष्ट कंक्रीट रिग्रेशन परीक्षण के रूप में रिकॉर्ड कर रहा है।

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