Unittest:如何确保类型相等,而不仅仅是值相等?

Unittest: How to ensure type equality, not just value equality?

在python 2.7单元测试框架中,

self.assertEquals(u"a","a")

没有失败。

如何比较 unittest 中的字符串,使 str 不等于 unicode

我不想更换每个

self.assertEquals(foo(...),"a")

v = foo(...)
self.assertEquals(type(v),str)
self.assertEquals(v,"a")

我不能使用addTypeEqualityFunc因为我的函数只会被调用如果两个对象是完全相同的typeobj,所以它不会在以下情况下准确调用我想要它被调用。

通过定义 在测试class 中测试自己(或者更好的是,定义一个超级class,可以轻松地将附加测试附加到单元测试套件你 subclass 每个测试套件)。同时检查类型和相等性的通用测试如下:

def assertEqualsValType(self,obj1,obj2,msg=None):
    self.assertEquals(type(obj1),type(obj2),msg)
    self.assertEquals(obj1,obj2,msg)

或者更短:

def assertEqualsValType(self,obj1,obj2,msg=None): #alternative
    self.assertEquals((type(obj1),obj1),(type(obj2),obj2),msg)

该函数检查两个给定对象的类型和值是否相等。 (这些本身并不专门用于字符串对象,但显然如果您需要更复杂的测试,您可以重写它)。换句话说,你隐藏了复杂性,你可以通过将多个测试合并到一个测试中来检查。

然后调用函数self.assertEqualsValType('a',u'a')会失败。此外,通过使测试尽可能通用,您可以找到它的其他用途:例如 self.assertEqualsValType(2,2.0) 也会失败。

您还可以重写上述函数以提供更多信息等信息

因此,这可能是开始您自己的更高级单元测试的存根。例如:

class BaseUnitTest(unittest.TestCase):

    def assertEqualsValType(self,obj1,obj2,msg=None):
        self.assertEquals(type(obj1),type(obj2),msg)
        self.assertEquals(obj1,obj2,msg)

    def assertBetweenEqual(self, value, min_value, max_value):
        self.assertGreaterEqual(value, min_value)
        self.assertLessEqual(value, max_value)

    def assertFoo(self,para,meters):
        #...
        pass

并且您可以从这些子class您的整个测试库。