2010-04-20 5 views
33

मैं अपने पायथन प्रोग्राम की इकाई परीक्षण के लिए py.test का उपयोग कर रहा हूं। मैं अपने टेस्ट कोड को पाइथन डीबगर के साथ सामान्य तरीके से डीबग करना चाहता हूं (जिसके द्वारा मुझे कोड में pdb.set_trace() का मतलब है) लेकिन मैं इसे काम नहीं कर सकता।क्या मैं किसी भी तरह py.test का उपयोग करते समय पाइथन डीबगर के साथ डीबग कर सकता हूं?

कोड में pdb.set_trace() डालना काम नहीं करता है (IOError उठाता है: आउटपुट कैप्चर करते समय stdin से पढ़ना)। मैंने विकल्प - pdb के साथ py.test चलाने का भी प्रयास किया है, लेकिन अगर मैं यह जानना चाहता हूं कि मेरे दावे से पहले क्या होता है तो यह चाल नहीं लगता है। जब कोई दावा विफल हो जाता है तो यह टूट जाता है, और उस रेखा से आगे बढ़ने का अर्थ प्रोग्राम को समाप्त करना है।

क्या कोई डिबगिंग पाने का तरीका जानता है, या डिबगिंग और py.test सिर्फ एक साथ रहने का मतलब नहीं है?

उत्तर

0

मैं py.test से परिचित नहीं हूं, अनजान के लिए रखो, आप निम्न कार्य करते हैं। हो सकता है कि py.test समान है:

अपने परीक्षण मॉड्यूल में (mytestmodule.py):

if __name__ == "__main__": 
    unittest.main(module="mytestmodule") 

फिर

python -m pdb mytestmodule.py 

आप एक इंटरैक्टिव pdb खोल मिल जाएगा के साथ परीक्षण चलाते हैं।

डॉक्स को देखते हुए, यह लग रहा है py.test एक --pdb कमांड लाइन विकल्प है की तरह:

http://codespeak.net/py/dist/test/features.html

+0

पीटर, आपके सुझावों के लिए धन्यवाद। पायथन-एम पीडीबी विकल्प मुझे स्क्रिप्ट के माध्यम से चलता है लेकिन कार्यों को कॉल नहीं करता है, इसलिए मेरे पायथन विकास के लिए उपयोगी है, लेकिन मैं नहीं देखता कि मैं यह कैसे काम कर सकता हूं। मैंने --pdb विकल्प का उल्लेख किया है, लेकिन जब तक कोई इसका उपयोग नहीं कर सकता है, तो मैं इसके साथ आगे नहीं जा सकता। – Joel

+0

मैं पीडीबी पर मैनुअल पढ़ने और कीस्ट्रोक सीखने का सुझाव देता हूं। पीडीबी उस फंक्शन को प्रिंट करेगा जो अगले निष्पादित करेगा। यदि आप "एस" टाइप करते हैं, तो आप उस फ़ंक्शन में कदम उठाएंगे। यदि आप "n" टाइप करते हैं, जो डिफ़ॉल्ट है, तो आप केवल कोड की अगली पंक्ति पर जाते हैं।जब आप अपने "मुख्य" दिनचर्या में कदम उठाना चाहते हैं तो यह बहुत संभव है कि आप "एस" के बजाय "n" मार रहे हों। –

+2

ऐसा नहीं है कि py.test कैसे काम करता है। Py.test के लिए छोटे लेकिन वैध परीक्षण कोड: def test_arithmetic: 2 + 2 == 4 पर एक इकाई परीक्षण करने के लिए पर्याप्त है। कोई "मुख्य" दिनचर्या, केवल एक फ़ंक्शन जो "test_" से शुरू होता है। यदि इसे सामान्य पायथन के साथ चलाया जाता है, तो यह केवल test_arithmetic को परिभाषित करेगा, इसे चलाने के लिए नहीं। लेकिन py.test test_ के साथ शुरू होने वाले कार्यों को पाता है और उन्हें मेरे लिए चलाता है, असफल आवेषण आदि का ख्याल रखता है। – Joel

57

यह असली सरल है: एक assert 0 जहाँ आप अपने कोड में डिबगिंग शुरू करना चाहते डाल दिया और चलाने के अपने साथ परीक्षण:

py.test --pdb 

किया :)

वैकल्पिक रूप से, अगर आप pyt उपयोग कर रहे हैं अनुमान-2.0.1 या उससे ऊपर, pytest.set_trace() सहायक भी है जिसे आप अपने परीक्षण कोड में कहीं भी डाल सकते हैं। यहां docs हैं। यह आपको पीडीबी डीबगर कमांड लाइन पर भेजने से पहले कैप्चरिंग को आंतरिक रूप से अक्षम करने का ख्याल रखेगा।

+0

यह बहुत अच्छा है अगर आप केवल डीबग करना चाहते हैं जो जोर से होता है। यह भी अच्छा होगा अगर कोई py.test.set_trace() था (जो stdin को पुनः सक्षम करेगा और pdb.set_trace() (या इसी तरह) का आह्वान करेगा। Assert 0 के साथ समस्या यह है कि यह संभव नहीं है (AFAIK) अपवाद को दबाएं और डीबगर के साथ काम करने के लिए आगे बढ़ें। एक विधि जो डीबगर को आमंत्रित करती है जो तर्क प्रवाह को परिवर्तित नहीं करती है, –

+0

हे जेसन। मैं देखता हूं और सहमत हूं। "py.test.pdb() होना चाहिए "या ऐसा कुछ ऐसा है जो" -s "के साथ या उसके बिना काम करता है। अगर आप कोई समस्या दर्ज करते हैं, तो मैं इसे लागू करने के लिए देखूंगा। – hpk42

+3

हे जेसन। मैंने अभी py.test.set_trace() देखा है, देखें http://bitbucket.org/hpk42/py-trunk/changeset/1d7b0838917f और आप "पीआईपी इंस्टॉल यूआरएल" जैसे विकास संस्करण को स्थापित करने में सक्षम हो सकते हैं, जहां यूआरएल ज़िप फ़ाइल है: http: //hudson.testrun। संगठन/दृश्य/पायस्टेस्ट/जॉब/पीई-ट्रंक-एसडीआईस्ट/(क्षमा करें, लगता है कि स्टैक ओवरफ्लो यूआरएल को बुरी तरह से मिटा देता है, इसलिए पूर्ण यूआरएल पेस्ट नहीं कर सकता) – hpk42

22

मुझे पता चला कि मैं कैप्चर अक्षम के साथ py.test चला सकता हूं, फिर सामान्य रूप से pdb.set_trace() का उपयोग करें।

> py.test --capture=no 
============================= test session starts ============================== 
platform linux2 -- Python 2.5.2 -- pytest-1.3.3 
test path 1: project/lib/test/test_facet.py 

project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something() 
-> code_about_to_run('') 
(Pdb) 
+2

यह बिल्कुल ठीक है कि मैंने पीडीबी (बजाय --pdb) कैसे सेट किया है। नोट: आप "--capture = no" – alfredodeza

+1

के बजाय "-s" का उपयोग कर सकते हैं अब कई वर्षों से, अब कैप्चर को अक्षम करने के लिए आवश्यक नहीं है। रन स्टैक में बस अपना 'pdb.set_trace() 'कथन जोड़ें। –

12

सबसे आसान तरीका है ब्रेकप्वाइंट बनाने के लिए

http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace

import pytest 
def test_function(): 
    ... 
    pytest.set_trace() # invoke PDB debugger and tracing 

py.test प्रणाली का उपयोग कर या यदि आप एक एक लाइनर के रूप में pytest के डिबगर चाहते हैं, में अपने import pdb; pdb.set_trace() बदल import pytest; pytest.set_trace()

+0

'' 'आयात ipdb के लिए आवश्यक छोटे संपादन; ipdb.set_trace()' '' – Michael

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

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