我有一个函数返回一个元组,其中包含一个浮点值。通常我使用assertAlmostEquals
来比较这些,但这不适用于元组。此外,元组还包含其他数据类型。目前我单独断言元组的每个元素,但这对于这样的元组列表来说太过分了。有没有什么好方法可以为这种情况编写断言?
考虑这个功能:
def f(a):
return [(1.0/x, x * 2) for x in a]
现在我想为它编写一个测试:
def testF(self):
self.assertEqual(f(range(1,3)), [(1.0, 2), (0.5, 4)])
这会失败,因为1.0/2
的结果并不完全是0.5
。任何人都可以推荐一种以可读方式编写这种断言的好方法吗?
修改:实际上1.0/2
正是0.5
,但您明白我的意思。
答案 0 :(得分:8)
用拉链拉伸你的功能怎么样:
def testF(self):
for tuple1, tuple2 in zip(f(range(1,3)), [(1.0, 2), (0.5, 4)]):
for val1, val2 in zip(tuple1, tuple2):
if type(val2) is float:
self.assertAlmostEquals(val1, val2, 5)
else:
self.assertEquals(val1, val2)
我的前提是,最好在循环中使用多个断言以获取断开处的确切值,而使用单个断言使用all()。
PS。如果您有其他数字类型要使用assertAlmostEquals,则可以将if更改为例如if type(val2) in [float, decimal.Decimal]:
答案 1 :(得分:3)
我可能会定义一个递归函数。
from collections import Iterable;
def recursiveAssertAlmostEqual(testCase, first, second, *args, **kwargs):
if isinstance(first, Iterable) and isinstance(second, Iterable):
for a, b in zip(first, second):
recursiveAssertAlmostEqual(testCase, a, b, *args, **kwargs)
else:
testCase.assertAlmostEqual(first, second, *args, **kwargs)
(请注意,它将断言(1, 2)
和[1, 2]
相等。)
答案 2 :(得分:2)
我过去所做的是编写一个自定义函数来确定复杂数据类型的有效性,然后使用assert( IsFooValid( foo ) )
。有效性函数可以简单地返回true / false,但通常最好用适当的消息引发AssertionError。