इकाई परीक्षण: लाइनक के साथ दावे को स्थगित कर दिया


18

क्या इस तरह से आस्थगित दावे जोड़ना ठीक है

var actualKittens = actualKittens.Select(kitten => {
    Assert.IsСute(kitten);
    return kitten
});

क्यों? इसलिए मैं उदाहरण के लिए भौतिकीकृत संग्रह की अपेक्षा करने वाले बयानों के साथ एक बार भी पुनरावृति कर सकता हूं:

CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

और यह भी केवल चयन नहीं किया जा सकता है, लेकिन इटेरेटर के साथ एक विधि परिभाषित की गई है और इसमें बहुत सारे चेक और तर्क हैं (जैसे कुछ गिनती और फ़िल्टरिंग)।

संदेह का बीज परीक्षण विफल होने की स्थिति में ऐसे कोड को पढ़ने और डिबग करने की जटिलता है।


1
मैं परीक्षण के लिए इस पर भरोसा नहीं करता, लेकिन कभी-कभी उत्पादन कोड में ऐसा करना ठीक होता है अगर कोई बेहतर समाधान नहीं है। आप अपने आप को sequence.WithSideEffect(item => Assert.IsCute(item))क्लीनर बनाने के लिए एक सहायक कार्य कर सकते हैं ।
usr

@usr लगता है कि आपने इस तरह से महत्वपूर्ण दोष पकड़ा - एक पुनरावृत्त से साइड इफेक्ट।
SerG

क्या आपको अभी भी दो बार पुनरावृति नहीं करनी है, एक बार सूची बनाने के लिए और फिर से इसकी तुलना करने के लिए expectedKittens? आपने मेथड कॉल के पीछे पुनरावृत्तियों को छिपाया है।
IllusiveBrian

@IllusiveBrian इस अर्थ में, उदाहरण के लिए, हाँ। यह अभी भी अतिरिक्त से कम है .All()
सर्ग

जवाबों:


37

क्या इस तरह से आस्थगित दावे जोड़ना ठीक है [..]

नहीं , यह नहीं है। क्यों? क्योंकि यदि आप किसी भी कारण से दूसरे दावे को हटाते हैं तो परीक्षण अभी भी हरा हो जाएगा और आपको लगता है कि यह अभी भी काम करेगा, लेकिन ऐसा नहीं है कि संग्रह की गणना नहीं होगी। यदि आपके पास दो या अधिक स्वतंत्र दावे हैं तो वे अपना काम करते रहेंगे भले ही आप उनमें से किसी एक को अक्षम कर दें।

इस संयोजन पर विचार करें:

Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

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

एक दूसरा भी नहीं है । मुझे यकीन नहीं है कि अन्य रूपरेखाएं इसे कैसे संभालती हैं लेकिन यदि आप एमएस टेस्ट प्लेटफॉर्म का उपयोग कर रहे हैं तो आपको नहीं पता होगा कि कौन सा परीक्षण विफल रहा। यदि आप असफल परीक्षण पर डबल क्लिक करते हैं, तो यह आपको CollectionAssertउतना ही विफल दिखाएगा लेकिन वास्तव में यह नेस्टेड था जो Assertगलत हो गया था और यह डीबग करना बहुत कठिन होगा। यहाँ एक उदाहरण है:

    [TestMethod]
    public void TestMethod()
    {
        var numbers = new[] { 1, 2, 3 }.Select(x =>
        {
            Assert.Fail("Wrong number.");
            return x;
        });

        // This will fail and you won't be sure why.
        CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList()); 

    }

इसका मतलब यह है कि पहला परीक्षण वास्तव में बेकार है क्योंकि यह बग खोजने में मदद नहीं करता है। आपको नहीं पता कि यह विफल हुआ क्योंकि कोई संख्या अमान्य थी या क्योंकि दोनों संग्रह अलग-अलग थे।


क्यों? इसलिए मैं भौतिकतावादी संग्रह की अपेक्षा करने वाले बयानों के साथ एक बार भी पुनरावृति कर सकता हूं

मुझे आश्चर्य है कि आप इसकी परवाह क्यों करते हैं? ये यूनिट टेस्ट हैं। आपको उनमें से हर बिट का अनुकूलन करने की आवश्यकता नहीं है और आमतौर पर परीक्षणों में लाखों वस्तुओं की आवश्यकता नहीं होती है, इसलिए प्रदर्शन को चिंता का विषय नहीं होना चाहिए।

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


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

1
इसके अतिरिक्त, आप या कोई अन्य व्यक्ति 6 ​​महीने के समय में आस्थगित दावे पर वापस आ जाएगा और समय निकालकर इसे बर्बाद कर देगा।
डेविडइनविन

आपके उदाहरण में कुछ गड़बड़ है। कॉल करने ToListसे एन्युमरबल को इटरेट किया जाएगा, है ना?
रबरडक

1
@RubberDuck हाँ, यह होगा और यह भी असफल होगा, Assert.Failलेकिन इस CollectionAssertसमय नहीं है और आप यह नहीं कह पाएंगे कि कौन सा मुखर वास्तव में गलत हुआ। मेरा मतलब है कि वीएस पर ध्यान केंद्रित नहीं होगा, Assert.Failलेकिन दूसरे पर ... अब आप डीबग कर सकते हैं।
t3chb0t
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.