यदि आपके पास प्रति परीक्षण केवल एक जोर होना चाहिए; कैसे कई आदानों का परीक्षण करने के लिए?


15

मैं कुछ परीक्षण मामलों का निर्माण करने की कोशिश कर रहा हूं, और आपने पढ़ा है कि आपको प्रति परीक्षण मामले की संख्या को सीमित करने की कोशिश करनी चाहिए।

तो मेरा प्रश्न यह है कि फंक्शन w / मल्टिपल इनपुट्स की टेस्टिंग के लिए सबसे अच्छा तरीका क्या है। उदाहरण के लिए, मेरे पास एक फ़ंक्शन है जो उपयोगकर्ता से एक स्ट्रिंग प्राप्त करता है और मिनटों की संख्या लौटाता है। स्ट्रिंग के रूप में हो सकता है "5w6h2d1m", जहां w, h, d, mसप्ताह, घंटे, दिन और मिनट की संख्या के अनुरूप है।

अगर मैं '1 नियम प्रति परीक्षण नियम' का पालन करना चाहता था, तो मुझे इनपुट की प्रत्येक भिन्नता के लिए कई परीक्षण करने होंगे? यह मूर्खतापूर्ण लगता है इसलिए इसके बजाय मेरे पास कुछ ऐसा है:

self.assertEqual(parse_date('5m'), 5)
self.assertEqual(parse_date('5h'), 300)
self.assertEqual(parse_date('5d') ,7200)
self.assertEqual(parse_date('1d4h20m'), 1700)

एक परीक्षण मामले में। क्या कोई बेहतर तरीका है?


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

जवाबों:


23

प्रति परीक्षण "नियम" को देखने के लिए एक अधिक व्यावहारिक तरीका है, एक परीक्षण में एक एकल अवधारणा को कवर करने के लिए अपने जोर देना।

इस तरह आप अभी भी एक ही परीक्षण में एक अवधारणा का परीक्षण कर रहे हैं। आपके मामले में, चाहे आपके इनपुट स्ट्रिंग को एक ही तारीख में सही ढंग से पार्स किया गया हो।

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

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


17

यह आपके परीक्षण पुस्तकालय पर बहुत निर्भर करता है। C # लाइब्रेरी NUnit में आप कुछ ऐसा कर सकते हैं:

[TestCase('5m', 5)]
[TestCase('5h', 300)]
[TestCase('5d', 7200)]
[TestCase('1d4h20m', 1700)]
public void ParseDateTest(inputString, expectedMinutes)
{
    Assert.That(parse_date(inputString), Is.EqualTo(expectedMinutes));
}

टेस्टवा के साथ जावा में आपके पास @DataProvider विधियाँ हैं
केमोडा

यह सबसे अच्छा समाधान IMHO है। लगभग हर भाषा में आप अपने परीक्षणों को माप सकते हैं। java के लिए: @Parameterized , JunitParams , Zohhak
piotrek

3

हाँ, इनपुट की प्रत्येक भिन्नता के लिए कई परीक्षण करें।

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

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

लेकिन इतिहास से पता चला है कि कोड को पढ़ने / उपयोग करने की कीमत पर थोड़ा समय लिखने वाले कोड को सहेजना कभी भी इसके लायक नहीं है। इसलिए दिशानिर्देश।


1

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

जब JUnit के साथ परीक्षण किया जाता है, तो हम इसके आस-पास के तरीकों का उपयोग करके प्राप्त कर सकते हैं * एक प्रारंभिक परीक्षण के तर्क के साथ एक ही परीक्षण विधि के भीतर एक दूसरे से अलग करने के लिए तर्क।

self.assertEqual("just minutes", parse_date('5m'), 5)
self.assertEqual("just hours", parse_date('5h'), 300)
self.assertEqual("just days", ('5d') ,7200)
self.assertEqual("days, hours, minutes", parse_date('1d4h20m'), 1700)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.