2012-06-11 7 views
5

कुछ एप्लिकेशन डोमेन हैं (उदा। गेमडेव) जिसमें उनके आउटपुट के उत्पादन के लिए यादृच्छिक मूल्यों का उपयोग करके बहुत से फ़ंक्शन बनाए जाने चाहिए। उदाहरणों में से एक नीचे प्रस्तुत किया गया है:यादृच्छिक उपयोग करने वाले कार्यों की शुद्धता को कैसे सत्यापित करें?

def generate_key(monster_key_drop_coef): 
    key_letters = string.ascii_uppercase 
    rand = random.random() 
    if monster_key_drop_coef < rand: 
     return None 

    button = {} 
    button["type"] = random.choice([1,2,3]) 
    button["letter"] = random.choice(key_letters) 
    return button 

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

मेरे प्रश्न हैं:

  1. कार्यों के इस प्रकार के लिए उपयोगी प्रतिगमन परीक्षण लिखने के लिए यह संभव है?
  2. क्या इस मामले में कुछ अन्य प्रकार के परीक्षण बनाने के लिए कोई सामान्य दृष्टिकोण है?
+4

इस विषय पर पूरी किताबें लिखी गई हैं। उदाहरण: http://www.johndcook.com/Beautiful_Testing_ch10.pdf –

+1

ज्ञात परिणामों को वितरित करने के लिए आरएनजी का मज़ाक उड़ाते हुए (और फिर विशिष्ट आउटपुट के साथ परीक्षण जिसके लिए वांछित परिणाम ज्ञात है) एक दृष्टिकोण है। –

उत्तर

3

उपयोगी इकाई-परीक्षण में से एक नीचे प्रस्तुत है:

def test_generate_key(): 
    button_list = [] 
    for _ in range(1, 1000): 
     button_list.append(generate_key(0.2)) 

    is_all_none = True 
    is_not_none = False 
    for key in button_list: 
     is_all_none &= (key is None) 
     is_not_none |= (key is not None) 

    assert is_all_none == False 
    assert is_not_none == True 

यह समारोह हस्ताक्षर पुष्टि समारोह के कोड (अच्छी संभावना) के सभी लाइनों को कवर किया और 99.999% मामलों में पारित करेंगे। यह भी मान्य है कि फ़ंक्शन 1000 से कम से कम एक ड्रॉप उत्पन्न करता है और कभी-कभी ड्रॉप उत्पन्न नहीं करता है। 0.2 किसी आइटम की बूंद की संभावना है।

2

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

बेशक आप अपने दावों का भी परीक्षण कर सकते हैं जो कॉल के परिणामों पर यादृच्छिक रूप से निर्भर नहीं हैं। जैसे:

  • फ़ंक्शंस कोई नहीं या कुंजी "प्रकार" और "अक्षर" के साथ एक आदेश देता है।
  • यदि कोई शब्दकोश वापस किया जाता है तो मान उचित प्रकार और सीमा के होते हैं।

मैं कभी भी एक अज्ञात नहीं लिखूंगा जिसमें गैर-निर्धारक परिणाम हैं, यहां तक ​​कि एक हजार में भी 1। मुझे हर टेस्ट विफलता की परवाह है, और स्टोकास्टिक परिणाम परेशान होंगे। आप अपनी यादृच्छिकता को encapsulating से बेहतर होगा, ताकि समारोह यादृच्छिक संख्या जेनरेटर से स्वतंत्र परीक्षण किया जा सके।

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