是否存在单元测试不需要涵盖功能或方法的情况?他们会在什么情况下或不存在?
例如,我有以下功能。它会调用另一个函数,' formatName'单元测试100%覆盖。
function SeatReservation(name, initialMeal) {
self.formattedName = ko.computed(function () {
return AH.Helpers.formatName(self.name);
});
}
上面的函数是否有点冗余,因为它所做的只是调用另一个方法,但我又要在viewmodel中保留尽可能多的逻辑。
如果我确实需要对上述内容进行测试,那么只需检查formatName是否已使用间谍调用
ok(AH.Helpers.formatName.calledOnce);
应该覆盖吸气剂吗?
答案 0 :(得分:4)
一般来说,某些代码不能被测试覆盖总是可以的。测试有一个收益递减点 - 增加覆盖率需要花费很多精力并且不会带来太多价值。
在您的具体情况下,我认为覆盖通话是有意义的。但肯定不是通过检查辅助程序是否被调用,而是对实现有太多了解。创建座位预留应该对对象的状态产生可观察的影响,例如更改格式化名称。所以我会通过传递一些简单的名称并检查名称格式是否正确并self.formattedName
更新来测试方法。
答案 1 :(得分:1)
要与我formattedName
方法明确同意zoul's answer,:代码覆盖范围不是所有内容和unit tests do not, in general, prove that a program is correct,这是在接近它们时要记住的。
对于简单的线路覆盖更是如此 - 即使100%的线路覆盖率并不意味着 ,如果你有一百万个不同的分支由复杂的规则控制。
在他的文章中作为one Mr. Bertrand Meyer aptly put it,"软件测试的七项原则",
在理论上,测试程序以评估其质量类似于 将针插入娃娃 - 非常小的针脚,非常大的娃娃。 [...]
测试程序是为了让它失败
测试死难者 - 或者可以通过检查验证的任何其他简单方法 - 真的试图让程序失败?
总的来说,无论如何,我都会警惕崇拜指标的祭坛。
数字必须始终解释:在极端的例子中,如果你是一个富裕的人每天吃两块牛排而一个穷人吃零的土地的王者,那就没什么价值了说你的受试者平均每天吃一块牛排。
还有另一个有趣的作品来自Alberto Savoia," Testivus的智慧"在the Google Testing blog.
当我回答问她多少时 米粒我应该放在锅里,我帮她意识到了 必要的测试量取决于许多因素,她 比我更了解这些因素 - 毕竟这是她的代码。那里 没有单一,简单,回答,而且她足够聪明,可以处理 真相并与之合作。“
这不是对马虎测试的邀请,或者更糟糕的是,忽略了如此简单的方法"那"不可能包含任何错误"。
这是对有效测试的邀请,这种测试使您有90%的机会以20%的努力而不是相反的方式发送无错代码。< / p>