如何测试入参为record类型的post_log_filter日志过滤函数
测试失败原因及修复方案
核心问题
你编写的预期返回False的测试用例错误使用了logging.Formatter构造测试参数,而post_log_filter需要接收logging.LogRecord实例作为入参,且需要实例的属性匹配过滤规则的键值对。
原函数的判断逻辑是检查record.__dict__是否包含过滤规则里的所有键值对,你传入的Formatter实例没有对应filename、funcName属性,因此判断永远不成立,测试始终返回True。
正确的测试用例构造方法
直接构造logging.LogRecord实例,手动设置和过滤规则匹配的属性即可,修改后的test_my_logging.py对应测试方法如下:
def test_post_log_filter_false(self): # 测试匹配第一条过滤规则的场景 record1 = logging.LogRecord( name=None, level=None, pathname=None, lineno=None, msg=None, args=None, exc_info=None ) record1.filename = 'basehttp.py' record1.funcName = 'log_message' self.assertEqual(False, post_log_filter(record1)) # 测试匹配第二条过滤规则的场景 record2 = logging.LogRecord( name=None, level=None, pathname=None, lineno=None, msg=None, args=None, exc_info=None ) record2.filename = 'options.py' record2.funcName = 'construct_change_message' self.assertEqual(False, post_log_filter(record2))
验证说明
修改后构造的LogRecord实例的__dict__会包含和过滤规则完全匹配的键值对,原函数的判断逻辑会命中,返回False,测试即可正常通过。
内容的提问来源于stack exchange,提问作者Dinesh Roy
相关产品推荐
相关产品推荐

