как получить доступ к файлу json (тестовые данные, такие как config.json) в conftest.py - PullRequest
0 голосов
/ 14 мая 2018

Предположим, в этом примере, как получить доступ к соответствующему файлу config.json в приборах conftest при выполнении набора тестов с помощью pytest.

$ pwd

/ home /user / repo / main

$ pytest testcases / project_ (1/2) / test_suite_ (1/2) .py.

Структура каталогов:

  • main -
    • conftest.py # файл conftest для моих приборов
    • testcases
      • project_1 (содержит эти файлы - test_suite_1.py, config.json)
      • project_2 (содержит эти файлы - test_suite_2.py, config.json)
    • рабочие процессы
      • libs

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете получить доступ к пути выполняемого в данный момент модуля через 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, вы должны получить вывод, подобный следующему:

$ 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 ============================

Использовать проанализированные значения конфигурации

Вы можете получить доступ к проанализированным данным 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)

Теперь просто используйте имя прибора в аргументах теста, значение будет тем, что возвращает прибор. например:

def test_config_has_foo_set_to_bar(json_config):
    assert json_config['foo'] == 'bar'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...