假设在这个例子中,如何在使用pytest执行测试套件时访问conftest fixture中的相应config.json文件。
$ pwd
/家庭/用户/回购/主
$ pytest testcases / project_(1/2)/ test_suite_(1/2).py。
答案 0 :(得分:1)
您可以通过keys = (first.keys + second.keys).uniq
keys.each do |key|
first[key] ||= nil
second[key] ||= nil
end
访问当前执行模块的路径,并构建相对于它的request.node.fspath
路径。 config.sjon
是由request
提供的固定装置。这是基于您提供的目录结构的示例。
pytest
如果您将上面的代码复制到# main/conftest.py
import json
import pathlib
import pytest
@pytest.fixture(autouse=True)
def read_config(request):
file = pathlib.Path(request.node.fspath)
print('current test file:', file)
config = file.with_name('config.json')
print('current config file:', config)
with config.open() as fp:
contents = json.load(fp)
print('config contents:', contents)
并使用conftest.py
运行测试,则应获得与此类似的输出:
-s
您可以通过将其返回到fixture中并使用fixture作为测试参数之一来访问已解析的JSON数据。我稍微修改了上面的夹具,因此返回解析后的数据并删除了$ pytest -sv
=============================== test session starts ===============================
platform linux -- Python 3.6.5, pytest-3.4.1, py-1.5.3, pluggy-0.6.0 -- /data/gentoo64/usr/bin/python3.6
cachedir: .pytest_cache
rootdir: /data/gentoo64/tmp/so-50329629, inifile:
collected 2 items
main/project1/test_one.py::test_spam
current file: /data/gentoo64/tmp/so-50329629/main/project1/test_one.py
current config: /data/gentoo64/tmp/so-50329629/main/project1/config.json
config contents: {'name': 'spam'}
PASSED
main/project2/test_two.py::test_eggs
current file: /data/gentoo64/tmp/so-50329629/main/project2/test_two.py
current config: /data/gentoo64/tmp/so-50329629/main/project2/config.json
config contents: {'name': 'eggs'}
PASSED
============================= 2 passed in 0.08 seconds ============================
:
autouse=True
现在只需在测试参数中使用fixture名称,该值将是fixture返回的值。例如:
@pytest.fixture
def json_config(request):
file = pathlib.Path(request.node.fspath.strpath)
config = file.with_name('config.json')
with config.open() as fp:
return json.load(fp)