如何使用通用的 pytest 夹具作为上下文管理器?

How do I use a common pytest fixture as a context manager?

我有数百个测试脚本正在添加到我正在创建的 pytest 框架中。每个脚本都需要打开一个到我们正在测试的设备的连接,运行 一些任务并关闭。正在通过固定装置创建和关闭连接。还想补充一点,需要为 运行 的每个单独脚本建立新连接(即模块级别而不是范围或功能级别)。

我在与任务相同的文件中使用夹具进行处理。像这样。

my_test.py

...
@pytest.fixture(scope='module')
def setup(request):
    global connection
    with target.Connect() as connection:
        yield connection

    def teardown():
        connection.close
    request.addfinalizer(teardown)

@pytest.mark.usefixtures("setup")
def test_query_device_info():
    global connection
    connection.write('echo $PATH')
    connection.write('echo $HOME')
    ...

因为我有数百个测试,所以我不想为每个文件复制相同的代码,所以我需要一个可供每个测试使用的通用夹具。我已经尝试将此固定装置添加到 conftest.py 并且正在创建连接但是当它到达 connection.write 命令时失败。

conftest.py

...
@pytest.fixture
def setup(request):
    global connection
    with target.Connect() as connection:
        yield connection

    def teardown():
        connection.close
    request.addfinalizer(teardown)

my_test.py

...
@pytest.mark.usefixtures("setup")
def test_query_device_info():
    global connection
    connection.write('echo $PATH')

我怎样才能将这个固定装置放在我的所有测试都可以访问的公共位置,并正确地创建一个我可以在我的脚本中使用的连接?

请注意,这些是通过 pyCharm IDE 而不是直接在命令行上执行的。

框架已重新设计,连接是通过 class 完成的,该连接使用自动控制上下文的 __enter____exit__ 方法。