如何使用pytest测试日志输出是否包含指定颜色代码?
可以实现这类测试,修改方法如下
caplog默认不会自动复用你自定义Logger中的带颜色格式化器,它捕获的日志文本用的是默认格式,所以直接断言颜色代码会失败。解决思路是让caplog使用和你的Logger一致的格式化规则,或者手动格式化日志记录来验证。
方法一:给caplog配置相同的格式化器
修改测试代码,将自定义Logger的格式化器赋值给caplog的handler:
class TestLogging: def test_colour(self, caplog): logger = Logger('pytest', verbose=True, use_colour=True).logger # 将自定义Logger的格式化器应用到caplog的所有handler target_formatter = logger.handlers[0].formatter for handler in caplog.handlers: handler.setFormatter(target_formatter) with caplog.at_level(logging.DEBUG): logger.debug('Test debug colour') assert '\33[035mDEBUG\33[0m' in caplog.text
方法二:手动格式化caplog捕获的记录
直接取出caplog的日志记录,用你自定义的格式化器来生成带颜色的文本,再做断言:
class TestLogging: def test_colour(self, caplog): logger = Logger('pytest', verbose=True, use_colour=True).logger formatter = logger.handlers[0].formatter with caplog.at_level(logging.DEBUG): logger.debug('Test debug colour') # 用自定义格式化器处理捕获到的日志记录 formatted_log = formatter.format(caplog.records[0]) assert '\33[035mDEBUG\33[0m' in formatted_log
关键前提
确保你的Logger类在use_colour=True时,确实给handler配置了带颜色的格式化器,比如:
class Logger: def __init__(self, name, verbose=False, use_colour=False): self.logger = logging.getLogger(name) self.logger.setLevel(logging.DEBUG if verbose else logging.INFO) self.logger.handlers.clear() # 清空默认handler避免重复输出 formatter = self._get_coloured_formatter() if use_colour else logging.Formatter('%(levelname)s: %(message)s') handler = logging.StreamHandler() handler.setFormatter(formatter) self.logger.addHandler(handler) def _get_coloured_formatter(self): # 定义带颜色的日志格式 fmt = '\33[035m%(levelname)s\33[0m: %(message)s' return logging.Formatter(fmt)
内容的提问来源于stack exchange,提问作者David Gard
相关产品推荐
相关产品推荐

