Python 以编程方式在pytest插件中注册设备

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

我正在寻找一种从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_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