簡體   English   中英

使用來自普通測試 function 的 pytest 夾具

[英]Using pytest fixture from common test function

我有一些基於unittest的代碼, 目前看起來像這樣

class TestMain(TestCase):
    def run_prog(self, args):
        with TemporaryFile() as stdout:
            old_stdout = sys.stdout
            try:
                main.main()
                stdout.seek(0)
                stdout_data = stdout.read()
            finally:
                sys.stdout = old_stdout
        return stdout_data

    def test_one(self):
        out = self.run_prog(...)

    def test_two(self):
        out = self.run_prog(...)

    def test_three(self):
        out = self.run_prog(...)

run_prog調用被測“主”程序並手動捕獲其標准輸出。

我正在將此項目轉換為pytest的過程中,但最后一塊已經突破了我對 pytest 燈具的理解的極限。

我了解 pytest 完全支持捕獲標准輸出/標准錯誤,我想利用它。

問題是,他們的示例在測試功能級別上工作:

def test_myoutput(capfd):
    do_something
    captured = capsys.readouterr()
    assert captured.out == "hello\n"
    assert captured.err == "world\n"

就我而言, run_prog被使用了 42 次,所以我嘗試使用從run_prog開始的夾具——理想情況下,調用函數不需要使用capsys / capfd

有沒有辦法從我的run_prog助手“調用”夾具? 還是我需要將capfd添加到所有 42 個測試並將其傳遞給run_prog

您可以定義一個自動使用夾具,它將CaptureFixture object(由capsys夾具返回)存儲為實例屬性:

class TestMain(TestCase):

    @pytest.fixture(autouse=True)
    def inject_capsys(self, capsys):
        self._capsys = capsys

    def run_prog(self, args):
        main.main()
        return self._capsys.out

    def test_out(self):
        assert self.run_prog('spam') == 'eggs'

TestMain.inject_capsys夾具將為每個測試重新運行,以保證測試隔離(沒有來自 test_one 的test_one將在test_two等中泄漏)。

這是hoefling 答案的一個細微變化,可以對capsys夾具的 scope 進行更多控制。

它使用request.getfixturevalue()在 function 調用時間檢索夾具:

import pytest
import sys

class TestMain:
    @pytest.fixture(autouse=True)
    def inject_request(self, request):
        self.request = request

    def run_prog(self, message):
        capfd = self.request.getfixturevalue('capfd')

        sys.stdout.write(message)

        captured = capfd.readouterr()
        assert captured.out == message

    def test_one(self):
        self.run_prog("Hello world!")

暫無
暫無

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

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