स्टोकेस्टिक व्यवहार के साथ कार्यक्रमों के परीक्षण के लिए सर्वोत्तम अभ्यास क्या हैं?


14

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

ऐसे कोड के परीक्षण के साथ एक समस्या यह है कि कीड़े अक्सर आंतरायिक होते हैं और प्रजनन के लिए बहुत कठिन हो सकते हैं। यह एक ही मूल्य के लिए एक यादृच्छिक बीज सेट करने और निष्पादन शुरू करने से परे जाता है।

उदाहरण के लिए, कोड कर्नेल रिंग बफर से एक संदेश पढ़ सकता है, और फिर संदेश सामग्री पर सशर्त छलांग लगा सकता है। स्वाभाविक रूप से, रिंग बफ़र की स्थिति बदल गई होगी जब कोई बाद में इस मुद्दे को पुन: पेश करने का प्रयास करेगा।

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

क्या इस तरह के परीक्षण प्रणालियों के लिए सर्वोत्तम अभ्यास स्थापित हैं? यदि हां, तो कुछ संदर्भ बहुत मददगार होंगे। यदि नहीं, तो किसी अन्य सुझाव का स्वागत है!


5
क्या आप कर्नेल रिंग बफर का मजाक नहीं उड़ा सकते? और आपके कोड के अन्य यादृच्छिक पहलू?
जोनाथन मेरलेट

1
@JonathanMerlet संभावित रूप से, लेकिन मुद्दा यह है कि जब तैनात किया जाता है, तो कोड वास्तविक रिंग बफर तक पहुंच जाएगा (वास्तव में, एक वास्तविक ओएस के लिए)। इसलिए अगर मैं केवल एक नकली संस्करण पर परीक्षण करता हूं, तो मैं बाद में इन बगों की खोज को समाप्त कर रहा हूं।
जॉन डकेट

यह मुझे प्रतीत होता है कि समस्या कार्यक्रम के यादृच्छिक व्यवहार से संबंधित नहीं है (क्योंकि यह यादृच्छिक बीज द्वारा नियंत्रित किया जा सकता है) लेकिन इस 'कर्नेल रिंग बफर' के विशेष राज्यों में। तो आपका प्रश्न वास्तव में 'मैं एक कार्यक्रम का परीक्षण कैसे करता हूं जो बाहरी राज्य पर निर्भर करता है', सही है?
आकाशमूर्ति

@ आकाश, हाँ, यह वाक्यांश का एक बेहतर तरीका है। अधिक विशिष्ट होने के लिए, एक बाहरी राज्य के साथ एक कार्यक्रम, जो बाहरी राज्य तक स्टोचस्टिक पहुंच या बदल देता है।
जॉन डकेट

जवाबों:


7

यह सुझाव के अनुसार हुक जोड़ने के लिए उपयोगी है, सटीक राज्यों को फिर से बनाने के लिए। सिस्टम को भी उपकरण दें ताकि वह अपने "बीज" (आपके मामले में, PRNG बीज के साथ-साथ कर्नेल रिंग बफर, और nondeterministic इनपुट के किसी भी अन्य स्रोत को शामिल कर सके)।

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

कर्नेल में आपकी पहुंच के विशेष मामले में, मैं किसी भी मामले में एक नकली बनाने की सलाह दूंगा। कंटेनरों के लिए "खाली" और "पूर्ण" की भावना में, या "0, 1, 2 ^ n, 2 ^ n + 1, कई" के लिए अभ्यास में दिखाने के लिए कम समानता वाले वर्गों को मजबूर करने के लिए मॉक का उपयोग करें। गिनने योग्य बातें। फिर आप मॉक के साथ और असली चीज़ के साथ परीक्षण कर सकते हैं, यह जानकर कि आपने उन मामलों को संभाला है और परीक्षण किया है जो आपने अब तक सोचा है।

असल में, जो मैं नियतात्मक और निरर्थक इनपुटों के मिश्रण के लिए मात्रा का सुझाव दे रहा हूं, नियतात्मक उन लोगों का मिश्रण है जिनके बारे में आप सोच सकते हैं और जिन्हें आप आश्चर्यचकित थे।


6

एक उचित बात यह है कि परीक्षणों के लिए एक स्थिर मूल्य के साथ यादृच्छिक संख्या जनरेटर को बीज दें, ताकि आपको एक निर्धारक व्यवहार मिल सके।


1
इस; या बाहर पूरी तरह से नकली मजाक

1
सलाह के लिये धन्यवाद! मैं पहले से ही यूनिट परीक्षण के लिए ऐसा करता हूं, लेकिन मैं हाथ से सभी संभावित कार्यक्रमों का परीक्षण नहीं कर सकता।
जॉन डकेट

2
लेकिन इसका मतलब यह है कि आप यह जांच नहीं कर सकते हैं कि क्या यादृच्छिकता ठीक से काम करती है ..
लुईस

2

मुझे लगता है कि सांख्यिकीय परीक्षण ही एकमात्र तरीका है। जैसे सांख्यिकीय परीक्षणों द्वारा यादृच्छिकता के लिए यादृच्छिक संख्याओं का "परीक्षण" किया जाता है, इसलिए ऐसे एल्गोरिदम की आवश्यकता होती है जो यादृच्छिक व्यवहार का उपयोग करते हैं।

बस एक ही या अलग इनपुट के साथ एल्गोरिथ्म को कई बार चलाएं और एक दूसरे से तुलना करें। परीक्षण समाप्त करने के लिए आवश्यक कम्प्यूटेशनल समय में इस दृष्टिकोण के साथ समस्या में भारी वृद्धि हुई है।


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

2

मैं इस डोमेन का विशेषज्ञ नहीं हूं, लेकिन स्टोकेस्टिक प्रोग्राम परीक्षण के सापेक्ष एक वैज्ञानिक लिटरेचर है।

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


धन्यवाद! बहुत मददगार लगता है। अकादमिक संस्थानों के बाहर के लोगों के लिए, कागज का एक पूर्व-संस्करण संस्करण लेखक के Google कोड भंडार से यहां खींचा जा सकता है: team4model.googlecode.com/svn/trunk/resources/paper/…
John Doucette
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.