根据 py.test (testinfra) 检查输出设置变量
Set a variable based on a py.test (testinfra) check output
我正在尝试使 testinfra 测试文件更具可移植性,我想使用单个文件来处理 prod/dev 或测试环境的测试。
为此,我需要从远程测试机器获取一个值,我通过 :
def test_ACD_GRAIN(host):
grain = host.salt("grains.item", "client_NAME")
assert grain['client_NAME'] == "test"
我需要在测试文件的不同部分使用这个 grain['client_NAME']
值,因此我想将它存储在一个变量中。
无论如何都要这样做?
有很多方法可以在测试之间共享状态。仅举几例:
使用 session-scoped 夹具
定义一个具有计算值的会话范围的夹具。它将在第一个使用它的测试 运行s 之前执行,然后将被缓存用于整个测试 运行:
# conftest.py
@pytest.fixture(scope='session')
def grain():
host = ...
return host.salt("grains.item", "client_NAME")
只需使用夹具作为测试中的输入参数来访问值:
def test_ACD_GRAIN(grain):
assert grain['client_NAME'] == "test"
使用 pytest
命名空间
定义一个具有会话作用域的自动装置,因此每个会话自动应用一次并将值存储在 pytest
命名空间中。
# conftest.py
import pytest
def pytest_namespace():
return {'grain': None}
@pytest.fixture(scope='session', autouse=True)
def grain():
host = ...
pytest.grain = host.salt("grains.item", "client_NAME")
它将在第一个测试运行之前执行。在测试中,只需调用 pytest.grain
即可获取值:
import pytest
def test_ACD_GRAIN():
grain = pytest.grain
assert grain['client_NAME'] == "test"
pytest
缓存:在测试 运行s
之间重用值
如果值在测试 运行s 之间没有变化,你甚至可以持久化在磁盘上:
@pytest.fixture
def grain(request):
grain = request.config.cache.get('grain', None)
if not grain:
host = ...
grain = host.salt("grains.item", "client_NAME")
request.config.cache.set('grain', grain)
return grain
现在测试不需要重新计算不同测试 运行 的值,除非您清除磁盘上的缓存:
$ pytest
...
$ pytest --cache-show
...
grain contains:
'spam'
重新运行带有--cache-clear
标志的测试删除缓存并强制重新计算值。
我正在尝试使 testinfra 测试文件更具可移植性,我想使用单个文件来处理 prod/dev 或测试环境的测试。 为此,我需要从远程测试机器获取一个值,我通过 :
def test_ACD_GRAIN(host):
grain = host.salt("grains.item", "client_NAME")
assert grain['client_NAME'] == "test"
我需要在测试文件的不同部分使用这个 grain['client_NAME']
值,因此我想将它存储在一个变量中。
无论如何都要这样做?
有很多方法可以在测试之间共享状态。仅举几例:
使用 session-scoped 夹具
定义一个具有计算值的会话范围的夹具。它将在第一个使用它的测试 运行s 之前执行,然后将被缓存用于整个测试 运行:
# conftest.py
@pytest.fixture(scope='session')
def grain():
host = ...
return host.salt("grains.item", "client_NAME")
只需使用夹具作为测试中的输入参数来访问值:
def test_ACD_GRAIN(grain):
assert grain['client_NAME'] == "test"
使用 pytest
命名空间
定义一个具有会话作用域的自动装置,因此每个会话自动应用一次并将值存储在 pytest
命名空间中。
# conftest.py
import pytest
def pytest_namespace():
return {'grain': None}
@pytest.fixture(scope='session', autouse=True)
def grain():
host = ...
pytest.grain = host.salt("grains.item", "client_NAME")
它将在第一个测试运行之前执行。在测试中,只需调用 pytest.grain
即可获取值:
import pytest
def test_ACD_GRAIN():
grain = pytest.grain
assert grain['client_NAME'] == "test"
pytest
缓存:在测试 运行s
之间重用值
如果值在测试 运行s 之间没有变化,你甚至可以持久化在磁盘上:
@pytest.fixture
def grain(request):
grain = request.config.cache.get('grain', None)
if not grain:
host = ...
grain = host.salt("grains.item", "client_NAME")
request.config.cache.set('grain', grain)
return grain
现在测试不需要重新计算不同测试 运行 的值,除非您清除磁盘上的缓存:
$ pytest
...
$ pytest --cache-show
...
grain contains:
'spam'
重新运行带有--cache-clear
标志的测试删除缓存并强制重新计算值。