2010-06-26 12 views
5

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

इसके लिए मेरी प्रेरणा यह है कि मुझे लगता है कि एल्गोरिदम उत्तर है, संख्या नहीं। अगर मैं किसी और के कोड नमूना को देखता हूं, तो यह समस्या को हल करने के लिए को समझने की चुनौती को खंडित करता है।

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

import unittest 
class ProblemOneTest(unittest.TestCase): 
    def test_me(self): 
     self.assertEquals(solve_problem_one(),233168) 

if __name__ == '__main__': 
    print "Problem 1 possible answer: %d" % solve_problem_one() 
    sys.exit(unittest.main()) 
+0

उत्तर होने से इसका चुनौती हिस्सा बर्बाद हो जाएगा। आप क्या कर सकते हैं कई "समाधान" चलाते हैं और उनके आउटपुट की तुलना करते हैं। –

+2

मेरे लिए मैं विपरीत महसूस करता हूं। संख्या एल्गोरिदम के बिना अर्थहीन है। मुझे लगता है कि कोड स्वयं ही जवाब है, और यह देखकर कि किसी और ने इसे कैसे हल किया है * इसे हल करने की चुनौती को तोड़ दिया। – Daenyth

+3

संदर्भ पृष्ठ में संख्या इनपुट नहीं कर रहा है और "आपने इसे हल किया है!" स्क्रीन पर्याप्त है? मैं वास्तव में नहीं देखता कि इकाई परीक्षण कैसे मदद करेंगे। अलग-अलग एल्गोरिदम लिखने की बजाय कोशिश करें, उन्हें तेज़ी से प्रस्तुत करने के लिए संशोधित करें, या बस अधिक सुरुचिपूर्ण। – nico

उत्तर

4

प्रोजेक्ट पर समस्या पृष्ठ यूलर वेबसाइट में आपके उत्तर की जांच करने के लिए एक इनपुट है। मुझे बस इतना ही चाहिए।

11

टीडीडी और प्रोजेक्ट यूलर असाइनमेंट एक साथ अच्छी तरह से नहीं चलते हैं। सबसे पहले और सबसे महत्वपूर्ण, टीडीडी आपको किसी भी परियोजना यूलर (पीई) समस्याओं को हल करने में मदद नहीं करेगा। यह मुझे using TDD द्वारा "सुडोकू को हल करने" के लिए एक व्यक्ति द्वारा उस प्रसिद्ध प्रयास की याद दिलाता है।

टीडीडी एक डिजाइन तकनीक नहीं है। लागू होने पर यह बहुत उपयोगी हो सकता है, लेकिन इसे चांदी की बुलेट के रूप में नहीं सोचें।

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

+0

क्षमा करें, मुझे खुद को और स्पष्ट करना चाहिए था। मैं अपने आप को किसी भी संदर्भ के साथ नंबर की तलाश नहीं कर रहा हूं ताकि मैं 'assertEquals (my_solution(), expected_answer) जैसे कुछ कर सकूं। मैं प्रोजेक्ट यूलर समस्याओं के लिए – Daenyth

+0

+1 लेखन परीक्षणों को अपडेट कर दूंगा, यदि आपके पास पहले से ही उत्तर है और आप इसे अनुकूलित करना चाहते हैं तो केवल समझ में आता है। –

+1

आप ब्रूट फोर्स द्वारा व्युत्पन्न मूल्य के खिलाफ छोटी सीमा के साथ समस्या को हल करने के लिए एल्गोरिदम का परीक्षण कर सकते हैं (मैंने अक्सर ऐसा किया)। – starblue

1

इकाई परीक्षण उत्तर है।

समस्याएं आमतौर पर इतनी सरल होती हैं (कठिनाई के मामले में नहीं, लेकिन कम से कम कोड लेआउट) जो उन्हें विभिन्न विधियों/कक्षाओं में तोड़ना आम तौर पर मूर्ख होता है।

+0

मुझे लगता है कि यह अधिक है, लेकिन यह सीखना चाहता है कि पाइथन में यूनिट परीक्षणों का उपयोग कैसे करें। मैं किसी और के कोड का संदर्भ दिए बिना अपना काम जांचने में भी सक्षम होना चाहता हूं। असल में मैं बस अपने एल्गोरिदम से संबंधित एक सही/गलत कथन रखना चाहता हूं। – Daenyth

+0

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

2

हाँ, आप कर सकते हैं सेटअप परीक्षण डाटा के खिलाफ अपने इकाई परीक्षण वे दे।

ऐसा प्रतीत होता है कि आप समस्याओं को हल करने के लिए पायथन का उपयोग कर रहे हैं (जैसा कि मैं हूं)। विभिन्न घटकों को सत्यापित करने के लिए मैं क्या करता हूं उदाहरण डेटा के खिलाफ सरल 'assert' कथन करना है। यह अच्छी तरह से काम करता है और कम समय के ऊपर है। इसके अलावा, आपको पूरे टेस्ट सूट को चलाने की आवश्यकता नहीं है जब आपको केवल यह जानने की आवश्यकता है कि समस्या 30 के लिए आपके नए बदलाव सही हैं या नहीं।

Using Assertions Effectively

+0

मुझे पता है कि मैं पार्टी के लगभग 3 साल देर से हूं लेकिन यह जाने का रास्ता है। – chucksmash

1

मैं जानता हूँ कि मैं पार्टी के लिए 3 साल देर हो रही है, लेकिन मैंने सोचा कि मैं साझा करेंगे कि कैसे मैं TDD के माध्यम से परियोजना यूलर आ रहा हूँ।

मैं पाइथन में काम कर रहा हूं, अगर यह आपके लिए मायने रखता है।

इस मैं क्या है:

  • हर समस्या (कम से कम) हो जाता है अपनी ही समारोह है कि एक प्रवेश/निकास बिंदु के रूप में कार्य, चाहे कितना तुच्छ या मूर्ख यह महसूस कर सकते हैं। यदि समस्या को किसी प्रकार की कार्यक्षमता की आवश्यकता होती है तो आपको समस्याएं भी सहायक कार्य मिल सकती हैं जो आपको लगता है कि आपको भविष्य में आवश्यकता हो सकती है।
  • अधिकांश परियोजना यूलर प्रश्नों में परीक्षण में एक छोटी डेमो/परीक्षण समस्या शामिल होती है। यह परीक्षण समस्या बताती है कि आप सबसे अधिक हल करते हैं लेकिन छोटे पैमाने पर।
  • एक पैरामीटर के साथ अपनी प्रविष्टि/निकास फ़ंक्शन सेट अप करने की योजना है जो फ़ंक्शन को समस्या के खिलौने संस्करण को हल करने के साथ-साथ कठिन पूर्ण पैमाने संस्करण को हल करने की अनुमति देता है। उदाहरण के लिए, problem 12 पर मेरा (हास्यास्पद नाम) प्रविष्टि बिंदु get_triangle_num_with_n_or_more_divisors (n) है।
  • इस बिंदु पर मैंने फ़ंक्शन को लागू नहीं किया है, बस इसे नाम दिया है। अब मैं इस समस्या के लिए दो परीक्षण लिखूंगा: test_example और test_problem। मैं अब के लिए @unittest.skip('Unimplemented') के साथ test_problem को सजाने दूंगा क्योंकि हम जवाब नहीं जानते हैं। आपका परीक्षण फ़ाइल मेरा कुछ इस तरह दिखाई दे सकता है:

    import unittest 
    
    from problems.p0014 import get_triangle_num_with_n_or_more_divisors 
    
    class TestHighlyDivisibleTriangleNumber(unittest.TestCase): 
        def test_example(self): 
         self.assertEquals(get_triangle_num_with_n_or_more_divisors(1), 
              1) 
         self.assertEquals(get_triangle_num_with_n_or_more_divisors(2), 
              3) 
         self.assertEquals(get_triangle_num_with_n_or_more_divisors(6), 
              28) 
    
        @unittest.skip('Unimplemented') 
        def test_problem(self): 
         self.assertEquals(get_triangle_num_with_n_or_more_divisors(500), 
              'TODO: Replace this with answer') 
    

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

मैं फिर बैठता हूं और get_triangle_num_with_n_or_more_divisors लिखता हूं। एक बार test_example गुजर रहा है, मैं असली समस्या को हल करने की कोशिश करता हूं; यदि यह काम करता है तो मैं अपने test_problem मामले को वास्तविक उत्तर के साथ अद्यतन करता हूं और बम आपके पास बूट करने के लिए एक पूर्ण उड़ा हुआ रिग्रेशन परीक्षण है।

Hackerrank है, जो एक Project Euler section है, TDD प्रतिमान से भी जाना जाता:

0

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

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

उदाहरण:

var cases = [ 
    {input: '1\n15', output: '45'}, 
    ... 
]; 

describe('Multiples of 3 and 5', function() { 
    cases.forEach((v, i) => { 
    it('test case #' + i, function() { 
     assert.equal(unit(v.input), v.output); 
    }) 
    }); 
}); 

हालांकि Hackerrank stdin और stdout का उपयोग करता है, मैं अभी भी एक समारोह में मुख्य कोड को अलग करने और कार्यात्मक प्रोग्रामिंग को रोजगार की कोशिश करो।

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