nose.tools.eq_ 对比 assertEqual

nose.tools.eq_ vs assertEqual

问题:

我们使用 nose 测试运行器已经有一段时间了。

有时,我看到我们的测试有 eq_() 个调用:

eq_(actual, expected)

而不是常见的:

self.assertEqual(actual, expected)

问题:

与标准单元测试框架的 assertEqual() 相比,使用 nose.tools.eq_ 有什么好处吗?它们实际上是等价的吗?


想法:

好吧,一方面,eq_ 更短,但它必须从 nose.tools 导入,这使得测试依赖于测试运行程序库,这使得切换到更难不同的测试运行器,比如 py.test。另一方面,我们也经常使用 @istest@nottest@attr 鼻子装饰器。

它们不等同于 unittest.TestCase.assertEqual

nose.tools.ok_(expr, msg=None)

Shorthand for assert. Saves 3 whole characters!

nose.tools.eq_(a, b, msg=None)

Shorthand for 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

https://github.com/python/cpython/blob/9b5ef19c937bf9414e0239f82aceb78a26915215/Lib/unittest/case.py#L805

然而,正如文档字符串和函数名称所暗示的那样,assertEqual 有可能成为 类型特定的 。这是您使用 eq_(或 assert a == b)失去的东西。 unittest.TestCasedicts、lists、tuples、sets、frozensets 和 strs 的特殊情况.这些似乎主要有助于更漂亮地打印错误消息。

但是assertEqualTestCase的class成员,所以只能在TestCase中使用。 nose.tools.eq_ 可以用在任何地方,就像一个简单的 assert.