【问题标题】:Test assertions for tuples with floats测试带有浮点数的元组的断言
【发布时间】:2010-06-11 13:07:51
【问题描述】:

我有一个函数,它返回一个元组,其中包含一个浮点值。通常我使用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.5 完全可以代表double
  • 我也想通了——但我希望你明白了。

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


【解决方案1】:

那么,用几个拉链来提升你的功能怎么样:

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]:

【讨论】:

    【解决方案2】:

    我可能会定义一个递归函数。

    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] 相等。)

    【讨论】:

      【解决方案3】:

      我过去所做的是编写一个自定义函数来为复杂的数据类型建立有效性,然后使用assert( IsFooValid( foo ) )。有效性函数可以简单地返回 true/false,但通常最好使用适当的消息引发 AssertionError。

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 2010-12-30
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 2016-12-10
        相关资源
        最近更新 更多