Python单元测试:测试两个角度是否几乎相等
我想测试一个以度为单位输出航向的函数,该航向是一个间隔[0,360]内的数字。由于结果是一个浮点数,因此使用Python单元测试:测试两个角度是否几乎相等,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我想测试一个以度为单位输出航向的函数,该航向是一个间隔[0,360]内的数字。由于结果是一个浮点数,因此使用unittest.assertEqual()将实际结果与预期结果进行比较不起作用。unittest.assertAlmostEqual()更好,因为它提供了公差。这种方法适用于不接近0度的航向 问题:测试预期值为0度的标题的正确方法是什么只包括略大于0度的角度,但会忽略略小于0度的角度,即360度…您可以使用单位圆上两点之间的平方欧几里德距离和余弦定律来获得两个角度之间的绝对差: from
unittest.assertEqual()
将实际结果与预期结果进行比较不起作用。unittest.assertAlmostEqual()
更好,因为它提供了公差。这种方法适用于不接近0度的航向
问题:测试预期值为0度的标题的正确方法是什么只包括略大于0度的角度,但会忽略略小于0度的角度,即360度…您可以使用单位圆上两点之间的平方欧几里德距离和余弦定律来获得两个角度之间的绝对差:
from math import sin, cos, acos
from unittest import assertAlmostEqual
def assertAlmostEqualAngles(x, y, **kwargs):
c2 = (sin(x)-sin(y))**2 + (cos(x)-cos(y))**2
angle_diff = acos((2.0 - c2)/2.0) # a = b = 1
assertAlmostEqual(angle_diff, 0.0, **kwargs)
这适用于弧度。如果角度以度为单位,则必须进行转换:
from math import sin, cos, acos, radians, degrees
from unittest import assertAlmostEqual
def assertAlmostEqualAngles(x, y, **kwargs):
x,y = radians(x),radians(y)
c2 = (sin(x)-sin(y))**2 + (cos(x)-cos(y))**2
angle_diff = degrees(acos((2.0 - c2)/2.0))
assertAlmostEqual(angle_diff, 0.0, **kwargs)
我遇到了同样的情况,并通过利用模计算找到了一个非常简单的解决方案:
In [20]: def d(a, b):
...: c = (b - a) % 360
...: if c > 180:
...: c -= 360
...: return c
...:
In [21]: d(1, 3)
Out[21]: 2
In [22]: d(1, 358)
Out[22]: -3
定义自己的助手函数,该函数取两个角度并返回不同的abs。每当比较浮点数时,必须包含一个“epsilon”,一个小数字,低于该数字时,所有意图和目的都被认为是零。例如:1E-6或1E-8等。
a==b如果是abs(a-b)我认为这并不能很好地保留角度之间的差异。@SturlaMolden这个概念有两个修改:(1)在比较正弦波和余弦波的结果时,应该设置一个公差;我最终使用了delta=0.001
(2)如果输入是以度为单位的,则必须使用x=math.radians(x)将其转换为弧度
。我使用余弦定律和**kwargs添加了一个数字校正,将关键字参数places、msg和delta传递给AssertalPostequal。在任何情况下,您都必须根据问题的容差调整delta。