在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 完全相同,我的函数只会被调用,因此在我想要的情况下不能正确调用它要调用它。
答案 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
您可以从这些子类中继承整个测试库。