Почему регистрация с параметром pytest возвращает в журнале строки, инкремент для каждого параметра? - PullRequest
0 голосов
/ 26 февраля 2020

Я написал Python код, в котором я учусь использовать pytest и ведение журнала для теста, который я делаю. Я хочу отправить список параметров, через которые будет проходить функция pytest test_. Это мой код:

import pytest
import numpy as np
import logging

class TestClass:

    @pytest.fixture
    def initializeLogger(self):
        logger = logging.getLogger(__name__)
        logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s')

        file_handler = logging.FileHandler(r'C:\Users\user\Data\Cross correlation\RunLog.log')
        file_handler.setFormatter(formatter)

        logger.addHandler(file_handler)
        return logger

    # Define parameters
    params = []
    params.append({'no' : 1})
    params.append({'no' : 2})
    params.append({'no' : 3})



    @pytest.mark.parametrize("params", params)
    def test_ZeroI(self, initializeLogger, params):
        logger = initializeLogger
        read = params['no']
        logger.info(f'Value inputted: {read}, Value read: {read}')
        print('success')
        assert params['no'] == read

Я определил initializeLogger (self) как прибор pytest, который инициализируется перед вызовом моей основной тестовой функции: test_ZeroI (..).

Функция initializeLogger (self) просто инициализирует регистратор, и я присоединяю его к обработчику file_handler, который создает файл для меня. Затем я возвращаю регистратор.

Я создаю список с именем params и добавляю значения словаря с ключом «no» вместе со значениями, которые я хочу перебрать; поэтому в этом сценарии: 1, 2, 3.

тогда функция testZeroI () должна (по моему пониманию) запускаться три раза с параметрами 1, 2 и 3 соответственно по порядку. Я добавил строку: logger.info (f'Value inputted: {read}, Value read: {read} '), которая просто читает значение и выводит его в журнал.

Однако проблема в журнале, вот что я вижу:

INFO: module2: введено значение: 1, прочитано значение: 1 INFO: module2: введено значение: 2, Value прочитано: 2 INFO: module2: введено значение: 2, прочитано значение: 2 INFO: module2: введено значение: 3, прочитано значение: 3 INFO: module2: введено значение: 3, прочитано значение: 3 INFO: module2: введено значение: 3 , Значение читается: 3

Как видите, значение 1 записывается один раз. Значение 2 записывается дважды. Значение 3 записывается три раза. Что я делаю не так в своем коде? Моя цель состоит в том, чтобы мой код выводил журнал следующим образом:

INFO: module2: введенное значение: 1, считанное значение: 1 INFO: module2: введенное значение: 2, считанное значение: 2 INFO: module2: Value введено: 3, значение прочитано: 3

1 Ответ

1 голос
/ 26 февраля 2020

В вашем приборе initializeLogger вы звоните logger.addHandler(file_handler) каждый раз на один и тот же регистратор, поэтому вы получаете дополнительный регистратор каждый раз, когда используете прибор.

Вы можете убедиться, что код вызывается только один раз (например, с помощью одиночного кода, или поместить его в настройку класса), или удалить регистратор после использования.
Если вы используете прибор, вы можете сделайте:

@pytest.fixture
def get_logger():
    logger = logging.getLogger(__name__)
    ...
    logger.addHandler(file_handler)
    yield logger
    logger.handlers.clear()

или вы можете использовать setup / teardown, чтобы сделать то же самое:

class TestClass:

   def setup_method(self):
        self.logger = logging.getLogger(__name__)
        ...
        self.logger.addHandler(file_handler)

   def teardown_method(self):
       self.logger.handlers.clear()

Если вы хотите использовать один и тот же обработчик во время тестов, вы можете используйте инициализатор класса:

class TestClass:
   logger = None

   @classmethod
   def setup_class(cls):
       cls.logger = initializeLogger()

   @classmethod
   def teardown_class(cls):
       cls.logger.handlers.clear()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...