假设我们有以下伪代码:
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
进行单元测试。
如果我必须为月亮进行测试,我必须找出需要一些手动工作的返回值,对于一堆测试用例。如果数学逻辑有任何变化,那就意味着我必须再次手动找到更新的返回值。
有哪些优秀的软件工程实践来测试这些功能?
答案 0 :(得分:1)
如果基准假设发生变化并且预期结果会因此而改变,那么您认为需要“大量计算工作”以确定“预期”值以检查实际结果的测试确实会受到影响是正确的。
我在这里看到一个选项:如果可能,只需计算预期的测试结果,但是不会自己编码。你看,如果你创建测试代码和生产代码,你可能会犯同样的错误两次。所以即使你试图以“不同的方式”实现所需的方程式,你做测试和生产代码并不完全理想。
因此:如果可能的话,找一个放下计算逻辑的人在你的测试用例中使用。也许这个代码在某种程度上被简化了 - 那些“生成器”不需要是完美的;但是他们应该为你将使用它们的那些角落给出正确的结果。
答案 1 :(得分:1)
我经常通过首先编写实现来解决这些情况,然后使用它来计算测试输入的值,然后我只手动验证它们,这通常比完全计算它们要容易一些(尽管存在风险)从代码中的bug中引入一些bug到期望值,我的验证失败了。)
有时至少要从实现代码中得到一些区别我在Libre Office计算表中进行数学计算,所以我使用相同的公式,但是我第二次写入并进入单元格,所以我通常结束结构有点不同,再确保一次,公式就像我想要的那样。
还尝试将复杂的计算分解为几个更简单的步骤,因此您可以主要对单个操作进行单元测试,然后将整个操作视为集成测试,仅测试少数情况。如果内部逻辑将被调整,它可能会破坏所有那些复杂的测试,但简单的操作测试将适用于那些没有改变的。
如果这是一些现实世界占星术(它看起来像2D简化空间模型,可能是一些交互式动画),你可能会找到一些已经由其他人计算过的示例数据,在某些书/等中,所以你可以使用那些,这有很大的帮助(尤其是在计算别人的计算时发现错误:)。
如果你不需要超精确的结果,但你只需要知道月亮在地球轨道和太阳,那么你可以测试结果与手动猜测的预期值有一些大的误差(像轨道距离的1/4等。)