[英]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.