2008-08-02 10 views
18

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

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

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

+0

[एबैकस गिथब] (https://github.com/foo123/Abacus) नोड.जेएस, पायथन, पीएचपी, एक्शनस्क्रिप्ट (पीएस मैं लेखक हूं) के लिए एक संयोजन पुस्तकालय –

उत्तर

14
बिल्कुल

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

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

/** [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.

+0

'चुनें() 'क्या करें ? क्या वह मूल रूप से 'n-c [i] '' p- (i + 1) 1' चुनता है? – mkb

+0

@ एमकेबी बेशक। – nlucaroni

+0

मुझे खेद है, मैं चुनिंदा व्यवहार का पालन नहीं करता हूं। ऐसा लगता है कि इसे स्वयं रिफ्लेक्सिव के रूप में परिभाषित किया गया है - चुनें चुनें। क्या आप मुझे बता सकते हैं कि यह सरल शब्दों में क्या करता है? – CuppM

4

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

मैं संयोजनों को चुनकर ऐसा करूँगा, जो कि पाइथन में निम्न जैसा है। सबसे कठिन हिस्सा शायद पहला पास सत्यापन है, यानी 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

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

0

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

एक सामान्य क्यूए परिप्रेक्ष्य से, आप इनपुट के विभिन्न वर्गीकरणों की पहचान करना चाहते हैं। प्रत्येक वर्गीकरण के लिए इनपुट मानों का एक सेट तैयार करें और उपयुक्त आउटपुट निर्धारित करें।

यहाँ इनपुट की कक्षाओं का एक नमूना जैसे कम संख्या के साथ महत्व देता

  • मान्य त्रिकोण है (1 अरब, 2, अरब, 2 अरब)
  • जैसे (0.000001, 0.००,००२ बड़ी संख्या के साथ वैध त्रिकोण , 0.00003)
  • वैध कुंठित त्रिकोण 'इस तरह के almost'flat (10, 10, 19.9999)
  • वैध तीव्र त्रिकोण हैं कि' के रूप में इस तरह के (10, 10, 0,000,001)
  • अमान्य त्रिकोण के रूप में लगभग 'फ्लैट हैं कि वाई वें कम से कम एक नकारात्मक मूल्य
  • अमान्य त्रिकोण जहां दोनों पक्षों की राशि तीसरे
  • अमान्य त्रिकोण जहां दोनों पक्षों की राशि तीसरे
  • इनपुट मानों कि गैर-संख्यात्मक हैं से अधिक है के बराबर होती है

...

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

कुछ समय के लिए यादृच्छिक डेटा भी सहायक हो सकता है, जो कोड में अजीब बग पा सकते हैं, लेकिन आम तौर पर उत्पादक नहीं है।

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

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)] 

आप एक "दोहराने" तर्क उत्पाद एक iterable के साथ प्रदर्शन करने प्रदान कर सकते हैं:

4
ब्रांड के नए अजगर 2.6 के साथ

, आप itertools मॉड्यूल iterables की कार्तीय उत्पाद रिटर्न के साथ एक मानक समाधान है और खुद को:

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)] 
पाठ्यक्रम का और सामान शांत बिल्कुल वही बात नहीं करते के

, लेकिन आप एक तरह से उनका उपयोग कर सकते हैं या किसी अन्य आप समस्या को हल करने के लिए।

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

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

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