परिमेय परीक्षण - आप इनका उपयोग कब और क्यों करते हैं?


15

हाल ही में काम पर हम परिमाणित परीक्षण के संबंध में कुछ मतभेद हैं । आम तौर पर हम एक टीडीडी-शैली का उपयोग करते हैं (या कम से कम कोशिश करते हैं) तो मैं उस दृष्टिकोण के लाभों को समझता हूं। हालाँकि, मैं लाभ प्राप्त करने के लिए संघर्ष कर रहा हूँ कि पैरामीटराइज्ड परीक्षण लाएँ। संदर्भ के लिए, हम एक सेवा पर काम करते हैं और यह लाइब्रेरी है जो एक RESTful इंटरफ़ेस के माध्यम से उजागर होती है।

मैंने अब तक जो भी परीक्षण देखे हैं, वे हैं, कम से कम ग्रहण के भीतर JUnit का उपयोग करना:

  • विस्तार में कमी - जब कोई परीक्षा विफल हो जाती है तो मापदंडों को देखना बहुत कठिन होता है जिसके कारण यह विफल हो जाता है
  • अक्सर बनाने के लिए जटिल
  • कोड लिखे जाने के बाद बनाया जाने वाला कमेंट - कड़ाई से इस तरह की कोई खामी नहीं लेकिन क्या लोग कोड के एक टुकड़े को शुरू करने के समय पैरामीटर के परीक्षण को ध्यान में रखते हैं?

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


1
समस्या विचार के साथ नहीं बल्कि क्लंकी लाइब्रेरी के साथ है। C # में सिंटैक्स मित्रवत है, जब आप MbUnit का उपयोग करते हैं। हाँ, यह एक अच्छा विचार है। इस प्रक्रिया को आसान बनाने के लिए अपना खुद का कोड जोड़ें - फाइलों से सामान पढ़ें - जो भी काम करता है। यह भी देखें कि MsTest इसे कैसे संभालता है।
जॉब

हमने (स्क्वायर) ने इनमें से कुछ मुद्दों को संबोधित करने के लिए बर्स्ट को लिखा Parameterized। यह आमतौर पर कम बॉयलरप्लेट जोड़ता है, और यह बहुत स्पष्ट करता है जहां एक परीक्षण विफल हो गया।
डैनियल लुबरोव

जवाबों:


4

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

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

पृथक दोषों की पहचान शायद नहीं की जाएगी, लेकिन ये आमतौर पर गलती क्षेत्रों की तुलना में कम हैं।

डीओई दृष्टिकोण आपको भिन्नता के लिए पैरामीटर मानों को चुनने का एक व्यवस्थित तरीका देता है।


प्रदान किया गया लिंक टूट गया है।
जॉश गस्ट

1
@JoshGust Google का उपयोग करके आसानी से तय किया गया। सर उठाने के लिए धन्यवाद।
पीटर के।

4

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


2

पैरामीटर किए गए परीक्षणों के कम से कम दो स्वाद हैं, कम से कम JUnit 4.8 में। वे हैं: परिमाणित परीक्षण ( @RunWith(Parameterized.class)) जिसके लिए एक डेटा स्रोत की आवश्यकता होती है, जो पूर्वनिर्धारित पैरामीटर कॉन्फ़िगरेशन उत्पन्न / पढ़ता है, और सिद्धांत ( @RunWith(Theories.class)) जो, प्रति तर्क प्रकार के संभावित आदानों के एक या अधिक सेट दिए गए तरीकों के विनिर्देश का उपयोग कर सकते हैं। यह कम-से-कम इस तरह दिखता है:

  • @DataPointsस्ट्रिंग तर्कों के लिए कुछ संभावित मान ( ) निर्दिष्ट करें (जैसे null, खाली स्ट्रिंग, गैर-रिक्त स्ट्रिंग, वास्तव में लंबी स्ट्रिंग)
  • @DataPointsपशु वर्ग तर्कों (जैसे null, Dogउदाहरण, Catउदाहरण, Birdउदाहरण) के लिए कुछ संभावित मान निर्दिष्ट करें ( )
  • तैयार करें @Theoryजो एक Stringपैरामीटर और एक Animalपैरामीटर स्वीकार करता है । यह संभव पैरामीटर मान के हर संभव संयोजन के साथ निष्पादित हो जाएगी (दिए गए उदाहरण में है कि 4x4 = 16 सहित संयोजन, होगा ( null, null))
  • यदि परीक्षण के तहत विधि कुछ संयोजनों को स्वीकार नहीं कर सकती है, Assume.assumeThatतो अमान्य संयोजनों को फ़िल्टर करने के लिए स्थैतिक आयात का उपयोग करें (जैसे जब आप गैर-रिक्त स्ट्रिंग्स के लिए विधि के व्यवहार की जांच करना चाहते हैं, तो पहली पंक्तियों में से एक "मान लिया जाएगा कि यह अशक्त नहीं है"

जैसा कि पहले लिखा गया है - यह हर विधि के हर संभव संयोजन का परीक्षण करने के लिए समझ में नहीं आता है (यह परीक्षण सेट विस्फोट करता है, 5 मापदंडों के साथ एक विधि का परीक्षण करने की कल्पना करें, प्रत्येक में सिर्फ 5 संभव मान हैं: 5 ** 5 -> 3000 से अधिक परीक्षण रन !), लेकिन मिशन-महत्वपूर्ण तरीकों (जैसे एपीआई तरीके) के लिए मैं इसे प्रोत्साहित करूंगा, बस सुरक्षित पक्ष पर ...


1

सामान्य उदाहरण:

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

  • विभिन्न तर्कों पर एक ही परिदृश्य लागू करें। हम एक परिदृश्य के साथ काम करता है Animalवस्तु और जैसे उपवर्गों की एक बहुत कुछ है Dog, Cat, Bird। उपलब्ध जानवरों की एक सूची बनाएं और उन पर परिदृश्य का परीक्षण करें।

Webservice के लिए कंक्रीट:

  • ऊपर दिए गए स्ट्रिंग तर्क से उदाहरण। एक ही प्रकार के लेकिन विभिन्न मूल्यों के विभिन्न तर्कों के साथ क्या होता है, इसका परीक्षण करें।

0

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

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


1
कम कोड लिखने की सुविधा के रूप में मापदंडों का उपयोग क्यों नहीं किया जाना चाहिए ? परीक्षण मामलों के एक बड़े (ish) सेट की संपूर्ण सूची प्रदान करने में कोई बड़ा गुण नहीं है।
जोनाथन यूनिस

1
आपका उत्तर अन्य 5 उत्तरों की तुलना में कोई और जानकारी कैसे प्रदान करता है?
एडम ज़ुकरमान

-2

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

लेकिन मैंने पैरामीटराइज्ड परीक्षण की कुछ भयावहता देखी है। नहीं, वर्जीनिया, आपके टेस्ट सूट को अपनी इकाई परीक्षणों की आवश्यकता नहीं होनी चाहिए।


1
आदर्श रूप से परिमाणित परीक्षण अपेक्षित आउटपुट में वास्तविक आउटपुट मैच आइटम (n) में "आइटम (n) करता है" या इसी तरह का होना चाहिए, और उस मामले में परीक्षण की आवश्यकता नहीं है। लेकिन कुछ और अधिक जटिल के लिए, मैं सामान्य रूप से "मेरा (परीक्षण) कोड स्पष्ट रूप से सही है" की तुलना में अपने स्वयं के परीक्षण मामलों के साथ एक स्वच्छ पैरामीकृत परीक्षण या दो देखना पसंद करेंगे। अगर यह सच होता तो आप टेस्ट केस नहीं लिखते। जाहिर है जटिलता के साथ ओवरबोर्ड जाना संभव है और मैं यह तर्क नहीं दे रहा हूं कि कोई रेखा नहीं है, लेकिन मुझे लगता है कि ऐसे मामले हैं जहां परीक्षण परीक्षण एक अच्छा विचार है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.