如何在没有太多负担的情况下使用 `assertEqual()` [或等效的]?

Aru*_*run 4 python assert python-unittest

我正在寻找一种方法(如果可用),它可以比较两个值并在比较失败时引发带有有意义消息的断言错误。

如果我使用assert,则失败消息不包含断言失败时比较的值。

>>> a = 3
>>> b = 4
>>> assert a == b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> 
Run Code Online (Sandbox Code Playgroud)

如果我使用包中的assertEqual()方法unittest.TestCase,断言消息将包含比较的值。

        a = 3
        b = 4
>       self.assertEqual(a, b)
E       AssertionError: 3 != 4
Run Code Online (Sandbox Code Playgroud)

请注意,这里的断言错误消息包含比较的值。这在现实生活中非常有用,因此对我来说是必要的。平原assert(见上文)不会这样做。

但是,到目前为止,我assertEqual()只能在继承自unittest.TestCase并提供一些其他必需方法的类中使用,例如runTest(). 我想在assertEqual()任何地方使用,而不仅仅是在继承的类中。那可能吗?

我尝试了以下方法,但没有奏效。

>>> import unittest
>>> unittest.TestCase.assertEqual(a, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method failUnlessEqual() must be called with TestCase instance as first argument (got int instance instead)
>>> 
>>> 
>>> tc = unittest.TestCase()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/unittest.py", line 215, in __init__
    (self.__class__, methodName)
ValueError: no such test method in <class 'unittest.TestCase'>: runTest
>>> 
Run Code Online (Sandbox Code Playgroud)

是否有任何其他包或库提供类似的方法assertEqual(),可以在没有额外限制的情况下轻松使用?

Dan*_*iel 5

您必须手动给出断言消息:

assert a == b, '%s != %s' % (a, b)
# AssertionError: 3 != 4
Run Code Online (Sandbox Code Playgroud)


Eli*_*sha 2

可以创建一个“帮助程序”新模块来提供对断言函数的访问。AssertsAccessor在这种情况下:

from unittest import TestCase

# Dummy TestCase instance, so we can initialize an instance
# and access the assert instance methods
class DummyTestCase(TestCase):
    def __init__(self):
        super(DummyTestCase, self).__init__('_dummy')

    def _dummy(self):
        pass

# A metaclass that makes __getattr__ static
class AssertsAccessorType(type):
    dummy = DummyTestCase()

    def __getattr__(cls, key):
        return getattr(AssertsAccessor.dummy, key)

# The actual accessor, a static class, that redirect the asserts
class AssertsAccessor(object):
    __metaclass__ = AssertsAccessorType
Run Code Online (Sandbox Code Playgroud)

该模块只需创建一次,然后就可以访问包中的所有断言,例如:unittest

AssertsAccessor.assertEquals(1, 2)
Run Code Online (Sandbox Code Playgroud)

断言错误:1!= 2

或者另一个例子:

AssertsAccessor.assertGreater(1, 2)
Run Code Online (Sandbox Code Playgroud)

哪些结果:

断言错误:1 不大于 2

假设为访问器创建的模块名为named assertions,代码中的常见用法如下:

from assertions import AssertsAccessor

def foo(small_arg, big_arg):
    AssertsAccessor.assertGreater(big_arg, small_arg)
    # some logic here
Run Code Online (Sandbox Code Playgroud)