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

时间:2017-01-17 21:33:15

标签: python python-2.7 python-unittest

在python 2.7 unittest框架中,

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 完全相同,我的函数只会被调用,因此在我想要的情况下不能正确调用它要调用它。

1 个答案:

答案 0 :(得分:4)

通过在测试类中自定义测试,可以轻松地将附加测试附加到单元测试服务中(或者甚至更好,为每个测试套件定义子类的超类)。将同时检查类型和相等性的通用测试如下:

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

您可以从这些子类中继承整个测试库。