2010-02-15 8 views
5

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

package Neu::Series; 
use Moose; 
use MooseX::FollowPBP; 

use File::Find::Wanted; 

has 'file_regex' => (
    isa=>'RegexpRef', 
    is=>'rw', 
    default => sub{ 
       qr{ 
        [A-Z]  #Uppercase letter 
        [a-zA-Z]* #any letter, any number of times 
        [-]   #dash 
        (   #open capturing parenthesis 
        [0-9] 
        [0-9] 
        [0-9] 
        [0-9] 
        [a-zA-Z]? #any letter, optional 
        )   #close capturing parenthesis 
       }xms; 
      }, 
); 


has 'top_dir' => (
    isa=>'Str', 
    is=>'rw', 
); 


has 'access' =>(
    isa=>'Neu::Access', 
    is=>'ro', 
    required=>1, 

); 

1; 

मेरे वर्तमान परीक्षण स्क्रिप्ट है:

use strict; 
use warnings; 
use Test::More tests => 8; 
use Neu::Access; 

BEGIN{ use_ok('Neu::Series'); } 

can_ok('Neu::Series', 'new'); 
can_ok('Neu::Series', 'set_file_regex'); 
can_ok('Neu::Series', 'get_file_regex'); 
can_ok('Neu::Series', 'set_top_dir'); 
can_ok('Neu::Series', 'get_top_dir'); 
can_ok('Neu::Series', 'get_access'); 

my $access = Neu::Access->new(dsn => 'test'); 
my $series_worker = Neu::Series->new(access => $access); 

isa_ok($series_worker, 'Neu::Series'); 

यह पर्याप्त है या बहुत-बहुत परीक्षण है? (यानी, रेगेक्स के लिए स्पष्ट रूप से लापता परीक्षणों के अलावा)।

मैंने सोचा कि मैंने इस बारे में एक वेब पेज या कोई अन्य पोस्ट देखा है, लेकिन मैं इसे आज नहीं ढूंढ पाया।

उत्तर

1

मैं अपने विनिर्देश का परीक्षण करने पर ध्यान केंद्रित करूंगा। क्या मैंने मूस को बताया कि मैं इसे सही तरीके से करना चाहता था?

यह अंत करने के

, मैं निम्नलिखित परीक्षण के साथ शुरू होता है:

  • /सत्यापित करें कि पढ़ने लिखने गुण दोनों एक्सेसर और एक mutator है।
  • सत्यापित करें कि केवल पढ़ने वाले गुणों में एक एक्सेसर और कोई म्यूटेटर नहीं है।
  • किसी भी प्रकार की बाधाओं और मजबूरियों का परीक्षण करें। सत्यापित करें कि केवल स्वीकार्य मान सेट किए जा सकते हैं। यदि कोई विशेषता है तो आप VII को Str के रूप में देखने के लिए उम्मीद करते हैं और Int में 7 के रूप में देखते हैं, यह परीक्षण करता है कि यह करता है।
+0

आपके उत्तर के लिए धन्यवाद। आप सही हैं कि मुझे * सबकुछ * का परीक्षण करना चाहिए कि मैं संभवतः खुद को गलत कर सकता हूं। –

2

यह जांचकर कि सभी एक्सेसर्स सही ढंग से जेनरेट किए गए थे ठीक है ... हालांकि अन्य चीजें हैं जो आप थोड़ा उच्च स्तर पर परीक्षण कर सकते हैं, उदा। परीक्षण क्यों नहीं किया गया कि गुण ठीक से उत्पन्न हुए थे?

use Test::Deep; 
my @attrs = Neu::Series->meta->get_all_attributes; 
cmp_deeply([ map { $_->name } @attrs ], superbagof(qw(file_regex top_dir access))); 
+1

मुझे 'टेस्ट :: दीप' में पेश करने के लिए धन्यवाद! अपना जवाब पढ़ने के बाद, मैं गया और प्रलेखन को देखा और वास्तव में इससे प्रभावित हूं। मैं यह भी प्रभावित था कि 'टेस्ट :: दीप :: नोटेस्ट' आपको गैर-परीक्षण स्थिति में समान तुलना करने की अनुमति देगा। –

+1

मुझे परीक्षण उद्देश्यों के लिए मेटा क्लास से पूछताछ करने का आपका विचार पसंद है। यह मुझे रोक देता है जब मैं मानता हूं कि यह परीक्षण स्वयं को मूस पर निर्भर करता है, तो क्या होता है यदि मैं अपनी परियोजना के लिए मूस को त्यागना चुनता हूं (उसमें मोटा मौका)? क्या ब्लैक बॉक्स परीक्षण होना बेहतर है जो एक विशेष विधि को सत्यापित करता है और ठीक से व्यवहार करता है (लागत पर अधिक जटिल परीक्षण), या कक्षा के आत्मनिरीक्षण के लिए मेटा क्लास जानकारी का उपयोग करना और विनिर्देश को सीधे सत्यापित करना बेहतर है? – daotoad

+1

@daotoad: मुझे लगता है कि यह एक सवाल है कि आप सोचते हैं कि आप मूस से दूर हो सकते हैं, और आप प्रत्येक मूस रिलीज पर कितना भरोसा करते हैं कि पूरी तरह से परीक्षण किया जाए। यूनिट परीक्षणों को बदलने की आवश्यकता के लिए विभिन्न रिफैक्टरिंग के लिए यह काफी आम है, और चूंकि मूस स्थापना प्रक्रिया काफी ठोस है, इसलिए आईएमएचओ मैं केवल गुणों के अस्तित्व का परीक्षण करता हूं और फिर अपनी कक्षा के वास्तविक कार्यान्वयन का परीक्षण करने के लिए आगे जाता हूं (एप्लिकेशन तर्क इसमें मूस शामिल नहीं है)। जटिल भूमिका संरचना का परीक्षण करते समय मैं अपने $ काम में मेटा-विशिष्ट परीक्षणों का उपयोग करता हूं, जहां यह संभव है कि एक विशेषता गुम हो। – Ether

5

परीक्षण में वास्तव में कोई संकेत नहीं है कि एक्सेसर्स सही ढंग से उत्पन्न हुए थे। यदि वे नहीं हैं, तो आप बहुत जल्दी पता लगाएंगे, क्योंकि आपके द्वारा लिखे गए किसी भी वास्तविक परीक्षण में असफल रहेगा।

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

मैं दाओटोड से सहमत हूं, यह शायद परीक्षण बाधाओं और दबाव के लायक है कि आप स्वयं को लिखते हैं।

+0

यह अद्भुत है! आप और बाकी मूस टीम के लिए धन्यवाद। –

+0

मैं मानता हूं कि म्यूज़ के संपूर्ण परीक्षण सेट को दोबारा लिखने वाले परीक्षणों में कोई बात नहीं है, लेकिन मैं एक्सेसर्स और म्यूटेटर को सत्यापित करने के लिए अपने सुझाव से खड़ा हूं। मुझे मूस पर विश्वास करने के लिए जो मैं करता हूं उसे करने के लिए विश्वास करता हूं - मूस ने हमेशा जो लिखा है वह हमेशा किया है। हालांकि, मुझे मूस को बताने के लिए खुद पर भरोसा नहीं है कि मैं इसे क्या करना चाहता हूं। जब आप वास्तव में 'ro' चाहते हैं तो एक विशेषता में' rw' रखना बहुत आसान है। ये परीक्षण जितना संभव हो उतना सरल होना चाहिए - वे कल्पना का परीक्षण करते हैं, कार्यक्षमता नहीं। – daotoad

+2

मैंने इस विषय के बारे में एक [ब्लॉग एंट्री] लिखा है (http://blog.urth.org/2010/02/the-purpose-of-automated-tests.html)। –

1

धन्यवाद डेव, डाओटोड, ईथर, इलियट, और ब्रायन। आपके उत्तरों, टिप्पणियों और ब्लॉगों को पढ़ने से, दो प्रमुख बिंदु प्रतीत होते हैं:

(1) यह सुनिश्चित करने के लिए मूस ऐसा करने की आवश्यकता नहीं है कि मूस ऐसा करता है। मुझे लगता है कि हर कोई इस बिंदु पर सहमत है।

(2) परीक्षण मूस-जेनरेटेड विधियां आपके इंटरफेस की स्थापना, परीक्षण और रखरखाव के लिए उपयुक्त है। ज्यादातर इस बिंदु पर सहमत हैं।

फिर, आपके इनपुट के लिए सभी को धन्यवाद।

संपादित करें:

यह सिर्फ एक समुदाय-विकी सारांश है। कृपया व्यक्तिगत उत्तरों और टिप्पणियों को पढ़ें।