Как я могу получить имя модуля автоматически из __init__.py или conftest.py? - PullRequest
0 голосов
/ 03 июня 2019

Я выполняю несколько тестов в пакете тестов и хочу напечатать каждое имя модуля в пакете без дублирования кода. Итак, я хотел вставить некоторый код в __init__.py или conftest.py, который даст мне имя исполняемого модуля. Допустим, мои тестовые модули называются: checker1, checker2 и т.д ...

Моя структура каталогов выглядит так:

tests_dir/
├── __init__.py
├── conftest.py
├── checker1
├── checker2
└── checker3

Итак, внутри __init__.py Я попытался вставить:

def module_name():
    return os.path.splitext(__file__)[0]

Но он все равно дает мне __init__.py из каждого файла, когда я его вызываю.

Я также пытался использовать прибор внутри conftest.py, например:

@pytest.fixture(scope='module')
def module_name(request):
    return request.node.name

Но, похоже, мне все еще нужно определить функцию внутри каждого модуля, чтобы получить module_name в качестве параметра.

Каков наилучший способ заставить это работать?

Edit:

В конце концов, то, что я сделал, объясняется здесь:

conftest.py

@pytest.fixture(scope='module', autouse=True)
def module_name(request):
    return request.node.name

пример для тестового файла с тестовой функцией. То же самое нужно добавить к каждому файлу и каждой функции:

checker1.py

from conftest import *

def test_columns(expected_res, actual_res, module_name):
    expected_cols = expected_res.columns
    actual_cols = actual_res.columns

    val = expected_cols.difference(actual_cols)  # verify all expected cols are in actual_cols
    if not val.empty:
        log.error('[{}]: Expected columns are missing: {}'.format(module_name, val.values))
    assert val.empty

Обратите внимание на прибор module_name, который я добавил к параметрам функции.

  • Ожидаемые_рес и Фактические_рес - панды Dataframes из файла Excel.
  • log - это Logger объект из logging пакета

1 Ответ

0 голосов
/ 03 июня 2019

В каждом модуле (checker1, checker2, checker3, conftest.py) в основной функции выполните

print(__name__)

Когда файл __init__.py импортирует эти пакеты, он должен напечатать имя модуля вдольс ним.

Исходя из вашего комментария, вы, возможно, можете изменить поведение в файле __init__.py для локального импорта.

__init.py__

import sys, os
sys.path.append(os.path.split(__file__)[0])

def my_import(module):
    print("Module name is {}".format(module))
    exec("import {}".format(module))

testerfn.py

print(__name__)
print("Test")

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

tests_dir/
├── __init__.py
└── testerfn.py

Команда для проверки

import tests_dir
tests_dir.my_import("testerfn")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...