nose.tools.eq_ vs assertEqual

时间:2015-07-30 17:35:39

标签: python testing nose python-unittest assertion

问题:

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

我不时会看到我们的测试有eq_()次来电:

eq_(actual, expected)

而不是共同:

self.assertEqual(actual, expected)

问题:

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

思想:

嗯,对于一个,eq_更短,但它必须从nose.tools导入,这使得测试依赖于测试运行器库,这会使切换到不同的测试变得更加困难跑者,说py.test。另一方面,我们也经常使用@istest@nottest@attr鼻子修饰器。

1 个答案:

答案 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

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

但是,正如文档字符串和函数名称所示,assertEqual可能是特定于类型的。对于eq_(或assert a == b而言,这是您丢失的内容。 unittest.TestCase包含dictlisttuplesetfrozensetstr s的特殊情况。这些似乎大多有助于更好地打印错误消息。

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