2016-02-09 7 views
6

द्वारा प्रत्येक जेनरेट किए गए परीक्षण के लिए दावा जोड़ने के लिए यहां मैं एक उदाहरण के द्वारा इस मुद्दे को समझाने जा रहा हूं। मूल प्रश्न समस्या को और अधिक संक्षेप में प्रस्तुत करता है। हालांकि इसे पढ़ने की जरूरत नहीं है।Intellitest

अद्यतन: एक उदाहरण

के रूप में प्रश्न मान लीजिए कि हम int [] के मिनट खोजने के लिए इस गाड़ी समारोह को लागू किया है: enter image description here

:

public int MyMin(int[] data) 
{ 
    int min = 1000; 

    for (int i = 1; i < data.Length; i++) 
    { 
     if (data[i] < min) 
     { 
      min = data[i]; 
     } 
    } 

    return min; 
} 

इस समारोह पर Intellitest चल रहा है हमें देता है

परीक्षण # 4 और # 6 के लिए नोट यह कार्य अपने बग्गी कार्यान्वयन के कारण सही ढंग से न्यूनतम मूल्य की गणना नहीं कर रहा है। हालांकि, ये परीक्षण गुजर रहे हैं जो वांछित नहीं है।

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

@ michał-komorowski का समाधान व्यवहार्य है, लेकिन प्रत्येक परीक्षण मामले के लिए मुझे PexAssume एस के संदर्भ में अपना इनपुट दोहराना होगा। परीक्षण इनपुट के लिए वांछित आउटपुट निर्दिष्ट करने के लिए एक और अधिक स्पष्ट/साफ तरीका है?

मूल प्रश्न

Intelitest एक पैरामिट्रीकृत परीक्षण है कि परिवर्तनीय और सामान्य/वैश्विक कथनों वहाँ जोड़ा जा सकता है उत्पन्न करता है। यह कोड कवरेज को अधिकतम करने वाले न्यूनतम इनपुट भी उत्पन्न करता है। Intellitest व्यक्तिगत यूनिट परीक्षण के रूप में इनपुट स्टोर करता है, प्रत्येक एक पैरामीटर परीक्षण को एक तैयार किए गए इनपुट के साथ बुलाता है।

मैं प्रत्येक इनपुट के प्रति दावा जोड़ने का एक तरीका ढूंढ रहा हूं।

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

प्रत्येक इकाई परीक्षण के लिए दावा जोड़ने का अनुशंसित तरीका क्या है?

उत्तर

2

आपको विधियों का परीक्षण करने के लिए दावे नहीं जोड़ना चाहिए ([TestMethod] विशेषता के साथ विधियां)। वे केवल पैरामीटर मान प्रदान करने के लिए उपयोग किया जाता है। दावा करने की जगह [PexMethod] विशेषता के साथ विधियां हैं।

पहली चमक में यह एक सीमा की तरह लग सकता है। हालांकि, अगर हम विचार करते हैं कि इंटेलिटेस्ट कैसे काम करता है तो यह नहीं है। प्रत्येक इनपुट के लिए दावा जोड़ने की कोई समझ नहीं है क्योंकि किसी भी समय इनपुट को हटाया जा सकता है, अपडेट किया जा सकता है या बनाया जा सकता है। उदाहरण के लिए जब:

  • परीक्षण की एक विधि बदल दी गई थी।
  • PexAssume कक्षा का उपयोग किया गया था।
  • PexMethod विशेषता का कॉन्फ़िगरेशन बदला गया था।

हालांकि, आप कुछ और कर सकते हैं यानी एक विधि के लिए एक से अधिक "पिक्स विधि" जोड़ने के लिए और PexAssume का उपयोग करें।उदाहरण के लिए मान लें कि हमारे पास BubbleSort विधि है और हम इनपुट सरणी की लंबाई के आधार पर अलग-अलग दावों को परिभाषित करना चाहते हैं।

[PexMethod] 
public void BubbleSort(int[] a) 
{ 
    PexAssume.IsTrue(a.Length == 5); 
    int[] result = Program.BubbleSort(a); 
    // Assertions specific for an array with 5 elements 
} 

[PexMethod] 
public void BubbleSort(int[] a) 
{ 
    PexAssume.IsTrue(a.Length == 10); 
    int[] result = Program.BubbleSort(a); 
    // Assertions specific for an array with 10 elements 
} 
+0

हाय माइकल। हालांकि यह सामान्य परिस्थितियों के लिए दावे जोड़ने के लिए सहायक हो सकता है (उदाहरण के लिए आपके उदाहरण में सरणी लंबाई), लेकिन यह 'PexAssume' द्वारा प्रत्येक परीक्षण इनपुट निर्दिष्ट करने के लिए बोझिल और दोहराव है। कृपया अद्यतन प्रश्न पर एक नज़र डालें जहां मैं एक उदाहरण प्रस्तुत करता हूं। – Isaac

0

यह उत्तर पिछले उत्तर पर बनाता है। यह पूछे जाने वाले प्रश्न के लिए यह अधिक विशिष्ट है।

Pex सभी कोड पथों के लिए एक परीक्षण उत्पन्न करता है, लेकिन आपके कोड के बारे में कुछ भी नहीं जानता है। Pex को यह बताने के लिए कि आपको लगता है कि आपका कोड कैसे काम करना चाहिए, आपको अभी भी PUT (पैरामीटरयुक्त इकाई परीक्षण) में व्यवस्था/कार्य करना होगा। इसके अतिरिक्त, आप व्यवस्था से पहले मान ले सकते हैं ताकि पैटर्न मान लिया जा सके/व्यवस्थित/कार्य/जोर दे।

आपके उदाहरण के लिए, मैं इस पुट से शुरू करता हूं।

[PexMethod(MaxRunsWithoutNewTests = 200)] 
    [PexAllowedException(typeof(NullReferenceException))] 
    public int MyMin([PexAssumeUnderTest]Class1 target, int[] data) 
    { 
     //assume 
     PexAssume.IsTrue(data.Length == 1); 
     //arrange 
     data[0] = 0; 

     //act 
     int result = target.MyMin(data); 

     //assert 
     PexAssert.AreEqual(0, result); 
     return result; 
    } 

परिणाम बताते हैं कि केवल 3/8 ब्लॉक कवर किया गया और कहा कि परीक्षण 2 अपेक्षित के साथ विफल '0', '1000'

मिला यह मुझसे कहता है मैं यह पता लगाने की कोड को देखने के लिए की जरूरत है मुझे 1000 क्यों मिला।

मुझे लगता है कि मैं लूप के लिए 1 के बजाय 1 के साथ शुरू कर रहा हूं। इसलिए मैं कोड को ठीक करता हूं और फिर इंटेलिटेस्ट चलाता हूं।

इस बार मुझे दो गुजरने वाले परीक्षण मिलते हैं जो अच्छा है। लेकिन केवल 6/8 ब्लॉक का परीक्षण किया गया है। मुझे कुछ याद आ रहा है

मैं एक नया पुट बनाता हूं जो Pex को ऐसा डेटा उत्पन्न करने की अनुमति देता है जो इस तरह दिखता है।

[PexMethod(MaxRunsWithoutNewTests = 200)] 
    [PexAllowedException(typeof(NullReferenceException))] 
    public int MyMin2([PexAssumeUnderTest]Class1 target, int[] data) 
    { 
     //assume 

     //act 
     int result = target.MyMin(data); 

     //assert 
     return result; 
    } 

अब मेरे पास 7 यूनिट परीक्षण है जो सभी कोड पथों का प्रयोग करता है और सभी परीक्षण पास होते हैं।

आप देखेंगे कि प्रत्येक PUT परीक्षणों का अपना सेट तैयार करता है।