当前位置:  开发笔记 > 人工智能 > 正文

代码覆盖的陷阱

如何解决《代码覆盖的陷阱》经验,为你挑选了5个好方法。

我正在寻找代码覆盖的一些不良副作用的真实世界的例子.

我注意到最近在工作中发生了这种情况,因为有一项政策可以实现100%的代码覆盖率.代码质量肯定在提高,但相反,测试人员似乎正在编写更宽松的测试计划,因为"代码完全经过单元测试".因此,一些逻辑错误成功.它们是一个非常难以调试的因为"代码完全经过单元测试".

我认为这部分是因为我们的工具只进行了声明覆盖.不过,它本来可以花更多时间.

如果有任何人有代码覆盖政策的其他负面影响请分享.我想知道在现实世界中发生了什么样的其他"问题".

提前致谢.

编辑:感谢所有非常好的回应.有一些我会将其标记为答案,但遗憾的是我只能标记一个.



1> Mark Simpson..:

在一句话中:代码覆盖率告诉你你没有测试过的东西,而不是你的东西.

构建有价值的单元测试套件的一部分是找到最重要,高风险的代码并提出它的难题.你想确保把困难的东西作为优先事项.覆盖率数字没有关于代码"重要性"的概念,也没有测试的质量.

根据我的经验,您将要编写的许多最重要的测试都是几乎没有添加任何覆盖的测试(在这里和那里添加一些额外%的边缘情况,但发现大量的错误).

设置硬性和(可能适得其反)覆盖率目标的问题在于,开发人员可能不得不开始向后弯曲以测试其代码.有代码可测试,然后就是酷刑.如果你通过出色的测试获得100%的覆盖率,那么这太棒了,但在大多数情况下,额外的努力是不值得的.

此外,人们开始痴迷/摆弄数字,而不是关注测试的质量.我看过写得不好的测试,覆盖率达到90%以上,就像我看到的只有60-70%覆盖率的优秀测试一样.

同样,我倾向于在覆盖看成什么绝对的指标还没有经过测试.


+1对代码覆盖率"问题"的非常好的解释.

2> Jason Cohen..:

仅仅因为代码覆盖并不意味着您实际上正在测试函数中的所有路径.

例如,此代码有四个路径:

if (A) { ... } else { ... }
if (B) { ... } else { ... }

然而,只有两个测试(例如一个A和B为真,一个A和B为假)将给出"100%代码覆盖率".

这是一个问题,因为一旦你获得了神奇的100%数字,就会停止测试.



3> Eric Melski..:

根据我的经验,代码覆盖工具面临的最大问题是,有人会认为"高代码覆盖率"等于"良好测试"这一信念的风险.大多数覆盖工具只提供语句覆盖度量,而不是条件,数据路径或决策覆盖.这意味着可以像这样对一些代码进行100%覆盖:

for (int i = 0; i < MAX_RETRIES; ++i) {
    if (someFunction() == MAGIC_NUMBER) {
        break;
    }
}

...没有测试for循环的终止条件.

更糟糕的是,可以从仅调用您的应用程序的测试中获得非常高的"覆盖率",而无需费心验证输出或验证输出.

简而言之,代码覆盖水平肯定表明测试不充分,但覆盖水平并不表示测试充分或正确.



4> Jason Cohen..:

有时极端情况非常罕见,不值得测试,但严格的代码覆盖规则要求您进行测试.

例如,在Java中,MD5算法是内置的,但从技术上讲,可能会抛出"不支持的算法"类型异常.它永远不会抛出,你的测试必须通过显着的旋转来测试这条路径.

浪费了很多工作.



5> Scotty Allen..:

在我看来,团队从测量代码覆盖率开始的最大危险是它奖励大型测试,并惩罚小型测试.如果您可以选择编写涵盖应用程序大部分功能的单个测试,并编写十个测试单个方法的小测试,则只测量代码覆盖率意味着您应该编写大型测试.

但是,编写一组10个小测试将使您的测试更加简单,并且将比一个大型测试更彻底地测试您的应用程序.因此,通过测量代码覆盖率,特别是在具有不断发展的测试习惯的组织中,您通常可以设置错误的激励措施.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有