对于普通班级来说,进行单元测试覆盖是一种好习惯

Hat*_*oft 20 .net c# tdd bdd unit-testing

这是一个完全没有行为的类的例子.所以问题是我应该为它做单元测试覆盖,因为我认为它没有必要,因为它确实有任何行为.

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的代码覆盖率结果抱怨我没有为该课程做过任何报道

Rob*_*vey 23

我从不为这些做过测试. 没有行为要测试.

如果有任何非平凡的行为代码(也许是验证代码),那么我会为它编写一个测试.

  • 我还认为这代表了代码覆盖率工具中的错误/错误设置.我使用的所有覆盖工具(NCover,dotCover)都不包括代码覆盖率指标中的自动属性. (3认同)

Alf*_*red 11

我从Martin Fowler那里找到了这篇有趣的文章:

测试覆盖率是查找未经测试的代码库部分的有用工具.测试覆盖率作为测试有多好的数字陈述几乎没用.

===

对象导师的这个有趣的引用:

它可能不是强制性的,如果您的目标是100%覆盖率,您将专注于该目标,而不是专注于为代码行为编写最佳测试.

  • 文章为+1,但不包括是否在这种情况下编写测试. (3认同)

Ant*_*ram 7

我可以接受或离开它.但是,虽然现在几乎没有明显的好处,但如果程序员后来出现,将其转换为传统的,成员字段支持的属性,并在简单的情况下摸索实现,您将被覆盖.

但我个人实际上并不打扰,因为我的时间有限,而且我有更重要的测试要写,这将为我的降压提供更大的帮助.


k.m*_*k.m 7

Kent Beck在他的"按示例进行测试驱动开发"中列出了您应该测试的内容:

  • 条件语句
  • 循环
  • 操作
  • 多态性

你的班级没有这些.

通常会问自己一个问题,"如果我用单元测试覆盖这些代码,我会得到什么?" .如果"指向某些指标"是您可以提出的唯一答案,则可能不值得为此类代码编写测试.你会花时间,产生额外的代码,什么都得不到(代码覆盖"点"没什么价值 - 至少在这种情况下).

另外,看看这两个问题(它们都解决了类似的问题,答案主要解决一个重要问题 - [在大多数情况下]总会有人为你所做的事付钱 - 并且有人可能不会很高兴知道你花时间提高评级,因为这是它本质上是):

定论?我同意其他人说你不应该测试这些课程.


jhe*_*ngs 5

这并不是一个坏主意......例如,假设你开发了一个后端来存储未来的数据(例如数据库).您可以get; set;使用其他自定义功能替换通用调用.进行单元测试可确保始终执行代码,并且不会在转换中引入错误.

即使是一个非常简单的测试,它会检查您是否可以创建对象,设置字段以及读回相同的值,这表明您正在使用预期的行为来执行代码.即使对您来说显而易见,该代码的未来开发人员也可以使用该示例进行绘制,并确保所有更改都符合您的原始设计目标.

我也是这样看待:在开发测试时几乎没有任何伤害,具有一些非常可能的长期优势.现在只需几分钟就可以跟踪线下引入的问题.

  • @rudolf_franek我认为该陈述在很大程度上取决于代码库的意图.一个网站说,如果你编写的代码每6个月到一年就完全重写一次.那你就是对的.但是,如果您编写的软件一次多年保持不变,并且增加了增量功能,这些测试将成为回归工具,以确保每个功能的添加不会破坏现有功能. (3认同)
  • 唯一的挑战是有人可能认为不值得为属性编写单元测试(如果它们背后的代码无关紧要).单元测试的要点是你不知道幕后发生了什么.存在以确保行为合同在给定条件下保持不变的测试.当然,稍后向该类添加新功能也应该导致对新"功能"进行更多单元测试. (2认同)

Ale*_*kov 5

替代方案:您没有覆盖此特定类的事实暗示有一些代码使用此类,并且该代码也没有测试覆盖率.我先解决这个问题,看看是否需要更多的测试.

至于测试这样的仅数据对象:如果此对象是库/单元的外部合同的一部分,我肯定会添加显式测试.您承诺您的代码将返回/使用此数据.如果没有测试验证您可以更改代码的内部并更改此类,您将违背承诺,没有任何阻止您.