आप एल्गोरिदम पर "एज" मामलों की पहचान कैसे करते हैं?


25

मूल रूप से आप कैसे पता लगा सकते हैं कि आपका सबसे खराब या सबसे अच्छा मामला हो सकता है और किसी भी अन्य "किनारे" के मामले आपके पास हो सकते हैं और इसलिए, आप उनके लिए अपना कोड कैसे तैयार करेंगे?


2
वैकल्पिक: जब संभव हो, मैं फजी परीक्षण का बहुत बड़ा प्रशंसक हूं। यह आश्चर्यजनक है कि यादृच्छिक रूप से उत्पन्न इनपुट का सरासर द्रव्यमान बग्स को एक फ़ंक्शन के भीतर स्पॉट कर सकता है जो कि जांच / किनारे-परीक्षण की कोई भी राशि प्रकट नहीं करता है। दो काम वास्तव में एक साथ अच्छी तरह से ... और वे स्पष्ट रूप से लॉगिंग त्रुटियों के पूरक हैं जब "सही" इनपुट पर चल रहे हैं :)
Matthieu M.

जवाबों:


28

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

उदाहरण के लिए, एल्गोरिथ्म इनपुट के रूप में एक स्ट्रिंग और एक पूर्णांक लेता है और स्ट्रिंग के वर्णों की कुछ छंटाई करता है।

हमारे साथ हैं:

कुछ ज्ञात विशेष मामलों के साथ स्ट्रिंग :

  • खाली स्ट्रिंग
  • लंबी डोरी
  • यूनिकोड स्ट्रिंग (विशेष वर्ण)
  • यदि वर्णों के एक विशिष्ट समूह तक सीमित है, तो क्या होता है जब कुछ सीमा में नहीं होते हैं
  • अजीब / भी लंबाई स्ट्रिंग
  • अशक्त (तर्क के रूप में)
  • गैर-शून्य समाप्त

ज्ञात विशेष मामलों के साथ पूर्णांक :

  • 0
  • न्यूनतम / MaxInt
  • नकारात्मक सकारात्मक

क्रमबद्ध एल्गोरिथ्म जो निम्नलिखित सीमा मामलों में विफल हो सकता है:

  • खाली इनपुट
  • 1 तत्व इनपुट
  • बहुत लंबा इनपुट (हो सकता है कि लंबाई अधिकतम (इंडेक्स के लिए उपयोग किया जाने वाला डेटा प्रकार))
  • संग्रह के अंदर का कचरा जो छांटा जाएगा
  • अशक्त इनपुट
  • डुप्लिकेट तत्वों
  • सभी तत्वों के बराबर संग्रह
  • अजीब / भी लंबाई इनपुट

फिर, इन सभी मामलों को लें और यह समझने की कोशिश करते हुए एक लंबी सूची बनाएं कि वे कैसे ओवरलैप करते हैं। उदाहरण के लिए:

  • खाली स्ट्रिंग केस खाली संग्रह मामले को कवर करता है
  • नल स्ट्रिंग == अशक्त संग्रह
  • आदि।

अब उनके लिए टेस्ट केस बनाएं :)

संक्षिप्त सारांश : उन बुनियादी ब्लॉकों में एल्गोरिथ्म को तोड़ें जिनके लिए आप सीमा के मामलों को जानते हैं और फिर उन्हें फिर से इकट्ठा करते हैं, जिससे वैश्विक सीमा मामले बनते हैं


5
जोड़ने के लिए एक और बात। । । कोड का विश्लेषण करें और कोड में विशेष मामलों की तलाश करें। यदि डेवलपर 0 से 13 को 14 से अधिक और अधिक से अधिक संभालता है - शायद देव प्रदर्शन के कारणों के लिए छोटे और बड़े मूल्यों के लिए अलग-अलग एल्गोरिदम का उपयोग कर रहे हैं - तो आपके पास 13 और 14. महान सूची के लिए +1 हैं।
एथेल इवांस

2

मुझे नहीं लगता कि किनारे की स्थिति निर्धारित करने के लिए कोई एल्गोरिथ्म है .... बस अनुभव।

उदाहरण: एक बाइट पैरामीटर के लिए आप 0, 127, 128, 255, 256, -1, जैसे नंबरों का परीक्षण करना चाहते हैं, जिससे कुछ भी परेशानी हो सकती है।


2

एक "बढ़त" के दो अर्थ हैं, और दोनों प्रासंगिक हैं जब यह किनारे के मामलों की बात आती है। एक छोर या तो एक ऐसा क्षेत्र है जहां इनपुट में एक छोटा सा बदलाव आउटपुट, या एक सीमा के अंत में बड़े परिवर्तन की ओर जाता है।

इसलिए, एक एल्गोरिथ्म के किनारे के मामलों की पहचान करने के लिए, मैं पहली बार इनपुट डोमेन को देखता हूं। इसके किनारे मान एल्गोरिथ्म के किनारे मामलों को जन्म दे सकते हैं।

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

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


0

यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैं केवल कुछ सामान्य, अस्पष्ट विचारों को बाहर निकाल सकता हूं :)

-बाउंड्री मामलों की जांच करें। पूर्व। यदि आप एक स्ट्रिंग पार्स कर रहे हैं तो क्या होगा यदि स्ट्रिंग खाली या अशक्त है? यदि आप x से y की गिनती कर रहे हैं तो x और y में क्या होता है?
-सीधे सरल या DRY-ed बाहर किया जा सकता है। कोई भी अनावश्यक जटिलता उन चीजों को जोड़ सकती है जो गलत हो सकती हैं।


0

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

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