2016-01-10 8 views
7

में पाइथन (या पुनः लोड मॉड्यूल) को पुनरारंभ करें मेरे पास एक (python3) पैकेज है जिसमें init() एड (शायद सबसे अच्छा डिज़ाइन नहीं है, लेकिन फिर से लिखना एक विकल्प नहीं है) के आधार पर पूरी तरह से अलग व्यवहार है। मॉड्यूल केवल init() एड हो सकता है, दूसरी बार एक त्रुटि देता है। मैं py.test का उपयोग कर इस पैकेज (दोनों व्यवहार) का परीक्षण करना चाहता हूं।py.test परीक्षण

नोट: पैकेज की प्रकृति दो व्यवहारों को पारस्परिक रूप से अनन्य बनाती है, दोनों एकवचन कार्यक्रम में कभी भी नहीं चाहते हैं।

मेरे पास मेरी परीक्षण निर्देशिका में serveral test_xxx.py मॉड्यूल हैं। प्रत्येक मॉड्यूल पैकेज में जरूरतों को पूरा करेगा (फिक्स्चर का उपयोग कर)। चूंकि py.test एक बार पाइथन दुभाषिया शुरू करता है, इसलिए एक py.test रन में सभी टेस्ट-मॉड्यूल चलाना विफल रहता है।

दूसरे init() को अनुमति देने के लिए पैकेज बंदर-पैचिंग ऐसा कुछ नहीं है जो मैं करना चाहता हूं, क्योंकि आंतरिक कैशिंग आदि है जिसके परिणामस्वरूप अस्पष्ट व्यवहार हो सकता है।

  • यह संभव एक अलग अजगर प्रक्रिया में प्रत्येक परीक्षा मॉड्यूल (जिससे एक और परीक्षण मॉड्यूल में inits से प्रभावित नहीं किया जा रहा) को चलाने के लिए
  • वहाँ एक रास्ता मज़बूती से एक पैकेज को फिर से लोड करने के लिए है py.test बताने के लिए (है सभी उप-निर्भरताओं, आदि सहित)?
  • क्या कोई और समाधान है (मैं आयात करने के बारे में सोच रहा हूं और फिर एक स्थिरता में पैकेज को महत्वहीन नहीं कर रहा हूं, लेकिन यह अत्यधिक लगता है)?

    from imp import reload 
    import some_lib 
    #do something 
    reload(some_lib) 
    

    इसके अलावा, एक नई प्रक्रिया में प्रत्येक परीक्षा शुरू करने व्यवहार्य है, लेकिन multiprocessed कोड तरह की दर्दनाक है:

+0

मैं इसके साथ कोई अनुभव नहीं है, लेकिन आप का उपयोग करने के/कई subprocesses शुरू करने और चीजें हैं जो तरीके से करना इस प्लगइन अनुकूलन सक्षम हो सकता है: https://pytest.org/latest/xdist। html # running-test-in-a-python-subprocess –

+0

यदि एक फ़ाइल ('pytext text/text_xyz.py) पर pytest चलाने के लिए संभव है, तो आप test_xyz फ़ाइलों को खोजने के लिए एक प्रोग्राम लिख सकते हैं और प्रत्येक को चला सकते हैं subprocess मॉड्यूल के साथ अलग प्रक्रिया। यही कारण है कि शिमोन द्वारा संदर्भित प्लगइन करना चाहिए। –

+0

धन्यवाद। 'Pytest-xdist' पर देखा गया, दुर्भाग्य से प्रति मॉड्यूल एक नया उपप्रोसेस शुरू नहीं करता है। दरअसल, मेरे पास 2 निर्देशिकाओं में टेस्ट-मॉड्यूल हैं: एक जो इनटिंग का एक तरीका उपयोग करता है, दूसरा दूसरे का उपयोग करता है। फिर मैं प्रति निर्देशिका एक बार pytest चलाते हैं। हालांकि यह दुर्भाग्यपूर्ण है कि मुझे यह सुनिश्चित करने के लिए एक अतिरिक्त स्क्रिप्ट चाहिए कि व्यक्तिगत मूल्यों की वापसी मूल्य और परीक्षण रिपोर्ट संयुक्त हो जाएं। – Claude

उत्तर

1

एक मॉड्यूल को फिर से लोड करने के लिए, पुस्तकालय से reload() का उपयोग कर imp

उदाहरण कोशिश डीबग करने के लिए।

उदाहरण

import some_test 
from multiprocessing import Manager, Process 

#create new return value holder, in this case a list 
manager = Manager() 
return_value = manager.list() 
#create new process 
process = Process(target=some_test.some_function, args=(arg, return_value)) 
#execute process 
process.start() 
#finish and return process 
process.join() 
#you can now use your return value as if it were a normal list, 
#as long as it was assigned in your subprocess 
+0

मैं पायथन 3 का उपयोग कर रहा हूं इसलिए 'imp'' importlib' होना चाहिए। इस तरह से मॉड्यूल को फिर से लोड करना (दुर्भाग्य से) उस मॉड्यूल के लिए वैश्विक शब्दकोश को साफ़ नहीं करता है, इसलिए इससे मदद नहीं मिलती है। साथ ही यह उन सभी निर्भर मॉड्यूल को पुनः लोड नहीं करता है जिन्हें मैं डरता हूं।एक नई प्रक्रिया में प्रत्येक परीक्षण चलाना दिलचस्प लगता है लेकिन मुझे नहीं लगता कि यह 'py.test' के साथ कैसे जुड़ता है। इसके अलावा मुझे एक अलग परीक्षण में चलाने के लिए प्रत्येक * मॉड्यूल * की आवश्यकता होती है, प्रत्येक फ़ंक्शन नहीं। – Claude

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