簡體   English   中英

在 pytest 中捕獲標准輸出中斷

[英]Capturing stdout breaks in pytest

令人討厭的是,我公司的某個人編寫了一個庫,其中包含將數據寫入標准輸出的函數。 我需要捕獲和使用這些數據,所以我寫了這個。

def capture_output(f):
    orig_stdout = sys.stdout
    sys.stdout = StringIO()
    f()
    output = sys.stdout.getvalue()
    sys.stdout.close()
    sys.stdout = orig_stdout
    return output

編輯:這不是為了測試。 我需要調用一個方法將一堆東西打印到標准輸出並將該數據作為字符串獲取(而不實際打印它)。 這就是capture_output方法的目的。 我不能使用capsys因為這是業務邏輯,而不是測試邏輯。

這是我的單元測試。

def test_capture_output(self):
    output = temp_logger.capture_output(lambda: print('Hello'))
    assert output == 'Hello\n'

一切都很好(測試通過),只要我像這樣調用 pytest:

pytest path/to/test.py

但如果我這樣稱呼它:

pytest

它運行了我們所有的測試,我的測試中斷了。

______________________________________________________________________________ TestTempLogger.test_capture_output ______________________________________________________________________________

self = <test_temp_logger.TestTempLogger testMethod=test_capture_output>

    def test_capture_output(self):
        output = temp_logger.capture_output(lambda: print('Hello'))
>       assert output == 'Hello\n'
E       AssertionError: assert '' == 'Hello\n'
E         + Hello

ppt/tests/tools/FIOLauncher/dependencies/test_temp_logger.py:35: AssertionError
------------------------------------------------------------------------------------- Captured stdout call -------------------------------------------------------------------------------------
Hello

我認為它與 pytest 捕獲寫入 stdout 的數據的方式有關,但我不明白為什么它會根據我的稱呼方式而有所不同。 我也找不到任何解決方法。

有誰知道這里發生了什么?

我正在使用 pytest 4.6.10(我可以訪問的最新版本)和 python 2.7.18(不幸的是)。

原來這是另一個測試有這條線。

sys.modules['sys'] = MagicMock()

關鍵是,沒有它,測試也能正常工作。

暫無
暫無

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

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