在python中断言两个变量几乎相等

时间:2017-01-23 14:09:23

标签: python python-unittest

以下是两个变量:earnings_forecastactual_earning(数值变量)

我想断言这两个变量是否相等,相对于actual_earning变量可以接受±2%的差异。

假设: earnings_forecast = 6 actual_earnings = 5.19

我不能使用assertEqual(earnings_forecast, actual_earnings),因为它会尝试进行完全匹配,而我想断言这两个变量几乎相等,可接受的差异为±2%。

5 个答案:

答案 0 :(得分:13)

您可以使用Python 3.5中引入的新isclose函数

  

PEP 485添加了math.isclose()和cmath.isclose()函数   判断两个值是否大致相等或“接近”   其他。确定两个值是否被认为是接近的   根据给定的绝对和相对容差。相对的   容差是isclose参数之间允许的最大差异,   相对于较大的绝对值

import math
a = 100.0
b = 102.0
c = 103.0

assert math.isclose(a,b, rel_tol=0.02)
assert math.isclose(a,c, rel_tol=0.02)

答案 1 :(得分:1)

abs(earnings_forecast - actual_earning) < 0.01 * abs(earnings_forecast + actual_earning)

是一种很好的方法,它可以让你在任何一方都有一个很好的对称2%差异。它也不会遭遇其中一个值为零的陷阱。

还有其他定义,但与上面的定义一样,它们各有利弊。

答案 2 :(得分:1)

只需定义一个新测试:

def assertNearlyEqual(self,a,b,fraction=0.02,msg=None):
    if abs(a-b) > abs(fraction*a):
        if msg is None:
            self.fail("The given numbers %s and %s are not near each other."%(a,b))
        else:
            fail(msg)

并用两个变量调用它:

self.assertNearlyEqual(earnings_forecast,actual_earning)

答案 3 :(得分:1)

简单方法:

a, b = sorted(map(float, (a, b)))
assert a + abs(a)*1.02 >= b

您可以使用自定义Testcase子类在测试中使用:

class FooTestCase(TestCase):
    def assertAlmostEqual(a, b):
        a, b = sorted(map(float, (a, b)))
        self.assertTrue(a + abs(a)*1.02 >= b)

答案 4 :(得分:1)

对于仍使用Python 2.x的用户,您还可以使用numpy.isclose()

from numpy import isclose as isclose
a = 100.0
b = 100.01

print isclose(a,b, atol=0.02)  # True

来自文档:

  

对于有限值,isclose使用以下等式来测试是否   两个浮点值是等价的。

absolute(a - b) <= (atol + rtol * absolute(b))