Python 以编程方式在pytest插件中注册设备
我正在寻找一种从Python运行一些pytest单元测试并动态注册pytest装置的方法。如Pytest文档中所述,以编程方式运行测试时。我有以下设置 validation.py包含要运行的测试Python 以编程方式在pytest插件中注册设备,python,pytest,python-unittest,Python,Pytest,Python Unittest,我正在寻找一种从Python运行一些pytest单元测试并动态注册pytest装置的方法。如Pytest文档中所述,以编程方式运行测试时。我有以下设置 validation.py包含要运行的测试 def test_valid(new_fixture): assert new_fixture > 0 它是用, import pytest new_fixture_value = 36 class FixtureRegPlugin(object): def pytest_s
def test_valid(new_fixture):
assert new_fixture > 0
它是用,
import pytest
new_fixture_value = 36
class FixtureRegPlugin(object):
def pytest_sessionstart(self):
print('Test session start')
@pytest.fixture
def new_fixture():
return new_fixture_value
pytest.main(['-sv', './validation.py'], plugins=[FixtureRegPlugin()])
这里,我们使用一个自定义插件在validation.py中运行测试,该插件为pytest_sessionstart注册一个钩子。这个钩子在测试会话开始时执行,我可以看到预期的打印输出。但是,新的_fixture没有注册,因此测试失败,出现fixture not found错误
我们的目标是在运行时修改fixture的结果,因此我不能将其定义放在validation.py中。您有什么理由不想在文件中使用@pytest.fixturescope='session'而不是编写自己的插件?这能实现您所寻找的在运行时修改fixture的功能吗 在任何情况下,如果您更改缩进并将self添加到新的_fixture的参数中,它应该会起作用
@pytest.fixture
def new_fixture():
return new_fixture_value
到
您可以在命令行上使用-setup show查看安装和拆卸
script.py的内容:
validation.py的内容:
运行python script.py:
有什么理由不想在文件中使用@pytest.fixturescope='session'而不是编写自己的插件?这能实现您所寻找的在运行时修改fixture的功能吗 在任何情况下,如果您更改缩进并将self添加到新的_fixture的参数中,它应该会起作用
@pytest.fixture
def new_fixture():
return new_fixture_value
到
您可以在命令行上使用-setup show查看安装和拆卸
script.py的内容:
validation.py的内容:
运行python script.py:
太好了,谢谢!将fixture定义为插件的方法正是我想要的。你能把你的答案简化一点,这样对其他人更有好处吗?我会接受的。i、 e.a缩进的变化不清楚,最好用FixtureRegPlugin的外观来代替它,说明它应该是一种方法。b-setup show很有用,但是pytest.fixturescope='function'等有点超出范围,最好删除它们,如果可能,使用相同的验证。py c顶部的问题应该是一个注释。否则,非常感谢!太好了,谢谢!将fixture定义为插件的方法正是我想要的。你能把你的答案简化一点,这样对其他人更有好处吗?我会接受的。i、 e.a缩进的变化不清楚,最好用FixtureRegPlugin的外观来代替它,说明它应该是一种方法。b-setup show很有用,但是pytest.fixturescope='function'等有点超出范围,最好删除它们,如果可能,使用相同的验证。py c顶部的问题应该是一个注释。否则,非常感谢!
import pytest
class FixtureRegPlugin(object):
@pytest.fixture(scope='session')
def session_fixture(self):
pass
@pytest.fixture(scope='module')
def module_fixture(self):
pass
@pytest.fixture(scope='function')
def function_fixture(self):
pass
pytest.main(['--setup-show', './validation.py'], plugins=[FixtureRegPlugin()])
def test_A(session_fixture, module_fixture, function_fixture):
pass
def test_B(session_fixture, module_fixture, function_fixture):
pass
Test session start
=================================== test session starts
platform linux -- Python 3.6.2, pytest-3.2.2, py-1.4.34, pluggy-0.4.0
rootdir: /home/stackoverflow, inifile:
collected 2 items
validation.py
SETUP S session_fixture
SETUP M module_fixture
SETUP F function_fixture
validation.py::test_A (fixtures used: function_fixture, module_fixture, session_fixture).
TEARDOWN F function_fixture
SETUP F function_fixture
validation.py::test_B (fixtures used: function_fixture, module_fixture, session_fixture).
TEARDOWN F function_fixture
TEARDOWN M module_fixture
TEARDOWN S session_fixture
=================================== 2 passed in 0.00 seconds