unit testing education परीक्षण डेटा के रूप में सेट के संयोजन का उपयोग कैसे करें




यूनिट टेस्ट क्या है (4)

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

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

एक नोट के रूप में: मुझे वास्तव में इसका जवाब पता है, लेकिन यह दूसरों के लिए उपयोगी हो सकता है, और यहाँ लोगों के लिए एक चुनौती है! - बाद में मेरे जवाब पोस्ट करेंगे।


दिलचस्प सवाल!

मैं इसे चुनने के संयोजन से, अजगर में निम्नलिखित जैसा कुछ करता हूं। सबसे मुश्किल भाग संभवत: पहले पास सत्यापन है, यानी if f(1,2,3) returns true , तो क्या यह सही परिणाम है? एक बार जब आप यह सत्यापित करते हैं, तो यह प्रतिगमन परीक्षण का एक अच्छा आधार है।

संभवत: यह परीक्षण के एक सेट बनाने के लिए एक अच्छा विचार है जो आप जानते हैं कि सभी सत्य होंगे (उदाहरण के लिए इस त्रिभुज के मामले में 3,4,5), और जांच के मामलों का एक सेट जो आप जानते हैं, सभी गलत होंगे (जैसे 0,1 , inf)। तो आप और अधिक आसानी से सत्यापित कर सकते हैं कि परीक्षण सही हैं।

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print c
(-1,-1,-1);
(-1,-1,0);
(-1,-1,1);
(-1,-1,5);
(-1,-1,10);
(-1,-1,0);
(-1,-1,1000);
(-1,-1,inf);
(-1,0,-1);
(-1,0,0);
...

ब्रांड के नए पायथन 2.6 के साथ, इटेटटोउल्स मॉड्यूल के साथ आपके पास एक मानक समाधान है जो कार्टेसीयन उत्पाद को पुनरावृत्त करता है:

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

आप उत्पाद को पुनरावृत्त और स्वयं के साथ प्रदर्शन करने के लिए "दोहराने" तर्क प्रदान कर सकते हैं:

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

आप संयोजन के साथ कुछ भी कर सकते हैं:

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

और यदि आदेश के मामले हैं, तो क्रमबद्धताएं हैं:

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

बेशक, ये सभी अच्छी चीजें एक ही काम नहीं करते हैं, लेकिन आप समस्या को सुलझाने के लिए उन्हें किसी दूसरे तरीके से इस्तेमाल कर सकते हैं।

बस याद रखें कि आप एक ट्यूपल या एक सूची को एक सेट में परिवर्तित कर सकते हैं और इसके विपरीत सूची (), ट्यूपल () और सेट () का उपयोग कर सकते हैं।


बिल्कुल, विशेष रूप से इन क्रमांतरों / संयोजनों के बहुत से निपटने के लिए मैं निश्चित रूप से देख सकता हूँ कि पहला पास एक मुद्दा होगा।

अजगर में दिलचस्प कार्यान्वयन, हालांकि मैंने "अल्गोरिदम 515" (नीचे देखें) के आधार पर सी और ओकमल में एक अच्छा एक लिखा है। उन्होंने फोरट्रान में लिखा था क्योंकि यह सभी "एल्गोरिथ्म XX" कागजात के लिए आम बात थी, ठीक है, वह विधानसभा या सी। मुझे इसे फिर से लिखना पड़ा और संख्याओं की श्रेणी नहीं करने के लिए arrays के साथ काम करने के लिए कुछ छोटे सुधार करना था यह एक यादृच्छिक पहुंच है, मैं अभी भी Knuth 4th खंड fascicle 2 में उल्लिखित लोगों के कुछ अच्छा लागू करने पर काम कर रहा हूँ। मैं यह कैसे पाठक को काम करता है की एक व्याख्या करेंगे यद्यपि अगर कोई उत्सुक है, तो मुझे कुछ लिखने पर कोई आक्षेप नहीं होगा I

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

~ "एल्गोरिथ्म 515: लेक्सिकोफोग्राफिकल इंडेक्स से वेक्टर की जेनरेशन"; बकल्स, बीपी, और लायबानोन, एमएसीएम लेनदेन पर गणितीय सॉफ्टवेयर, वॉल्यूम 3, नंबर 2, जून 1 9 77


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







testing