相关疑难解决方法(0)

代码覆盖的陷阱

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

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

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

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

提前致谢.

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

unit-testing code-coverage

31
推荐指数
5
解决办法
5458
查看次数

如何避免使用TDD创建糟糕的设计

我最近(在上周)开始了一个实验,其中我尝试在我正在使用TDD原理的项目中编写新功能.在过去,我们的方法是一种适度敏捷的方法,但没有严格的严谨性.当方便时,单元测试就在这里和那里进行.全面测试覆盖的主要障碍是我们的应用程序具有复杂的依赖关系网.我选择了一个方便隔离的功能来尝试我的实验; 细节并不重要,可能具有商业敏感性,足以说这是一个简单的优化问题.

到目前为止,我发现:

  • TDD对我来说似乎鼓励漫无目的,不明显的设计成型.没有测试就不能编写代码的限制往往会阻碍将功能分解为独立单元的机会.在实践中,同时为这么多功能进行测试和编写测试太困难了
  • TDD倾向于鼓励创建"神对象"来完成所有事情 - 因为你已经为类x编写了许多模拟类,但是对于类y很少,所以当x类也应该实现特征z时似乎是合乎逻辑的而不是把它留给Y级.
  • 在编写代码之前编写测试需要在解决问题之前完全理解问题的每个复杂性.这似乎是一个矛盾.
  • 我无法让团队开始使用模拟框架.这意味着仅仅为了测试特定功能而产生了大量的残余.对于每个测试过的方法,你都需要一个假的,它唯一的工作就是报告被测试的类叫做它应该的任何东西.我开始发现自己正在编写类似DSL的东西,纯粹是为了实例化测试数据.
  • 尽管存在上述问题,TDD已经制作出一种几乎没有神秘错误的工作设计,这与我以前的开发模式不同.然而,重构蔓延的混乱却要求我暂时放弃TDD并完成它.我相信测试将继续在该方法中强制执行.尝试TDD进行重构练习,我觉得这种练习会更加猖獗.

那么问题是"有没有人建议减少上述问题的影响?".我毫不怀疑,嘲弄框架将是有利的; 但是目前我已经在努力尝试一些似乎只产生漫无边际码的东西.

编辑#1:

谢谢大家的考虑答案.我承认我在几个星期五晚上的啤酒之后写了我的问题,所以在某些地方它是模糊的,并没有真正表达我真正想要的情绪.我想强调一点,我确实喜欢 TDD的哲学,并且发现它适度成功,但由于我列出的原因也令人惊讶.我有机会睡觉,并在下周用新鲜的眼睛再次看问题,所以也许我可以通过混乱来解决我的问题.然而,他们都不是非先发者.

让我更担心的是,一些团队成员拒绝尝试任何你称之为"技术"的东西,而不是"完成它".我担心,残留的外观将被视为反对该过程的黑色标记,而不是证明它需要完全(即使用模拟框架和强烈的DI)以获得最佳结果.

RE"TDD不一定意味着测试优先":( womp,btreat)

我在这个问题上发现的每一篇文章中的"黄金法则"都是"红色,绿色,重构".那是:

  • 写一个必须失败的测试
  • 编写通过测试的代码
  • 重构代码,使其以最实用的方式通过测试

我很好奇人们如何在不遵循最初编写的TDD核心原则的情况下进行测试驱动开发.我的同事称中途住宅(或根据您的观点采用不同且同样有效的方法)"测试验证开发".在这种情况下,我认为创造一个新术语 - 或者可能将其从其他人手中夺走并为此获得信誉 - 是有用的.

用于测试数据的RE DSL :( Michael Venable)

我很高兴你这么说.我确实看到一般表单在整个项目范围内越来越有用,因为所讨论的应用程序维护了一个非常复杂的对象图,通常,测试它意味着运行应用程序并在GUI中尝试.(由于上面的商业敏感性原因,不会将游戏放弃,但它基本上与有向图上的各种指标的优化有关.但是,涉及许多警告和用户可配置的小部件.)

能够以编程方式设置有意义的测试用例将有助于各种情况,可能不限于单元测试.

RE God Objects:

我觉得这样,因为一个班级似乎占据了大部分功能集.也许这很好,而且它确实很重要,但它引起了一些人的注意,因为它看起来就像那些没有沿着这些线路开发的旧代码,并且似乎违反了SRP.我认为不可避免的是,某些类主要用作众多不同封装功能之间的接缝,而其他类只能接缝.如果它会是这样的话,我想我需要做的是从这个明显的上帝对象中尽可能多地清除逻辑,并将其行为重新作为所有分解部分之间的连接点.

(对于主持人:我已将我对帖子的回复添加到此处,因为评论字段不够长,无法包含我想要的详细信息.)

编辑#2(大约五个月后):

好吧,我觉得在仔细考虑问题一段时间之后更新一些想法可能会更好.

最后我最终放弃了TDD方法,我很遗憾地说.但是,我觉得有一些具体和合理的理由,我很乐意在下次有机会时继续使用它.

TDD的无懈可击的重构心态的结果是,当我简单地看一下我的代码时,领导开发者宣称绝大部分都是毫无意义的并且需要去做,我并不感到非常沮丧.虽然不得不抛弃大量艰苦的工作而感到遗憾,但我确实看到了他的意思.

出现这种情况是因为我从字面上理解了"代码到接口"的规则,但继续编写试图代表现实的类.很久以前我第一次发表声明:

类不应该试图代表现实.对象模型应该只尝试解决手头的问题.

...我从那以后经常重复; 对我自己和任何会倾听的人.

这种行为的结果是执行函数的类的对象模型,以及重复类功能的镜像接口集.有了这个指向我,经过一段短暂但强烈的阻力之后,看到了光线,没有任何问题删除大部分.

这并不意味着我相信"接口的代码"是无聊的.它的意思是,当接口代表真实的业务功能时,编码到接口主要是有价值的,而不是看起来像现实生活的微缩副本的某些想象的完美对象模型的属性,但不考虑它的唯一含义生活要回答你最初提出的问题.TDD的优势在于它不能生产这样的模型,除非偶然.因为它首先提出问题并且只关心得到答案,所以不涉及你的自我和系统的先验知识.

我现在正在散步,所以我最好完成这个,并且说我很想再次尝试TDD,但是对可用的工具和策略有更好的概述,并会尽我所能来决定如何我想在跳进去之前去做.也许我应该将这个华夫饼干移植到它所属的博客上,一旦我有更多的话要说.

tdd mocking

17
推荐指数
3
解决办法
1443
查看次数

什么是代码覆盖?

我有3个问题:

  • 什么是CodeCoverage?
  • 到底有什么好处呢 ?
  • 使用哪些工具来分析代码覆盖率?

language-agnostic code-coverage definition

11
推荐指数
1
解决办法
3947
查看次数

100%的代码覆盖率是否意味着代码是正确的?

如果你有 100% 的测试覆盖率并且所有测试都通过,这是否意味着代码保证是正确的并且编写更多的测试是没有意义的?

tdd unit-testing

0
推荐指数
1
解决办法
763
查看次数