2009-10-19 14 views
5

हमारे पास एक पाइथन लाइब्रेरी है जिसे हम विकसित कर रहे हैं। विकास के दौरान, मैं उस पुस्तकालय के कुछ हिस्सों का उपयोग इसके नए संस्करणों का परीक्षण करने के लिए करना चाहता हूं। यही है, विकास कोड का परीक्षण करने के लिए स्थिर कोड का उपयोग करें। क्या अजगर में ऐसा करने का कोई तरीका है?उसी प्रक्रिया में एक पायथन लाइब्रेरी के विभिन्न संस्करणों का उपयोग

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

एक विचार जो हमने उठाया है, एक अलग प्रक्रिया पर RPYC का उपयोग करके स्थिर कोड को कॉल कर रहा है, लेकिन यह एक हवा-तंग तरीके से लागू करना मुश्किल है (सुनिश्चित करें कि यह ठीक से मर जाता है, और कई उदाहरणों को निष्पादित करने की इजाजत देता है एक ही कंप्यूटर पर एक ही समय आदि)।

धन्यवाद

+1

स्थिर और विकास कोड की वांछित कॉन्फ़िगरेशन बनाने के लिए आप अपने सामान्य स्रोत-कोड प्रबंधन टूल का उपयोग क्यों नहीं कर सकते? शाखाओं के साथ एसवीएन में यह सब कुछ करता है। और कोई प्रोग्रामिंग नहीं। ऐसा करने के लिए आप एसवीएन शाखाओं का उपयोग क्यों नहीं कर सकते? –

+1

यह नहीं देख सका कि किस शाखाई को इसके साथ क्या करना है, इसलिए मैंने सवाल थोड़ा स्पष्ट कर दिया, उम्मीद कर रही है कि इससे आपको यह समझने में मदद मिलेगी कि मैं क्या करने की कोशिश कर रहा हूं। – abyx

उत्तर

0

मैं तुम्हें वास्तव में कैसे अपने परीक्षण सेट करने की आवश्यकता को लेकर अनिश्चित हूं, लेकिन आप VirtualEnv उपयोग करने के लिए दोनों मामलों eachother के साथ चलने प्राप्त करने में सक्षम हो सकता है।

+0

यह साथ नहीं है, वास्तव में दूसरे को उपयोग करने की आवश्यकता है। – abyx

1

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

यदि आपके पास यूनिट परीक्षण नहीं है, तो यह उन्हें बनाने के लिए समय है (स्थिर libA और libT पहले का उपयोग करके!)।

मैं "संस्करण नियंत्रण प्रणाली" (उदाहरण के लिए bzr, hg, svn, git) का उपयोग करने की अनुशंसा करता हूं। फिर आप अपनी परियोजना की शाखाएं बना सकते हैं, "स्थिर" और "देव"।

शाखा देवा पर काम करने के लिए, आप पहली बार चल पाएंगे

export PYTHONPATH=/path/to/devA 

यकीन PYTHONPATH वातावरण चर अन्य शाखाओं को शामिल नहीं करने से, आप का आश्वासन दिया रहे हैं अजगर सिर्फ मॉड्यूल आप इच्छा उपयोग कर रहा है।

जब समय dev>> स्थिर से कोड मर्ज करने का समय आता है, तो संस्करण नियंत्रण सॉफ़्टवेयर भी ऐसा करने का एक आसान तरीका प्रदान करेगा।

संस्करण नियंत्रण आपको भी साहसी होने की अनुमति देता है - बड़े बदलावों की कोशिश करना डरावना नहीं है। अगर चीजें काम नहीं करती हैं, तो वापस करना बहुत आसान है। उस और पायथनपथ चाल के बीच, आप हमेशा ज्ञात, काम करने वाले कोड पर वापस जाने में सक्षम होते हैं।

यदि आप उपरोक्त महसूस करते हैं तो बस आपके लिए काम नहीं करेगा, और आपको libA-dev का परीक्षण करने के लिए libT-which-निर्भर-libA का उपयोग करना होगा, तो आपको सभी मॉड्यूल का नाम बदलना होगा और संशोधित करना होगा libA-dev और libA के बीच स्पष्ट अलगाव करने के लिए सभी आयात विवरण। उदाहरण के लिए, यदि libA में मॉड्यूलA.py नामक एक मॉड्यूल है, तो इसे मॉड्यूल__dev.py का नाम दें।

आदेश

rename -n 's/^(.*)\.py/$1_dev.py/' *.py 

सभी * .py फ़ाइलों के लिए "_dev" जोड़ देगा। ("-n" ध्वज के साथ नाम बदलें कमांड आपको केवल समकालीन नामकरण दिखाएगा। "-n" को वास्तव में इसके साथ जाने के लिए हटाएं।)

नाम वापस जाने के लिए,

rename -n 's/^(.*)_dev\.py/$1.py/' *.py 

चलाने इसके बाद आप कोड के भीतर moduleA_dev को moduleA के सभी संदर्भ को बदलना होगा। > "ModuleA_dev" - आदेश

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \; 

LIBA-देव में हर * .py फ़ाइल, बदल रहा है "moduleA" को बदल देगा।

इस आदेश से सावधान रहें। यह खतरनाक है, क्योंकि यदि आपके पास मॉड्यूलब नामक एक चर है तो इसे मॉड्यूलए_डेवीबी का नाम दिया जाएगा, जबकि आप जो वास्तव में चाहते थे वह मॉड्यूलAB_dev हो सकता है।

इस परिवर्तन (ऊपर चेतावनी के अधीन),

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \; 

वापस जाने के लिए एक बार जब आप नामस्थान अलग है, तो आप एक सर्कुलर निर्भरता टूट गए हैं। एक बार जब आप संतुष्ट हो जाते हैं तो आपका libA-dev अच्छा है, आप मॉड्यूल ए_dev.py -> moduleA.py और मॉड्यूल ए_डेवी -> मॉड्यूलए के सभी संदर्भों को आपके कोड में बदल सकते हैं।

+0

लेकिन वे अलग-अलग परियोजनाएं हैं, लीबैट का क्या अर्थ है? लिबटी लीबिया के एक स्थिर संस्करण का उपयोग करना चाहता है और यही वह है। मैं कभी भी अन्य कोड के साथ लिबटी के देव संस्करण का उपयोग नहीं करना चाहता, केवल डीवी-लीबिया – abyx

+0

का परीक्षण करने के लिए स्थिर लिबा के साथ स्थिर स्थिर लिबिट मैंने आशा व्यक्त की है कि मैं आपकी स्थिति को बेहतर तरीके से संबोधित करूं। – unutbu

1

"हम LibT का उपयोग कर LIBA परीक्षण करना चाहते हैं, लेकिन क्योंकि LibT LIBA पर निर्भर करता है, हम नहीं बल्कि यह LIBA की एक स्थिर संस्करण, LibT का परीक्षण करते समय उपयोग करने के लिए चाहते हैं"

यह भावना टी का उपयोग करने के लिए नहीं है + ए परीक्षण करने के लिए ए। क्या समझ में आता है निम्नलिखित है।

लीबा वास्तव में दो चीजें एक साथ मैश किए गए हैं: ए 1 और ए 2।

टी ए 1 पर निर्भर करता है।

वास्तव में क्या हो रहा है यह है कि आप टी और ए 1 का उपयोग करके ए 2 का उन्नयन और परीक्षण कर रहे हैं।

यदि आप लीबिया को उन हिस्सों में विघटित करते हैं जिन्हें टी की आवश्यकता होती है और अन्य भागों, तो आप इस परिपत्र निर्भरता को तोड़ने में सक्षम हो सकते हैं।

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