测试带有浮点数的元组的断言

时间:2010-06-11 13:07:51

标签: python unit-testing floating-point tuples assert

我有一个函数返回一个元组,其中包含一个浮点值。通常我使用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,但您明白我的意思。

3 个答案:

答案 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。