簡體   English   中英

具有從配置文件讀取configparser的單元測試python代碼

[英]unit test python code that has configparser reading from config file

我是python單元測試的新手。 我學習並進行了樣本單元測試,其中方法接受輸入並返回輸出。

但是對於下面提到的代碼,我有一些疑問。

  1. 如何在unittest中模擬init方法的configparser? 路徑/config/program.cfg在生產服務器上,在dev目錄中不存在。 program.cfg文件位於代碼目錄中的其他位置。 有沒有辦法在單元測試中處理呢?
  2. 我如何在unittest中發送或跳過類似硬編碼路徑的內容,例如/var/log/info_server.log
  3. 如果可能的話,能否請您告訴我如何使用pytest模塊為以下代碼編寫unittest? 這將有助於理解流程,我可以使用其余的代碼來做到這一點。

     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") 

當然,我們可以模擬很多事情,但是簡單地重構所測試的類,添加配置和日志,將使工作變得更加輕松。

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM