उदाहरण के लिए मैन्युअल रूप से यूनिट टेस्ट प्रूफ लिख रहे हैं?


9

हम जानते हैं कि JUnit परीक्षण लिखना आपके कोड के माध्यम से एक विशेष पथ को प्रदर्शित करता है।

मेरे एक सहयोगी ने टिप्पणी की:

मैन्युअल रूप से लेखन इकाई परीक्षण सबूत द्वारा उदाहरण है

वह हास्केल की पृष्ठभूमि से आ रहा था जिसमें क्विकचेक जैसे उपकरण हैं और प्रकार के साथ कार्यक्रम व्यवहार के बारे में तर्क करने की क्षमता है ।

उनका निहितार्थ यह था कि इनपुट के कई अन्य संयोजन हैं जो इस पद्धति से अप्रयुक्त हैं जिसके लिए आपके कोड का परीक्षण नहीं किया गया है।

मेरा सवाल है: क्या मैन्युअल रूप से इकाई परीक्षण लिख रहे हैं उदाहरण के लिए सबूत?


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

जवाबों:


10

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

लेकिन अच्छी इकाई परीक्षण कभी ऐसा नहीं करते हैं। इसके बजाय, वे सीमा और किनारे के मामलों में निपटते हैं।

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

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


11
एक कोड परीक्षक एक बार में प्रवेश करता है और एक बीयर का आदेश देता है। 5 बियर। -1 बियर, MAX_VALUE बियर, एक चिकन। एक अशक्त।
नील

2
"5 मान" शुद्ध बकवास है। एक तुच्छ फ़ंक्शन पर विचार करें int foo(int x) { return 1234/(x - 100); }। यह भी ध्यान दें कि (आप जो परीक्षण कर रहे हैं उसके आधार पर) आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि अमान्य ("सीमा से बाहर") इनपुट सही परिणाम देता है (जैसे कि `` find_thing (बात) `सही ढंग से" नहीं मिला "स्थिति के कुछ प्रकार देता है अगर बात नहीं मिली)।
ब्रेंडन

3
@ ब्रेंडन: पाँच मूल्यों के होने के बारे में कुछ भी महत्वपूर्ण नहीं है; यह सिर्फ मेरे उदाहरण में पाँच मूल्यों के लिए होता है। आपके उदाहरण में अलग-अलग संख्या के परीक्षण हैं क्योंकि आप एक अलग फ़ंक्शन का परीक्षण कर रहे हैं। मैं यह नहीं कह रहा हूं कि प्रत्येक फ़ंक्शन को ठीक पांच परीक्षणों की आवश्यकता होती है; आपने मेरा उत्तर पढ़ने से इनकार कर दिया।
रॉबर्ट हार्वे

1
जेनरेशन टेस्टिंग लाइब्रेरी आमतौर पर एज केस की तुलना में बेहतर होती हैं। , उदाहरण के लिए, आप पूर्णांक के बजाय तैरता उपयोग कर रहे थे, अपने पुस्तकालय भी जाँच करेगा -Inf, Inf, NaN, 1e-100, -1e-100, -0, 2e200... मैं नहीं बल्कि उन सभी मैन्युअल रूप से करने की जरूरत नहीं होगी।
होवरकौच

@Hovercouch: यदि आप एक अच्छे के बारे में जानते हैं, तो मुझे इसके बारे में सुनना अच्छा लगेगा। मैंने जो सबसे अच्छा देखा है वह Pex था; हालांकि यह अविश्वसनीय रूप से अस्थिर था। याद रखें, हम यहां अपेक्षाकृत सरल कार्यों के बारे में बात कर रहे हैं। जब आप वास्तविक जीवन के व्यापार तर्क जैसी चीजों से निपटते हैं तो चीजें अधिक कठिन हो जाती हैं।
रॉबर्ट हार्वे

8

कोई भी सॉफ्टवेयर टेस्टिंग "प्रूफ़ बाय उदाहरण" की तरह है, न कि केवल यूनिट टेस्टिंग जैसे कि JUnit जैसे टूल का उपयोग करके। और यह कोई नई विद्या नहीं है, 1960 से दिज्क्स्त्र का एक उद्धरण है , जो अनिवार्य रूप से एक ही कहता है:

"परीक्षण उपस्थिति दिखाता है, बग की अनुपस्थिति नहीं"

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

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

इसलिए मैन्युअल रूप से बनाए गए परीक्षण किसी भी तरह से बेतरतीब ढंग से उत्पन्न परीक्षणों से बदतर नहीं होते हैं, अक्सर काफी विपरीत होते हैं।


1
रैंडम चेकिंग का उपयोग करने वाले किसी भी व्यावहारिक परीक्षण सूट में यूनिट टेस्ट भी होंगे। (तकनीकी रूप से, यूनिट परीक्षण यादृच्छिक परीक्षण का केवल एक पतित मामला है।) आपका शब्दांकन बताता है कि यादृच्छिक परीक्षण कठिन हैं, या यादृच्छिक परीक्षण और इकाई परीक्षणों का संयोजन कठिन है। यह आमतौर पर मामला नहीं है। मेरी राय में, यादृच्छिक परीक्षण का एक सबसे बड़ा लाभ यह है कि यह कोड के गुणों के रूप में लेखन परीक्षणों को दृढ़ता से प्रोत्साहित करता है जो हमेशा धारण करने के लिए अभिप्रेत होते हैं। मैं इन गुणों को कुछ बिंदु परीक्षणों का अनुमान लगाने की तुलना में इन गुणों को स्पष्ट रूप से कहा (और जांचा गया) करूँगा।
डेरेक एल्किंस ने SE

@DerekElkins: "मुश्किल" IMHO गलत शब्द है। रैंडम परीक्षणों के लिए कुछ प्रयासों की आवश्यकता होती है, और वह प्रयास है जो हस्त-परीक्षण परीक्षणों के लिए उपलब्ध समय को कम कर देता है (और यदि आपके पास केवल नारों का अनुसरण है जैसे प्रश्न में उल्लिखित है, तो वे संभवत: कोई भी हैंडीक्राफ्टिंग नहीं करेंगे)। बस कोड के एक टुकड़े पर बहुत सारे यादृच्छिक परीक्षण डेटा फेंकना केवल आधा काम है, उनमें से प्रत्येक परीक्षण इनपुट के लिए अपेक्षित परिणाम भी प्रस्तुत करना है। कुछ परिदृश्यों के लिए, यह स्वचालित रूप से किया जा सकता है। दूसरों के लिए, नहीं।
Doc Brown

हालांकि निश्चित रूप से ऐसे समय हैं जहां एक अच्छा वितरण चुनने के लिए कुछ विचार की आवश्यकता होती है, यह आमतौर पर एक बड़ा हैंग-अप नहीं है। आपकी टिप्पणी से पता चलता है कि आप इस बारे में गलत सोच रहे हैं। यादृच्छिक जाँच के लिए आपके द्वारा लिखे गए गुण वही गुण हैं जो आप मॉडल जाँच या औपचारिक प्रमाण के लिए लिखते हैं। वास्तव में, वे एक ही समय में उन सभी चीजों के लिए इस्तेमाल किए जा सकते हैं और इस्तेमाल किए जा सकते हैं। कोई "अपेक्षित परिणाम" नहीं हैं जो आपको भी उत्पादन करने की आवश्यकता है। इसके बजाय, आप बस एक संपत्ति बताते हैं जिसे हमेशा पकड़ना चाहिए। कुछ उदाहरण: 1) एक स्टैक पर कुछ धक्का दे रहा है और ...
डेरेक एल्किंस ने SE

... तो पॉपिंग कुछ नहीं करने के समान होना चाहिए; 2) $ 10,000 से अधिक शेष राशि वाले किसी भी ग्राहक को उच्च शेष ब्याज दर और उसके बाद ही मिलना चाहिए; 3) स्प्राइट की स्थिति हमेशा स्क्रीन के बाउंडिंग बॉक्स के भीतर होती है। कुछ गुण अच्छी तरह से बिंदु परीक्षणों के अनुरूप हो सकते हैं "जैसे कि जब शेष राशि $ 0 हो तो शून्य शेष चेतावनी दें"। कुल विनिर्देश प्राप्त करने के आदर्श के साथ गुण आंशिक विनिर्देश हैं। इन गुणों को सोचने में कठिनाई होने का मतलब है कि आप स्पष्ट नहीं हैं कि विनिर्देश क्या है और अक्सर इसका मतलब है कि आपको अच्छी इकाई परीक्षणों को सोचने में कठिनाई होगी।
डेरेक एल्किंस ने SE

0

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

जेनेरिक परीक्षण, क्विकचेक की तरह, इनपुट की एक विस्तृत जगह को व्यापक बनाने के लिए वास्तव में अच्छा है। मैन्युअल परीक्षणों की तुलना में बढ़त के मामलों से निपटने के लिए यह बहुत बेहतर है: जेनेरिक परीक्षण पुस्तकालय इससे अधिक अनुभवी हैं जैसे आप हैं। दूसरी ओर, वे केवल आपको अपरिवर्तनीयों के बारे में बताते हैं, विशिष्ट आउटपुट के बारे में नहीं। तो अपने कार्यक्रम को सही परिणाम प्राप्त करने के लिए, आपको यह सत्यापित करने के लिए कुछ मैनुअल परीक्षणों की आवश्यकता है, वास्तव में foo(bar) = baz,।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.