Unit testing 单元测试中不包含的函数或方法是否可以?什么情况?

Unit testing 单元测试中不包含的函数或方法是否可以?什么情况?,unit-testing,Unit Testing,是否存在单元测试不需要覆盖函数或方法的情况?它们会是什么样的情况?它们是否存在 例如,我有以下函数。它对另一个函数“formatName”进行一次调用,该函数100%由单元测试覆盖 function SeatReservation(name, initialMeal) { self.formattedName = ko.computed(function () { return AH.Helpers.formatName(self.name); }); } 上面

是否存在单元测试不需要覆盖函数或方法的情况?它们会是什么样的情况?它们是否存在

例如,我有以下函数。它对另一个函数“formatName”进行一次调用,该函数100%由单元测试覆盖

function SeatReservation(name, initialMeal) {
    self.formattedName = ko.computed(function () {
        return AH.Helpers.formatName(self.name);
    });
}
上面的函数是否有点多余,因为它所做的只是调用另一个方法,但我还是希望在viewmodel中保留尽可能多的逻辑

如果我确实需要对上述内容进行测试,只需检查formatName是否已使用spy调用就可以了

ok(AH.Helpers.formatName.calledOnce);

是否应该涵盖getter?

一般来说,测试中不包含某些代码总是可以的。测试有一个收益递减的点——在这个点上,增加覆盖率需要付出大量的努力,并且不会带来太多的价值

就你的具体情况而言,我认为报道这个电话是有意义的。但肯定不是通过检查是否调用了helper,这意味着对实现了解得太多了。创建座位预订应该对对象的状态有明显的影响,比如更改格式化名称。因此,我将通过向该方法传递一些简单的名称并检查名称是否正确格式化,以及
self.formattedName
是否已更新来测试该方法。

我的2美分:是的。 关于你的
formattedName
方法,我与我的意见一致的人复合:代码覆盖率不是一切,这是在接近他们时要记住的

对于简单的行覆盖率来说更是如此-即使是100%的行覆盖率也不意味着太多,如果您有一百万个由复杂规则管理的分支

正如他的文章“软件测试的七个原则”

理论上,测试程序以评估其质量类似于 将别针插入娃娃非常小的别针,非常大的娃娃。 [……]

测试一个程序就是试图让它失败

将getter测试到死亡-或者任何其他可以通过检查验证的简单方法-是否真的试图使程序失败

总的来说,无论如何,我都会对崇拜度量标准的祭坛保持警惕

数字必须始终加以解释:在一个极端的例子中,如果你是一个富人每天吃两块牛排,穷人每天吃零的国家的国王,那么说你的臣民平均每天吃一块牛排就没有什么价值了

阿尔贝托·萨沃亚(Alberto Savoia)的另一个有趣作品是《睾丸的智慧》

当我问她有多少时 我应该把米粒放进锅里,我帮助她意识到 必要的测试量取决于许多因素,她 比我更了解这些因素——毕竟这是她的代码。那里 没有一个简单的答案,而且她足够聪明来处理这个问题 真相,并与之合作。”

这并不是邀请进行草率的测试,或者更糟糕的是,忽略那些“非常简单”以至于“不可能包含任何错误”的方法


这是对有效的测试的邀请,这种测试让你有90%的机会以20%的努力而不是相反的方式发布无bug代码。

感谢你的回答Zoul,我认为这是有道理的,但是…我觉得格式化名称测试已经涵盖了逻辑。实际发生的情况是,我在现实世界的代码中遇到了与上述类似的场景,我似乎在一遍又一遍地重新测试formattedName,这让我感觉redundant@atreeonhill:您可能正在测试
toString
方法或强制转换操作符一千次。我不担心它,也不担心编写严重依赖于实现的测试。如果更改实现,将出现大量误报,这将有助于忽略实际错误。一般来说,要特别小心误报。我想,viewmodel上的formattedName函数应该检查它与self.name属性的交互。这超出了formatName的逻辑范围,因此这是一个很好的测试。仍然觉得有相当多的重复,但我想这一点的功能应该进行测试。我正在努力不成为第三个程序员!谢谢