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