【发布时间】:2015-03-05 19:06:40
【问题描述】:
我们发现 Python 鼻子测试的结果与单元测试的结果之间存在奇怪的差异。这是导致问题的代码,尤其是最后一行:
import logging
class ClassThatLogsBadly:
log = logging.getLogger(__name__)
def method_that_logs_badly(self):
self.log.error('A message', 'Another string')
return ('I ran')
上面的log 是从 Python 的日志库中检索到的,并且在调用时会产生问题,因为以下原因(来自 Python 库:logging/__init__.py:328):
def getMessage(self):
"""
Return the message for this LogRecord.
Return the message for this LogRecord after merging any user-supplied
arguments with the message.
"""
msg = str(self.msg)
if self.args:
msg = msg % self.args
return msg
如您所见,它尝试将Another string 拼接到A message,但后者没有要填充的有效插槽(%s 类型),因此无法执行此操作。这是一个known problem,解决方案是在记录器之外格式化你的东西。但是,我们的问题是进行测试以确保完成此操作。
对使用 unittest 或 py.test 调用日志库的代码运行测试不会引发失败。用鼻子运行相同的测试会导致错误,并且测试会失败。我们的大部分构建内容都是围绕 py.test 库构建的,并且没有这个测试失败是令人担忧的:我们不确定这是否是出于某种原因的预期行为,这些库之间处理的根本区别是什么,以及通常是什么去做吧。
我们使用的是 Python 3.4。这是运行此代码的示例测试:
import logging
import unittest
from mycode import ClassThatLogsBadly
class TestClassThatLogsBadly(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_method_that_logs_badly(self):
clz = ClassThatLogsBadly()
result = clz.method_that_logs_badly()
self.assertEquals('I ran', result)
【问题讨论】:
标签: python nose unit-testing