代码之家  ›  专栏  ›  技术社区  ›  Björn Pollex

带浮点数元组的测试断言

  •  6
  • Björn Pollex  · 技术社区  · 14 年前

    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 回复  |  直到 12 年前
        1
  •  8
  •   Nas Banov    14 年前

    好吧,用几个拉链拉皮条怎么样:

    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)
    

    另外,如果您有其他数字类型要使用AssertalPostEquals,您可以将上面的If改为例如。 if type(val2) in [float, decimal.Decimal]:

        2
  •  3
  •   kennytm    14 年前

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

    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
  •  2
  •   Craig Trader    14 年前

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