测试不等于精确值的内容的最佳方法是什么,例如大圆计算:
/// <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);
}
但这似乎不对,我先找到答案,然后再对其进行测试。应该如何测试这些方法?我应该通过算法/计算并尝试找出它是如何工作的,所以我可以得到精确的值吗?
澄清: 我的问题是这是对这类事情进行测试的正确方法,即。我的测试应该绑定到实际的实现(因为你看到我使用的是细粒度的预期值)还是应该以某种方式更通用?
答案 0 :(得分:1)
您可以使用Assert.AreEqual(double expected, double actual, double delta)
。您应该使用足够小的增量(例如0.00000001)。这里不建议使用double.Epsilon。
来自MSDN:
因为Epsilon定义了范围接近零的正值的最小表达式,所以两个相似值之间的差值边界必须大于Epsilon。通常情况下,它比Epsilon大很多倍。因此,我们建议您在比较Double值时不要使用Epsilon。
对于您的其他问题:是的,应该测试这些方法。但是在检查算法的实现方式后编写测试并不是一个好主意,因为它可能实现错误。你需要一个整体的想法,例如方法应该做什么(在你的情况下计算greate圆距离)。现在,您可以通过指定输入和预期输出来指定测试用例。您可以从其他来源检索预期输出(例如,手动计算)。
一点注意事项:在TDD中,测试用例通常在写入实际代码之前指定。所以没有算法可以通过并找出它是如何工作的。
答案 1 :(得分:0)
也许
Assert.IsTrue(Math.Abs(greatCircleDistanceZero - 0) < Double.Epsilon);
Assert.IsTrue(Math.Abs(greatCircleDistanceBig - 10007.543398010288) < Double.Epsilon);
答案 2 :(得分:0)
下表显示了赤道上2点之间的距离。当纬度从极点移动时,NS距离是恒定的,但EW距离减小。正如我假设使用Great Circle Distance一样,结果中任何超过2位小数的精度都是多余的。
0 decimal places 1.0 = 111.32 km
1 decimal places 0.1 = 11.132 km
2 decimal places 0.01 = 1.1132 km
3 decimal places 0.001 = 111.32 m
4 decimal places 0.0001 = 11.132 m
5 decimal places 0.00001 = 1.1132 m