什麼是測試的東西,不等於精確值,如大圓計算的最佳方式:如何測試正確的大圓距離計算?
/// <summary>
/// Get the great circle distance (shortest distance possible) between two points in km.
/// </summary>
/// <param name="endPoint">end point</param>
/// <returns>the great circle distance in km</returns>
public double GreatCircleDistanceInKm(IGeoPoint endPoint)
{
var earthRadius = Constants.EARTH_RADIUS_KM;
var diffLat = Utility.DegreesToRadians(endPoint.Latitude - this.Latitude);
var diffLong = Utility.DegreesToRadians(endPoint.Longitude - this.Longitude);
var a = Math.Sin(diffLat/2) * Math.Sin(diffLat/2) +
Math.Cos(Utility.DegreesToRadians(this.Latitude)) * Math.Cos(Utility.DegreesToRadians(endPoint.Latitude)) *
Math.Sin(diffLong/2) * Math.Sin(diffLong/2);
var c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
var d = earthRadius * c;
return d;
}
目前我的測試是這樣的:
[TestMethod]
public void GeoPoint_GreatCircleDistanceInKm_IsCorrect()
{
// arrange
var startPoint = new GeoPoint(0, 45, 90); // id, lat, long
var endPoint1 = new GeoPoint(0, 45, 90);
var endPoint2 = new GeoPoint(0, 0, 0);
// act
var greatCircleDistanceZero = startPoint.GreatCircleDistanceInKm(endPoint1);
var greatCircleDistanceBig = startPoint.GreatCircleDistanceInKm(endPoint2);
// assert
Assert.AreEqual(0, greatCircleDistanceZero);
Assert.AreEqual(10007.543398010288, greatCircleDistanceBig);
}
但這似乎錯了,我我先找到答案然後再對它進行測試。這種方法應該如何進行測試?我是否應該通過算法/計算並嘗試瞭解它是如何工作的,以便能夠得出確切的值?
澄清: 我的問題是這是進行這種事情的測試正確的方法,即。我的測試是否應該綁定到實際的實現上(因爲正如你所看到的,我正在使用細粒度的期望值)還是應該以某種方式更通用?
東西是根據所使用的earthRadius計算不同,因特網上的一些算法使用不同的值,即。這一個http://www.daftlogic.com/projects-google-maps-distance-calculator.htm,它給出了10020.584的距離。手工操作也是一種痛苦,因此是衆所周知的C&P代碼。 – sprocket12 2014-12-19 12:34:16
我知道你的意思。我認爲你有兩個選擇。您可以「指定」必須使用具體半徑(例如6371)進行計算,並假設您已使用此值進行測試。所以,你可以選擇你認爲的差異很小。或者你可以計算(例如用Wolfram Alpha)儘可能小的距離和最長的距離。現在你可以指定你的測試用例,說明你的函數的距離必須在這兩個距離之間。 – 2014-12-22 07:23:44