Python单元测试:测试两个角度是否几乎相等

时间:2014-12-02 17:11:37

标签: python unit-testing python-unittest

我想测试一个以度为单位输出航向的函数,该函数是区间[0,360]中的数字。由于结果是浮点数,因此将实际结果与unittest.assertEqual()的预期结果进行比较不起作用。 unittest.assertAlmostEqual()更好,因为它提供了容忍度。此方法适用于不接近0度的航向。

问题:测试预期值为0度的标题的正确方法是什么? assertAlmostEquals()只会包含略大于0度的角度,但会错过略小于0度的角度,即360度......

2 个答案:

答案 0 :(得分:4)

你可以使用单位圆上两点之间的欧几里德平方距离和余弦定律来得到两个角度之间的绝对差值:

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)

答案 1 :(得分:0)

我遇到了同样的情况,并利用模运算找到了一个非常简单的解决方案:

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