以下是两个变量:earnings_forecast
,actual_earning
(数值变量)
我想断言这两个变量是否相等,相对于actual_earning
变量可以接受±2%的差异。
假设:
earnings_forecast = 6
actual_earnings = 5.19
我不能使用assertEqual(earnings_forecast, actual_earnings)
,因为它会尝试进行完全匹配,而我想断言这两个变量几乎相等,可接受的差异为±2%。
答案 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))