2010-04-13 19 views
5

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

मैं एक एकल सबराउटिन के लिए परीक्षण लिखकर शुरू कर रहा था। मैं स्क्रिप्ट के शीर्ष के निकट कुछ हद तक इस लाइन डाल मैं परीक्षण कर रहा हूँ:

return 1 if (caller()); 

इस तरह, अपने परीक्षण लिपि में, मैं

require 'script_to_test.pl'; 

और यह पूरी स्क्रिप्ट को निष्पादित नहीं होगा सकते हैं।

पहला सबराउटिन जिसे मैं परीक्षण करने जा रहा था, पूरे स्क्रिप्ट में सेट किए गए वैश्विक चर का बहुत उपयोग करता है। मैं कर रहा हूँ परीक्षण, शीर्ष पर एक बड़े पैमाने पर "मेरा" ब्लॉक है जहां यह वाणी (मेरे लिए)

require_ok('script_to_test.pl'); 
$var_from_other_script = 'Override Value'; 
ok(sub_from_other_script()); 

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

मैंने निर्यातक, टेस्ट :: मॉक ... और कुछ अन्य मॉड्यूल के साथ खेला है, लेकिन ऐसा लगता है कि मैं किसी भी चर को बदलने में सक्षम होना चाहता हूं, मुझे कुछ अन्य स्क्रिप्ट को संशोधित करना होगा फैशन।

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

क्या यह संभव है? क्या एक कॉलिंग स्क्रिप्ट "my" के साथ घोषित किसी अन्य स्क्रिप्ट में चर को संशोधित कर सकता है?


और कृपया की तरह जवाब के साथ में कूद नहीं है,,, आदि यही कारण है कि सबसे अच्छा समाधान हो सकता है "बस खरोंच से स्क्रिप्ट फिर से लिखना" लेकिन यह मेरे सवाल का जवाब नहीं है, और हमारे पास पुनः लिखने के लिए समय/संसाधन नहीं हैं।

उत्तर

5

आप (चर शाब्दिक रखना चाहते हैं, अगर वहाँ बंद कर रहे हैं उनके साथ बनाया गया) आप चारों ओर पोक करने के लिए मॉड्यूल PadWalker का उपयोग कर सकते हैं।

package somepackage; 

use PadWalker qw/peek_my/; 

my $x = 1; 
# big my block declaration... 

our $lexpad = peek_my 0; 
अपने परीक्षण कोड में

तो:

${ $somepackage::lexpad->{'$x'} } = 2; 
+0

यह मूल स्क्रिप्ट में न्यूनतम परिवर्तन के साथ पूरी तरह से काम करता है। – BrianH

2

स्क्रिप्ट एक package घोषणा (या आप स्क्रिप्ट के व्यवहार को बदलने के बिना एक जोड़ सकते हैं अगर) है, तो आप my घोषणा एक our घोषणा करने के लिए बदलने के लिए, और पूरी तरह से योग्य चर नाम का उपयोग कर चर बदल सकते हैं।

पुरानी स्क्रिप्ट:

my($a,@b,$c,%d); 

को बदलें:

package Some::Package; 
our($a,@b,$c,%d); 

और अपने परीक्षण लिपि में:

sub_from_other_script(); 
$Some::Package::c = 42; 
$Some::Package::d{$key} = $value; 
sub_from_other_script(); 
+2

पुरानी स्क्रिप्ट एक स्टैंडअलोन स्क्रिप्ट है, तो यह हमेशा सुरक्षित एक पैकेज नाम जोड़ने के लिए है

पुराने कोड में कुछ इस तरह शामिल और चर का दायरा करने के लिए 'our' का उपयोग करने के लिए। – mob

+0

स्क्रिप्ट में पैकेज घोषणा नहीं है। मैं हालांकि एक जोड़ने की कोशिश कर सकता हूं ... – BrianH

+0

पैकेज घोषणा के बिना (लेकिन अभी भी 'my' ->' our' 'को बदल रहा है, मुझे संदेह है कि आप टेस्ट स्क्रिप्ट से केवल $ मुख्य :: var_from_other_script' में हेरफेर कर सकते हैं। – mob

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