2014-12-02 92 views
2

我想測試一個輸出以度數爲單位的標題的函數,該函數是區間[0,360)中的一個數字。由於結果是浮點數,因此將實際結果與unittest.assertEqual()的預期結果進行比較是行不通的。 unittest.assertAlmostEqual()更好,因爲它提供了一個容差。這種方法適用於不接近0度的航向。Python單元測試:測試兩個角度是否幾乎相等

問題:測試期望值爲0度的標題的正確方法是什麼? assertAlmostEquals()只包含略大於0度的角度,但會錯過略小於0的角度,即360度...

+0

定義自己的輔助函數,它有兩個角,並返回ABS的區別 – matcheek 2014-12-02 17:17:06

+0

的每當你比較浮點數,你必須包括一個「 epsilon',一個小數字,低於該數字的所有意圖和目的被認爲是零。例如:1E-6或1E-8等'a == b如果abs(a - b)<= epsilon。如果兩個值接近0,事情就會變得棘手。 – Pierre 2014-12-02 17:43:36

回答

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) 
+0

我不認爲這樣可以很好地保留角度之間的差異。 – simonzack 2014-12-02 17:25:32

+0

@SturlaMolden這個概念有兩個修改:(1)比較sin和cos的結果時,應該設置一個容差;我最終使用了'delta = 0.001'。 (2)如果以度數提供輸入,則必須用'x = math.radians(x)'將其轉換爲弧度。 – ThS 2014-12-02 22:04:53

+0

我已經增加了使用餘弦定律的數值校正,並且還有** kwargs將關鍵字參數的位置,msg和delta傳遞給assertAlmostEqual。 – 2014-12-03 00:18:47