如何访问 conftest.py 中的 json 文件(测试数据,如 config.json)

Sun*_*mar 1 python testing pytest

假设在这个例子中,如何config.jsonconftest使用pytest.

$ pwd
/home/user/repo/main
$ pytest  testcases/project_(1/2)/test_suite_(1/2).py
Run Code Online (Sandbox Code Playgroud)

目录结构:

??? main
?  ??? conftest.py  # conftest file for my fixtures
?  ??? testcases     
?     ??? project_1
?     ?   (contains these files --  test_suite_1.py, config.json)
?     ??? project_2
?         (contains these files -- test_suite_2.py, config.json)
??? workflows
?  ??? libs 
Run Code Online (Sandbox Code Playgroud)

hoe*_*ing 5

您可以通过访问当前执行的模块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)
Run Code Online (Sandbox Code Playgroud)

如果您将上面的代码复制到您的conftest.py并使用 运行测试-s,您应该得到类似于以下的输出:

$ 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 ============================
Run Code Online (Sandbox Code Playgroud)

使用解析的配置值

您可以通过在夹具中返回它并使用夹具作为测试参数之一来访问解析的 JSON 数据。我从上面稍微修改了夹具,以便它返回解析的数据并删除autouse=True

@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)
Run Code Online (Sandbox Code Playgroud)

现在只需在测试参数中使用夹具名称,该值将是夹具返回的值。例如:

def test_config_has_foo_set_to_bar(json_config):
    assert json_config['foo'] == 'bar'
Run Code Online (Sandbox Code Playgroud)