2016-12-30 9 views
0

Я хотел бы создать отдельный файл журнала для каждого тестового метода. И я хотел бы сделать это в файле conftest.py и передать экземпляр журнала для метода тестирования. Таким образом, всякий раз, когда я регистрирую что-то в методе тестирования, он записывается в отдельный файл журнала и будет очень легко анализироваться.pytest, реализующий файл журнала для каждого метода тестирования

Я пробовал следующее. Внутри conftest.py файла я добавил следующее:

logs_dir = pkg_resources.resource_filename("test_results", "logs") 
def pytest_runtest_setup(item): 
    test_method_name = item.name 
    testpath = item.parent.name.strip('.py') 
    path = '%s/%s' % (logs_dir, testpath) 
    if not os.path.exists(path): 
     os.makedirs(path) 
    log = logger.make_logger(test_method_name, path) # Make logger takes care of creating the logfile and returns the python logging object. 

Проблема здесь состоит в том, что pytest_runtest_setup не имеет возможности вернуть что-либо метода испытаний. По крайней мере, я не знаю об этом.

Итак, я подумал о создании метода fixture внутри файла conftest.py с помощью функции scope = "function" и вызывать это приспособление из методов тестирования. Но метод fixture не знает об объекте Pytest.Item. В случае метода pytest_runtest_setup он получает параметр item и используя это, мы можем узнать имя метода тестирования и путь метода тестирования.

Пожалуйста, помогите!

ответ

0

Я нашел ответ, который я искал. Я смог достигнуть этого с помощью функции scoped, подобной этой:

@pytest.fixture(scope="function") 
def log(request): 
    test_path = request.node.parent.name.strip(".py") 
    test_name = request.node.name 
    node_id = request.node.nodeid 
    log_file_path = '%s/%s' % (logs_dir, test_path) 
    if not os.path.exists(log_file_path): 
     os.makedirs(log_file_path) 
    logger_obj = logger.make_logger(test_name, log_file_path, node_id) 
    yield logger_obj 
    handlers = logger_obj.handlers 
    for handler in handlers: 
     handler.close() 
     logger_obj.removeHandler(handler)