如何测试具有需要手动计算的返回值的函数

时间:2016-11-18 19:14:57

标签: unit-testing testing

假设我们有以下伪代码:

if task.done {

    cell?.textLabel!.text = "‼️\(task.name!)"
    cell!.detailTextLabel!.text = task.time
}
else {

    cell?.textLabel!.text = "\(task.name!)"
    cell!.detailTextLabel!.text = task.time

}

以上课程描述了我们太阳系的基本模态。

方法class Position{ int x, y } class Body{ Body parent; Position start; //always initialized relative to parent's } class OrbitingBody extends Body{ int angularVelocity; // angles travelled per day int radius; // radius of the orbit, like earths orbit radius around sun //returns its position after 'days' days relative to its parent Position getRelativePosition(int days) { totalAngles = self.angularVelocity * days roundedAngle = totalAngles % 360 return Math.polar2Cartesian(roundedAngle, self.radius) } // returns position relative to the absolute parent, i.e Sun Position getAbsolutePosition(int days) { position = self.getRelativePosition(days) if (self.parent) { parentPosition = parent.getAbsolutePosition(d) // Math.relativePosition converts position with respect to parents' position = Math.relativePosition(position, parentPosition) } return position } } class Sun extends Body{ // position will be (0,0) } class Planet extends OrbitingBody{ //parent will be Sun } class Moon extends OrbitingBody{ //parent will be a Planet } 找到月球相对于太阳的位置。对于一颗行星来说这是直截了当的。

对于月亮来说,有一个并发症,因为它返回相对于太阳的位置。 getAbsolutePosition将始终相对于其父级返回,即月亮将返回w.r.t earth。

我的目标是对getRelativePosition进行单元测试。

如果我必须为月亮进行测试,我必须找出需要一些手动工作的返回值,对于一堆测试用例。如果数学逻辑有任何变化,那就意味着我必须再次手动找到更新的返回值。

有哪些优秀的软件工程实践来测试这些功能?

2 个答案:

答案 0 :(得分:1)

如果基准假设发生变化并且预期结果会因此而改变,那么您认为需要“大量计算工作”以确定“预期”值以检查实际结果的测试确实会受到影响是正确的。

我在这里看到一个选项:如果可能,只需计算预期的测试结果,但是不会自己编码。你看,如果你创建测试代码和生产代码,你可能会犯同样的错误两次。所以即使你试图以“不同的方式”实现所需的方程式,你做测试和生产代码并不完全理想。

因此:如果可能的话,找一个放下计算逻辑的人在你的测试用例中使用。也许这个代码在某种程度上被简化了 - 那些“生成器”不需要是完美的;但是他们应该为你将使用它们的那些角落给出正确的结果。

答案 1 :(得分:1)

我经常通过首先编写实现来解决这些情况,然后使用它来计算测试输入的值,然后我只手动验证它们,这通常比完全计算它们要容易一些(尽管存在风险)从代码中的bug中引入一些bug到期望值,我的验证失败了。)

有时至少要从实现代码中得到一些区别我在Libre Office计算表中进行数学计算,所以我使用相同的公式,但是我第二次写入并进入单元格,所以我通常结束结构有点不同,再确保一次,公式就像我想要的那样。

还尝试将复杂的计算分解为几个更简单的步骤,因此您可以主要对单个操作进行单元测试,然后将整个操作视为集成测试,仅测试少数情况。如果内部逻辑将被调整,它可能会破坏所有那些复杂的测试,但简单的操作测试将适用于那些没有改变的。

如果这是一些现实世界占星术(它看起来像2D简化空间模型,可能是一些交互式动画),你可能会找到一些已经由其他人计算过的示例数据,在某些书/等中,所以你可以使用那些,这有很大的帮助(尤其是在计算别人的计算时发现错误:)。

如果你不需要超精确的结果,但你只需要知道月亮在地球轨道和太阳,那么你可以测试结果与手动猜测的预期值有一些大的误差(像轨道距离的1/4等。)