为什么在调用setLevel之后,单元测试中的python记录器无法正常工作

时间:2017-11-29 01:57:00

标签: python logging python-unittest

我的using valType = std::variant<char, short, long, float, double>; using varType = std::variant<MyClass<char>, ..., MyClass<double>>; // Read this from some file, or whatever auto values = std::vector<valType> { 3, 2.6f, 17.2, 1523l }; std::vector<varType> paramList = MyFunctionThatReadsThroughParamToNextParam(); for (size_t i = 0; i < values.size(); i++) { paramList[i].SetValue(values[i]); // where the type contained in values[i] matches the type expected by paramList[i] // ideally this would throw if the types were incorrect, but really // any defined behaviour here would be great. } TestCase中有以下代码:

unittest

但是,当我运行TestLogging测试用例时,我得到了

  

AssertionError:预期的电话:incr(你&#39; pegasus.logger.WARNING.root&#39;)

     

未调用

我希望这个电话会成功。为什么会这样?

1 个答案:

答案 0 :(得分:1)

当我调试此行为时,我发现root_logger.manager.disable设置为30的值,这意味着没有打印所有级别为WARNING或更低级别的日志记录。

日志记录Manager对象没有记录在我可以轻松找到的任何位置,但它是描述和存储所有记录器的对象,包括根记录器。它在代码here中定义。我发现在测试用例的其他地方有logging.disable(logging.WARNING)的调用。这会将root_logger.manager.disable的值设置为30.管理员禁用级别胜过记录器的有效级别(请参阅this code)。

通过在测试用例开始时将行logging.disable(logging.NOTSET)添加到我的测试用例中,我确保将日志管理器disable属性设置为默认值0,这导致了我的测试用例通过。