问题:
我们已经使用nose
测试运行器了很长一段时间。
我不时会看到我们的测试有eq_()
次来电:
eq_(actual, expected)
而不是共同:
self.assertEqual(actual, expected)
问题:
使用nose.tools.eq_
而不是标准的单元测试框架assertEqual()
有什么好处吗?它们实际上是等价的吗?
思想:
嗯,对于一个,eq_
更短,但它必须从nose.tools
导入,这使得测试依赖于测试运行器库,这会使切换到不同的测试变得更加困难跑者,说py.test
。另一方面,我们也经常使用@istest
,@nottest
和@attr
鼻子修饰器。
答案 0 :(得分:5)
它们不等同于unittest.TestCase.assertEqual
。
<强>
nose.tools.ok_(expr, msg=None)
强>
assert
的简写。保存3个完整字符!<强>
nose.tools.eq_(a, b, msg=None)
强>的简写
assert a == b, "%r != %r" % (a, b)
https://nose.readthedocs.org/en/latest/testing_tools.html#nose.tools.ok_
然而,这些文档略有误导。如果您查看来源,您会看到eq_
实际上是:
def eq_(a, b, msg=None):
if not a == b:
raise AssertionError(msg or "%r != %r" % (a, b))
https://github.com/nose-devs/nose/blob/master/nose/tools/trivial.py#L25
这非常接近assertEqual
的基本情况:
def _baseAssertEqual(self, first, second, msg=None):
"""The default assertEqual implementation, not type specific."""
if not first == second:
standardMsg = '%s != %s' % _common_shorten_repr(first, second)
msg = self._formatMessage(msg, standardMsg)
raise self.failureException(msg) # default: AssertionError
但是,正如文档字符串和函数名称所示,assertEqual
可能是特定于类型的。对于eq_
(或assert a == b
而言,这是您丢失的内容。 unittest.TestCase
包含dict
,list
,tuple
,set
,frozenset
和str
s的特殊情况。这些似乎大多有助于更好地打印错误消息。
但assertEqual
是TestCase
的类成员,所以它只能在TestCase
中使用。 nose.tools.eq_
可以在任何地方使用,就像一个简单的assert
。