2012-08-23 9 views
5

मैं मॉड्यूल :: स्टार्टर का उपयोग कर एक नया मॉड्यूल बनाने का अभ्यास कर रहा हूं। मैंने पैकेज के लिए कुछ टेस्ट केस लिखे हैं, और वे कभी-कभी ठीक चलते हैं।मॉड्यूल :: स्टार्टर द्वारा किए गए मॉड्यूल को कैसे डिबग किया जाए?

हालांकि मैंने देखा वहाँ दो समस्याएं हैं:

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

  • कहें कि मेरे पास एक समारोह का परीक्षण करने के लिए तीन परीक्षण मामले हैं, मैंने परीक्षण के मामलों में एक प्रिंट स्टेटमेंट लगाया है, जब परीक्षण के मामले चलते हैं, तो यह रिपोर्ट करता है कि तीन परीक्षण मामलों में से केवल 1 चलाया गया था। अगर मैं प्रिंट स्टेटमेंट हटा देता हूं, तो सभी तीन टेस्ट केस चलाए जाएंगे। ऐसा क्यों है?

    # package declaration and stuff... 
    sub get_in { 
        my ($hash, @path) = @_; 
        my $ref = $hash; 
        print 'lol'; # This is the troublesome print statement. Remove this statement and all three test cases will run and pass 
        foreach (@path) { 
        if (ref($ref) eq 'HASH' && exists $ref->{$_}) { 
         $ref = $ref->{$_}; 
        } else { 
         return undef; 
        } 
        } 
        return $ref; 
    } 
    

    यह परीक्षण मामलों है:

यहाँ मेरी कोड है

use Test::More tests => 3; 
use strict; 
use warnings; 
use diagnostics; 
require_ok('Foo::Doc'); 
ok(Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c') == 101); 
ok(@{ Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => [ 1, 2, 3 ] } } }, 'a', 'b', 'c') } == @{ [ 1, 2, 3 ] }); 
+3

यह प्रश्न मॉड्यूल :: स्टार्टर के लिए वास्तव में विशिष्ट नहीं है। मानक पर्ल प्रोजेक्ट लेआउट में टेस्ट :: सरल या टेस्ट :: अधिक या कुछ आउटपुट टेस्ट सफलता या विफलता के उपयोग से '* .t' परीक्षणों के साथ' t' निर्देशिका शामिल है। प्रत्येक पर्ल बिल्ड टूलकिट आपके परीक्षण चलाने और पर्ल कोर में दिए गए टूल का उपयोग करके मानक रिपोर्ट में परिणामों को आउटपुट करने के लिए टूल प्रदान करता है। – zostay

उत्तर

7

आप के साथ कुछ समस्याएं परीक्षण अपने प्रश्न में ही है और साथ ही संबोधित किया जाना चाहिए रहे हैं । सबसे पहले आपका प्रश्न:

यदि आप परीक्षण में आउटपुट दिखाना चाहते हैं, तो आपको स्पष्ट रूप से मानक त्रुटि पर प्रिंट करना होगा। एक सर्वोत्तम अभ्यास के रूप में, आपको # के साथ अपने आउटपुट की भी आवश्यकता है। Test::More मॉड्यूल उन टूल प्रदान करता है जिनका उपयोग आप आसानी से करने के लिए कर सकते हैं।

my $got = Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c'); 
ok($got == 101); # you probably want is() instead, see below 
diag("GOT $got"); # outputs "# GOT 101" or whatever to STDERR 

आप मुद्रित करने के लिए है कि उत्पादन हर बार, लेकिन केवल जब वर्बोज़ लॉगिंग का अनुरोध किया है, तो आप उपयोग कर सकते हैं नहीं करना चाहते हैं note:

note("GOT $got"); 

यह उपयोगी है जब आप prove -v का उपयोग अपने को चलाने के लिए परीक्षण:

prove -l -v t/test.t 

वहाँ भी है एक explain समारोह है कि बाहर से देखने के लिए जटिल उत्पादन डंप हो जाएगा:

diag explain $got; 
# OR 
note explain $got; 

आपकी अन्य समस्याओं के लिए।

is_deeply($got, [1, 2, 3]); 

आप निश्चित रूप से प्रलेखन पर एक नज़र रखना चाहिए:

is($got, 101); # gives slightly more readable output on error 

इसके अलावा, जब जटिल डेटा संरचनाओं का परीक्षण आप is_deeply() उपयोग करने के लिए एक पूरा तुलना करने की जरूरत है: यह उपयोग करने के लिए is()ok() को आम तौर पर प्राथमिकता दी जाती है Test::More की वजह से वहां बहुत उपयोगी जानकारी है।

2

अपने दूसरे प्रश्न से निपटने के लिए, आप टेस्ट स्क्रिप्ट में मानक आउटपुट पर सावधानीपूर्वक लिखना चाहते हैं। Test::Moreok 5 और not ok 6 - disgronificator enabled जैसे टेलटेल परीक्षण आउटपुट की तलाश में मानक आउटपुट स्कैन करता है।जब आप मानक आउटपुट में "lol" लिखते हैं लेकिन एक नई लाइन संलग्न नहीं करते हैं, तो परीक्षण मॉड्यूल "lolok 9 - it works" सेट करेगा और इसे परीक्षण परिणाम के रूप में पहचाना नहीं जाएगा। (अतिरिक्त मज़े के लिए, अपने सभी परीक्षणों से पहले print "not "; बयान दें)।

बेहतर अभ्यास diag और Test::More प्रदान करते हुए अन्य आउटपुट फ़ंक्शंस का उपयोग करते हुए, मानक त्रुटि को लिखने के लिए ज़ोस्टे कहते हैं।

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