код Python модульного теста, который читает configparser из файла конфигурации - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в модульном тестировании Python.Я узнал и сделал пример модульного теста, где метод принимает ввод и возвращает вывод.

Но для кода, упомянутого ниже, у меня есть несколько вопросов.

  1. Как мне сменить configparser метода init в unittest?Путь /config/program.cfg находится на рабочем сервере и не существует в каталоге dev.Файл program.cfg существует в другом месте в каталоге кода.Есть ли способ справиться с этим в unittest?
  2. Как я могу отправить или пропустить что-то вроде жестко закодированного пути в unittest, например /var/log/info_server.log
  3. Если возможно, не могли бы вы сказать мне, как бы вы написали unittest для нижекод с использованием модуля Pytest?Это будет полезно для понимания потока, и я могу сделать это с остальным кодом.

    def __init__(self):
        self.setup_logger()
    
        # Read config parameters
        config = configparser.ConfigParser()
        config.read("/config/program.cfg")
        self.host_ip = config.get('default','HostIP')
        self.redis_ip = config.get('default','RedisIP')
        self.redis_port = config.get('default','RedisPort')
        self.info_port = config.get('default','InfoPort')
        self.sqlite_db_file = config.get('default','SQLiteDbFile')
    
        self.connect_redis()
    
    def setup_logger(self):
        #Initialize logger
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.INFO)
    
        # Create a file handler
        handler = logging.FileHandler('/var/log/info_server.log')
        handler.setLevel(logging.INFO)
    
        # Create a logging format
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
    
        # Add the handlers to the logger
        self.logger.addHandler(handler)
    
    def connect_redis(self):
        # Start up a Redis instance
        self.logger.info("Start Redis instance")
        self.ad_info = redis.StrictRedis(host=self.redis_ip, port=self.redis_port, db=0)
    
        if self.ad_info is None:
            self.logger.error("Failed to start Redis instance")
        else:
            self.logger.info("Started Redis instance")
    

1 Ответ

0 голосов
/ 22 сентября 2018

Конечно, мы могли бы издеваться над многими вещами, но простая перефакторизация тестируемого класса, добавление config и log сделает жизнь намного проще.

def __init__(self, cfg='/config/program.cfg', log='/var/log/info_server.log'):

На сервере разработки, где /config/program.cfg нет, вы можете просто

TheClass(cfg='~/dev.cfg', log='/tmp/dev.log')

self.server_obj.connect_redis() log_mock.logger.info.assert_called_with('Started Redis instance') не работать

import logging
logging.getLogger

# <function getLogger at 0x7f3d2ed427b8>
logger = logging.getLogger()
type(logger)
# <class 'logging.RootLogger'>
logger.info
# <bound method Logger.info of <RootLogger root (WARNING)>>

Патч должен выглядеть примерно так:

with mock.patch.object(logging.RootLogger, 'info') as mock_info:

    server_obj = Server(cfg='sth', log='sth')
    mock_info.assert_called_with('xxx')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...