Доступ к устройству autouse без необходимости добавлять его в аргумент метода

У меня есть приспособление с привязкой к сеансу в conftest.py

@pytest.fixture(scope="session",autouse=True)
def log(request):
    testlog = LogUtil(testconf.LOG_NAME).get()
    return testlog

Он загружается и работает должным образом, если метод тестирования определен в mytest.py следующим образом:

def test_hello_world(self, log):
        log.info("hello world test")

Есть ли способ использовать прибор (поскольку его автозапуск включен) без необходимости добавлять дополнительный параметр «log» в методы тестирования?

def test_hello_world(self):
        log.info("hello world test") #log is not found

@pytest.mark.usefixtures("log")
def test_hello_world2(self):
        log.info("hello world test") #log is not found

def test_hello_world3(self,log):
        log.info("hello world test") #log object is accessible here

Ошибка - NameError: имя журнала не определено


person triji    schedule 03.05.2016    source источник


Ответы (2)


Обычно вы используете приспособления autouse, если хотите использовать их только для настройки / демонтажа.

Если вам нужен доступ к объекту, который возвращает прибор, вам нужно указать его в качестве аргумента, как в первом примере.

person The Compiler    schedule 05.05.2016
comment
Спасибо за ответ. Когда количество тестов начинает расти, становится громоздко добавлять аргументы к каждому тесту. На данный момент варианты выглядят так: 1) Создать глобальную переменную и обновить ее, используя приспособление, определенное в conftest.py 2) Создать базовый класс со статической переменной (приспособление не требуется) - person triji; 18.05.2016
comment
Я полностью согласен с tj23. Невозможность фактического доступа к приборам, неявно объявленная через autouse или usefixtures делает такие приспособления бесполезными для большинства целей - в моем случае для всех целей. Обычной альтернативой является (A) определение одного абстрактного прибора, требующего нескольких реальных приборов, а затем (B), когда тесты требуют первого, а не второго. В моем случае, однако, ограничения области фикстуры запрещают это. Ура! - person Cecil Curry; 25.05.2016
comment
Я не согласен - лично я также часто использую приборы, чтобы просто выполнить некоторую настройку / демонтаж (например, исправление) и на самом деле мне не нужен доступ к нему. Не могли бы вы пояснить, зачем вам нужно несколько реальных приборов и абстрактное приспособление? Какой у вас вариант использования? Возможно, нам стоит перенести это на средство отслеживания pytest. - person The Compiler; 25.05.2016
comment
@TheCompiler - вот мой вариант использования, я планирую иметь общий экземпляр регистратора, клиента http и клиента ssh для всех тестов. Итак, я добавил приспособления для их инициализации в conftest.py и сослался на них в тестах. Было бы неплохо просто добавить маркер использования фикстуры и начать использовать его в тестах, вместо того, чтобы добавлять его в качестве аргумента в каждый тестовый метод. - person triji; 02.06.2016
comment
Единственный способ, которым я могу себе представить, что это работает, - это pytest, внедряющий глобальные объекты в модуль и меняя их между каждым тестом ... что звучит болезненно и, вероятно, сломается с параллельным тестированием (pytest-xdist) и, возможно, некоторыми другими сценариями. - person The Compiler; 02.06.2016

Мы все еще имеем дело с приспособлением? Или это можно решить проще с помощью стандартной библиотечной процедуры?

common.py

import logging
import os

logger = logging.getLogger()
project_id = os.getenv('PROJECT_ID', 'maris-baccus')

test_stuff.py

from common import logger, project_id

def test_this():
    logger.info(f'This is the {project_id}')

Если у нас накопится много общих процедур, я думаю, мы поместим их в модуль и импортируем в наши тесты, как любую другую библиотеку.

person John Mee    schedule 16.04.2021