2011-01-18 10 views
5

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

समस्या यह है कि लॉगिंग मॉड्यूल के बाद py.test द्वारा प्रदान की गई 'stdout'-object' पर संदेशों को लॉग करने का प्रयास कर रहा है, यह ऑब्जेक्ट py.test द्वारा छोड़ा गया है। जो है, मैं:

Traceback (most recent call last): 
    File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown 
    h.flush() 
    File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush 
    self.stream.flush() 
ValueError: I/O operation on closed file 

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

क्या कोई मुझे py.test के साथ stdlib लॉगिंग को एकीकृत करने का उचित तरीका बता सकता है?

(मैं this, जहां ऐसा लगता है कि यह सिर्फ मुद्दों के बिना काम करना चाहिए पर देख रहे हैं की कोशिश की, तो यह मुझे बहुत मदद नहीं की)

+0

आप हमें कैसे आप अपने py.test कोड चलाने दिखा सकता है? यदि ऐसा होता है तो यह होना चाहिए कि लॉगिंग कॉन्फ़िगर किया गया है और py.test से पहले प्रारंभ किया गया है, लेकिन यह तब नहीं होना चाहिए यदि आप py.test निष्पादन योग्य के माध्यम से कोड चलाते हैं। –

+0

मैं इसे मूल कमांड लाइन 'py.test' का उपयोग करके चलाता हूं और इसे चीजों को एकत्रित और चलाने देता हूं। – porgarmingduod

उत्तर

5

लॉगिंग/कब्जा बातचीत आगामी 2.0.1 रिलीज, आप से एक विकास स्नैपशॉट के रूप में पहले से ही स्थापित कर सकते हैं, जिसके साथ बेहतर काम करने के लिए कर रहे हैं जब आप बाद में "py.test --version" टाइप करते हैं। और आपके पोस्ट की समस्या/त्रुटि अब चली जाएगी।

पृष्ठभूमि का एक बिट: लॉगिंग पैकेज इसका उपयोग करने वाली धाराओं के "स्वामित्व" पर जोर देता है, और डिफ़ॉल्ट रूप से यह sys.stderr को पकड़ता है और अस्थिर मॉड्यूल के माध्यम से पंजीकृत प्रक्रिया से बाहर निकलने का आग्रह करता है। py.test स्नैपशॉट आउटपुट के लिए एक अस्थायी फ़ाइल के साथ sys.stdout को प्रतिस्थापित करता है (उप-प्रोसेस आउटपुट को पकड़ने के लिए फ़ाइल-डिस्क्रिप्टर स्तर पर आउटपुट सहित)। तो py.test हमेशा एक ही अस्थायी फ़ाइल का उपयोग करने के लिए बहुत सावधान रहने के लिए विकसित हुआ क्योंकि लॉगिंग के अचूक-कोड शिकायत नहीं है।

यह नहीं कि आप [pytest-capturelog] [1] प्लगइन भी इंस्टॉल कर सकते हैं जो लॉगिंग आउटपुट से निपटने के साथ कुछ और मदद करेगा।

[1] http://pypi.python.org/pypi/pytest-capturelog/0.7

+0

नया संस्करण ठीक काम करता है, धन्यवाद। मुझे आपकी 'पाइप ...' कमांड को काम करने के लिए नहीं मिला, लेकिन मैन्युअल रूप से पैकेज स्थापित किया गया। – porgarmingduod

+0

यह खुशी हुई। यह "पीआईपी" गुम है? अन्यथा शायद "-U" जोड़ना यह सुनिश्चित करने में मदद करेगा कि यह अपग्रेड हो जाएगा या उसी विकल्प के साथ वैकल्पिक टूल के रूप में "easy_install" का उपयोग करें। – hpk42

+0

मैंने पाइप स्थापित किया। निर्धारित के रूप में काम नहीं किया। Easy_install की कोशिश की, जो थोड़ा उलझन में था। इसलिए मैंने अभी पाई और पायस्टेस्ट के लिए ज़िपफाइल डाउनलोड किए हैं और उन्हें इंस्टॉल करने के लिए easy_install का उपयोग किया है। – porgarmingduod

-2

तुम सब करने की ज़रूरत है py.test को -s विकल्प पारित करने के लिए है , ताकि वह stdout पर कब्जा नहीं करेगा।

+0

"अगर मैं-साथ कैप्चरिंग बंद कर देता हूं, तो मुझे कोई समस्या नहीं है, लेकिन निश्चित रूप से परीक्षण आउटपुट अप्रासंगिक लॉगिंग के साथ अपठनीय बनाता है।" – porgarmingduod

+0

क्षमा करें, मैंने सोचा कि यह आपके लिए काम कर सकता है – rubik

3

यदि आपको py.test द्वारा ऑब्जेक्ट्स को त्यागने के बाद लॉगिंग कहीं भी नहीं जा रहा है, तो आप मॉड्यूल-स्तरीय चर logging.raiseExceptions से False को अपने मॉड्यूल या परीक्षणों में कहीं भी सेट कर सकते हैं।

यह लॉगिंग मॉड्यूल लॉगिंग उपप्रणाली में होने वाले अपवादों को निगल देगा। (उत्पादन प्रणालियों के लिए भी एक अच्छा अभ्यास है जहां आप लॉगिंग में त्रुटियों को अपने सिस्टम को क्रैश करने में नहीं चाहते हैं)

आप लॉगिंग आउटपुट को एक अलग फ़ाइल में सेट करने के लिए logging.basicConfig() का भी उपयोग कर सकते हैं। लेकिन शायद यह नहीं है कि आप क्या चाहते हैं।

pip install -i http://pypi.testrun.org pytest 

आपको कम से कम "2.0.1.dev9" मिलना चाहिए:

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