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