【问题标题】:How do I use a common pytest fixture as a context manager?如何使用常见的 pytest 夹具作为上下文管理器?
【发布时间】:2018-09-20 17:43:14
【问题描述】:

我将数百个测试脚本添加到我正在创建的 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 执行的,而不是直接在命令行上执行的。

【问题讨论】:

  • 您是否考虑过将测试放入具有setup_methodteardown_method 的类中?
  • 是的,但是在我们正在运行的某些任务和数百个文件中遇到了一些问题,我想要一个通用的设置和拆卸。
  • 为什么不直接将setup 夹具作为测试参数传递? def test_query_device_info(setup): setup.write('echo $PATH')
  • 这可行,但我的示例可能过于简单。作为测试的一部分,我们可能有几十个函数都将使用相同的连接来执行,因此我需要它在模块级别而不是函数级别运行。
  • 当您说run at module level 时,您的意思是只运行一次您的代码吗?会话/模块范围的夹具不适合?

标签: python pytest fixtures


【解决方案1】:

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

【讨论】:

  • 这到底是什么意思?
  • 自从我从事这个工作已经有一段时间了,如果工作的话,我们已经从这种类型继续前进了,但基本上,我们使用了一个 x 为 y 的上下文:在上下文中做某事在上下文之外做其他事情我们想对类做点什么,我找到了 2 种方法(列出)来处理这个问题。当您使用“class”运行时,它会在 enter 方法中执行evertyhing,而当上下文关闭时,它会在 exit 方法中执行所有内容。你可以在这里看到一个很好的例子/答案stackoverflow.com/questions/1984325/…
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2013-05-22
相关资源
最近更新 更多