簡體   English   中英

如何將stdlib日志記錄與py.test結合使用

[英]How can I combine stdlib logging with py.test

我正在使用py.test來測試我的一些模塊,其中包含相當多的stdlib日志記錄。 我當然喜歡將日志記錄到stdout,這是由py.test捕獲的,這樣如果測試失敗,我將獲得所有相關的日志消息。

這樣做的問題是,在py.test丟棄此對象之后 ,日志記錄模塊最終嘗試將消息記錄到py.test提供的'stdout'對象。 也就是說,我得到:

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關閉捕獲,我沒有任何問題,但當然這使得測試輸出與無關的日志記錄無法讀取。

誰能告訴我將stdlib日志記錄與py.test集成的正確方法?

(我試着看看這個 ,它看起來應該只是沒有問題,所以它對我幫助不大)

記錄/捕獲交互是為了更好地處理即將發布的2.0.1版本,您可以通過以下方式將其作為開發快照安裝:

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

之后輸入“py.test --version”時,你應該至少得到“2.0.1.dev9”。 而你發布的問題/錯誤現在應該消失了。

一點背景:日志包堅持“擁有”它使用的流,默認情況下它抓取sys.stderr並堅持在進程退出時關閉它,通過atexit模塊注冊。 py.test用一個臨時文件替換sys.stdout以便快照輸出(包括在文件描述符級別的輸出以便也捕獲子進程輸出)。 所以py.test進化到非常小心,總是使用相同的臨時文件,因為沒有日志記錄的atexit-code抱怨。

並不是說你也可以安裝[pytest-capturelog] [1]插件,這將有助於處理日志輸出。

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

如果您不介意在py.test丟棄對象之后無法進行日志記錄,則可以在模塊或測試的早期將模塊級變量logging.raiseExceptionsFalse

這將使日志記錄模塊吞下日志記錄子系統中發生的異常。 (對於生產系統而言,這是一個很好的做法,您不希望在日志記錄中出現錯誤導致系統崩潰

您還可以使用logging.basicConfig()將日志記錄輸出設置為單獨的文件。 但這可能不是你想要的。

您需要做的就是將-s選項傳遞給py.test,以便它不會捕獲stdout。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM