2012-05-26 13 views
13

मैं नया कोड तैयार कर रहा हूं। मैं यह सुनिश्चित करना चाहता हूं कि मैं कोई पत्थर नहीं छोड़ा।फ्लोटिंग-पॉइंट तर्क के अच्छे कोड कवरेज कैसे उत्पन्न करें?

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

कुछ पृष्ठभूमि जानकारी के लिए कीवर्ड 'फ्लोट' के लिए http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf खोज करने का प्रयास करें।

अंकगणित की कमी चल बिन्दु संख्या पर परिमेय संख्याओं को एक अनुवाद करके लगाया जाता है, और अनुमानी खोज तकनीक चल बिन्दु की कमी के लिए सन्निकट हल प्राप्त करने के लिए जेड 3 के बाहर किया जाता है।

... और भी ...

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

वैकल्पिक रूप से, क्या आप .NET के अंतर्गत एक उपकरण जानते हैं जो .NET के अंतर्गत संख्यात्मक विसंगतियों को खोजने के कार्य के लिए बेहतर है? मुझे http://fscheck.codeplex.com/ के बारे में पता है लेकिन यह प्रतीकात्मक तर्क नहीं करता है।

+2

'फ्लोट' के लिए '==' से संबंधित सशर्त से बचें। इसके बजाय '<' or '> 'का उपयोग करें। यदि आपको '==' का उपयोग करना है तो उस ईपीएसलॉन की जो भी सहनशीलता है, उसके लिए 'Math.Abs ​​(मान - लक्ष्य)

+0

@ जेसे चिश्ल्म मैं स्थिर विश्लेषण उपकरण से अवगत हूं जो आपको ऐसी कोडिंग त्रुटियों को खोजने की अनुमति देता है। मुझे यकीन नहीं है कि यह सवाल के साथ कैसे मदद करता है। – GregC

+0

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

उत्तर

1

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

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

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

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

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

+0

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

+0

यहां एक अन्वेषण का एक उदाहरण दिया गया है जो स्वचालित परेशानी-खोजकर्ता की सहायता से सरलीकृत किया जाएगा: http://www.mathworks.com/matlabcentral/newsreader/view_thread/278975 – GregC

+0

मैं नहीं देख सका कि लड़कों की समस्या का समाधान क्या था - क्या ऐसा कुछ ऐसा था जो जेनरेट टेस्ट डेटा द्वारा पाया जा सकता था?फ्लोटिंग पॉइंट नंबरों के लिए बहुत बड़ी खोज स्थान होनी चाहिए - ऐसा लगता है कि पीडीएफ में कहा गया है कि पीईएक्स उनके बारे में सटीक कारण नहीं दे सकता है। दिलचस्प समस्या, माफ करना, मैं और अधिक मदद नहीं कर सका! –

संबंधित मुद्दे