2010-04-20 104 views
33

我使用py.test來測試我的python程序。我希望以正常方式(我的意思是代碼中使用pdb.set_trace())調試我的測試代碼,但是我無法使其工作。使用py.test以某種方式調試python調試器嗎?

在代碼中放置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

彼得,謝謝你的建議。 python -m pdb選項引導我完成腳本,但不調用函數,因此儘管對我的Python開發很有用,但我沒有看到如何使這一項工作。 我提到了--pdb選項,但是除非有人能想到如何使用它,否則我無法繼續使用它。 – Joel 2010-04-21 19:39:08

+0

我建議閱讀pdb手冊並學習擊鍵。 pdb將打印接下來要執行的功能。如果你輸入「s」,你將進入該功能。如果您鍵入「n」,這是默認值,那麼您只需轉到下一行代碼。當你想進入你的「主」程序時,很可能你打「n」而不是「s」。 – 2010-04-22 14:34:59

+2

這不是py.test的工作原理。小而有效的py.test測試代碼: def test_arithmetic: assert 2 + 2 == 4 這足以進行單元測試。沒有「main」例程,只是一個以「test_」開頭的函數。如果用普通的python運行它,它只會定義test_arithmetic,而不是運行它。但是py.test找到了以test_開頭的函數,併爲我運行它們,處理失敗的斷言等。 – Joel 2010-04-22 14:55:13

57

它是真實的簡單:把你想要在你的代碼開始調試一個assert 0和運行與測試:

py.test --pdb 

做:)

或者,如果你正在使用PYT est-2.0.1或更高版本,還有pytest.set_trace()幫助程序,您可以將它們放在測試代碼中的任何位置。這裏是docs。在將您發送到pdb調試器命令行之前,需要注意在內部禁用捕獲。

+0

如果您只想調試發生在assert中的事情,這非常棒。如果有一個py.test.set_trace()(它將重新啓用stdin並調用pdb.set_trace()(或類似的)),那也是很好的。assert 0的問題在於它不可能(AFAIK)在調試器中調用一個不會改變邏輯流的方法將會更好。 – 2010-08-05 19:39:54

+0

Hey Jason。我明白並且同意,應該有一個「py.test.pdb() 「或類似的東西,只要有或沒有」-s「。如果你提出問題,我會去實施它。 – hpk42 2010-09-03 14:38:28

+3

Hey Jason。我剛剛添加了py.test.set_trace(),參見http://bitbucket.org/hpk42/py-trunk/changeset/1d7b0838917f,你也許可以安裝開發版本,比如「pip install URL」,其中URL是這裏的zip文件:http://hudson.testrun。 org/view/pytest/job/py-trunk-sdist /(抱歉,似乎StackOverflow嚴重地截斷了URL,因此無法粘貼完整的URL) – hpk42 2010-10-06 12:53:25

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(而不是--pdb)。注意:您可以使用「-s」而不是「--capture = no」 – alfredodeza 2011-03-02 01:20:22

+1

多年以來,不再需要禁用捕獲。只需在運行堆棧中的某處添加您的'pdb.set_trace()'語句即可。 – 2016-08-10 18:40:39

12

最簡單的方法是使用py.test機制來創建斷點

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 

或者,如果你想pytest的調試器作爲一個內膽,改變你的import pdb; pdb.set_trace()import pytest; pytest.set_trace()

+0

'''import ipdb需要小編輯; ipdb.set_trace()''' – Michael 2016-05-09 19:43:31