你真的在使用单元测试吗?

时间:2008-11-13 09:08:54

标签: unit-testing testing

我参与过许多新老项目,他们有一个共同点就是他们几乎都没有使用单元测试。我更喜欢使用它,但通常客户不愿意为此付费,并假设代码正常工作。

那么,您是否在项目中使用单元测试,还是依靠编码技能?

19 个答案:

答案 0 :(得分:71)

使用单元测试 是一种编码技巧。

我发现它为编码时间增加了很少的开销。最重要的是,生成的代码往往更容易理解和重构,并且维护时间大大减少。

详细讨论了这里的好处:Is Unit Testing worth the effort?

答案 1 :(得分:37)

我会说实话。我最近才开始编写单元测试,当我回去修改一个旧的DLL,这是我过去的糟糕时期,我会蹲下来编写单元测试,使其接近100%的代码覆盖率。我说“接近”因为最后几个百分点很难达到,因为代码的结构方式,它没有考虑模拟或单元测试(这种情况发生在抽象类或类中, P /调用本机代码)。虽然我理解100%的代码覆盖率与100%的代码执行路径不同,但我发现在那里进行测试有一个好方法可以告诉我什么时候我会做很多事情会破坏很多事情。

说实话,这可能就是为什么它让很多开发人员(包括我自己)花了很长时间来采用单元测试(让我们暂时不进入TDD)的原因之一。

我并不是说这些都是合理的原因,但是他们或多或少地做了我的头脑,而且我打赌他们也经历过你们的一些:

  • 首先,有一种想法:“哦,我已经写了大量的代码,没有测试,看到我已经被那座山压了,我可能没有时间去在它上面添加几个测试代码。“

  • 其次,没有人喜欢谈论这样一个事实:当你

    时,经典的代码运行调试循环实际上“足够好”了
    • 编写不会改变旧代码行为的新代码
    • 从事相对较小的软件项目或一次性实用工具
    • 项目的唯一开发人员(您可以将其中的大部分保留在您的头脑中,直到某一点)
  • 第三,当您维护现有代码时,单元测试更容易理解,如果您总是编写新代码,那么好处并不是很明显。当你的工作是制作一个实用程序并且再也不会再触摸它时,开发人员在单元测试中看不到什么价值,因为他们可能不会在维护程序员(希望那里工作)时在该实用程序或公司上工作是一个单元测试。来了。

  • 第四,单元测试是一项相当新的创新。 (哦,嘘......我知道这个想法一直存在,特别是在任务关键型和DoD应用程序中,但对于像我这样的“Joe the Plumber Developer”类型?单元测试不是在我十年初期的整个CS本科生涯中都提到过;在2008年,我听说这是101级以上所有项目的要求.Visual Studio直到今年才获得内置的测试框架,甚至那时只有专业版。)对我来说,这是无知的无知吗?当然,我认为许多编码因为这是他们的日常工作(这很好)的人根本就不知道。如果他们是,那么他们就知道他们必须保持最新状态,但是当谈到学习一种新的方法时(特别是涉及编写更多代码并在需要完成新功能时需要更多的预先时间昨天< / em>)意味着它会被推回。这是一个长尾巴,在十年左右的时间里,我们关于单元测试的讨论看起来就像我们对面向对象编程的嘀咕一样古怪,这种编程能够在20世纪90年代实现新的发展时代。哎呀,如果开始进行单元测试,那么结束必须接近,因为我通常是个白痴。

  • 第五,对某些代码区域进行单元测试真的很困难,这让我害怕了一段时间。我想到了多线程事件队列,图形渲染和GUI。许多开发人员意识到这一点,并认为“好吧,单元测试对于库代码来说会很棒,但是最后一次我只写了一个类库。”需要一段时间才能到来。为此,没有任何单元测试并不一定意味着未来存在错误的代码。

  • 最后,有时来自单位测试倡导者的传福音水平可能令人生畏和令人反感。说真的,我以为我是个白痴,因为我无法掌握如何模拟某个界面以及我为什么要这样做。自私地,我想讨厌单元测试,只是因为每个人都不会关闭它。没有银弹。

所以,为漫无边际的帖子道歉。总结:

  • 我长时间没有进行单元测试。现在我做。单元测试是一个很好的工具,特别是在维护期间。

  • 对于现有项目,您至少可以进入并编写一个记录当前输入及其输出的测试。当你将来改变那些大杂乱的代码时,你将能够看到你是否改变了那个小快照。这也是改变贵公司发展文化的绝佳方式。

让火焰开始吧! =)

答案 2 :(得分:12)

单元测试不能是事后的想法,而是并且必须某些因素会影响您的设计。我甚至会说,即使你从未编写或调用单个单元测试,它在引导紧密组件驱动的软件方面的好处也是值得花费95%的时间。

答案 3 :(得分:8)

我喜欢Bob Martin的比喻:想象你是一名外科医生。对于想要支付手术但是告诉你提前跳过洗漱的病人,你会怎么说?

当客户雇用我编码时,他们雇用我作为专业人士,作为具有专业技能和纪律的人。我的工作是给他们“代码才能正常工作”,我知道对我来说最好的办法就是使用TDD。

答案 4 :(得分:7)

我尽可能使用单元测试和tdd。然而,根据我对每个单元测试倡导者的经验,有三个或更多的开发人员并不真正相信编写单元测试是值得的,并且它会减慢开发速度。然而,这些人往往保持沉默,所以你不太可能在这里见到很多。

答案 5 :(得分:7)

编写和运行单元测试是健康编码过程的一部分,它不是客户应该选择支付或不支付的额外费用。

测试策略与任何其他策略一样是一个编码问题:使用什么数据结构,变量命名约定,注释标准等。

答案 6 :(得分:7)

在进入生产但需要主要新功能的几个项目之后,我作为技术主管启动项目的一个底线是单元测试是必须的。

尝试重写没有单元测试编写的代码只需要花费太多。代码总是结构不合理(一个数千行的Web服务都在一个代码后面的任何人?)并且在不引入错误的情况下对其进行更改(即使它结构良好)也是一个非常痛苦的过程。

当项目进入灭火模式时(尤其是没有单元测试有助于项目进入该状态),这一点尤其如此 - 客户变得脾气暴躁,他们对项目失去了信心,没有什么比这更糟糕了这个可怜的家伙试图在没有引入一大堆回归错误的情况下进行下一次修复,甚至没有进行单元测试。

通过预先解释测试的价值,可以很容易地避免或至少减轻这些情况。当然,有些情况下单元测试不是那么重要,但它们确实是例外。

是的 - 我坚持进行单元测试,并且花了很多时间来修复依赖于编码技能的其他开发人员制造的混乱。

答案 7 :(得分:4)

我同意Ken的观点,即单元测试是软件开发的一部分。

关于成本问题,这比编写代码和单元测试更长,而不仅仅是编写代码。但是,当您编写代码及其测试(称为TDD - Test-Driven Development)时,您将以“干净的代码”结束。当你只编写代码时,你必须使它工作,这可能是漫长而痛苦的。

另一个好处是你知道你在哪里,因为已编写的代码已经过单元测试。

要回答你的问题,是的,我可以在项目中使用单元测试。我为所有新代码编写单元测试,并努力寻找遗留代码。

答案 8 :(得分:4)

我是单元测试的忠实粉丝,主要是因为它完全上瘾 - JUnit中的“代码测试 - 看到可怕的红色条形 - 修复 - 测试 - 看到可爱的绿色条形”循环会严重影响内啡肽。

答案 9 :(得分:4)

我发现较新的开发人员从单元测试中获益更多,而不是那些不得不向学校学习可能导致失败的陷阱。单元测试不会带来良好的设计 - 它只会导致设计更加可测试。您需要测试代码,但单元测试的方式是危险的。 “它会迫使你更好地设计你的代码”,“你如何测试它是否正确?”。

我更喜欢使用编写良好的结构化代码,当您自动阅读它时,会告诉您它正在尝试完成的内容以及它是如何完成的。函数/类应该小而简洁。他们应该只有一个责任。单元测试不能防止逻辑错误。

单元测试比其他任何事情都更容易出现误报,尤其是在首次编写项目时。好的设计胜过测试 - 测试应该只是验证阶段。我从来没有买过其他一切概念之前的测试。根据我的经验,这种思路倾向于以可扩展代码为代价来支持可测试性(对于一次性项目或一次性实用程序可能没问题,但具有讽刺意味的是,单元测试对于这些并不重要。)

答案 10 :(得分:3)

我经常对复杂的数学算法使用单元测试,例如LineIntersectsLine等函数,您可以在其中定义一些要测试的重要示例。之后,更容易控制此功能。您可以简单地重写/优化它并测试它是否仍然有效,或者您可以在遇到错误时添加新测试,然后尝试更正这些错误。

答案 11 :(得分:2)

我公司为航空航天业的各个公司制造系统组件。 美国联邦航空局要求修改条件/决策覆盖范围用于质量等级A安全关键飞行软件(DO-178-B)因此,我们要进行验证(再次来自DO-178-B):

通常需要分析从测试和结果到所有要求的所有代码和可追溯性(取决于软件级别)。

此过程通常还涉及:

  

基于需求的测试工具

     

代码覆盖率分析工具

     
    

此过程中执行的测试的其他名称可以是:

         
      

单元测试

             

集成测试

             

黑匣子和验收测试

    
  

单元测试始终显示代码错误。

答案 12 :(得分:2)

我从经验中知道,当我编写没有单元测试的代码时,我会遇到一些问题需要解决,但是当我编写单元测试时,我很少听到问题。此外,从编写单元测试的时间开始,我编写了更好的代码。我看一下方法,想一想它们可能会失败的方法,并从一开始就构建它们,不要失败,或者至少以更好的方式失败。

单元测试对于编写更好的代码至关重要,但它也会让你成为一个更好的开发人员,因为你会看到出现问题的地方,并在进行测试之前修复它们。

答案 13 :(得分:1)

单元测试是开发的一个重要部分,而且(我发现)实际上会缩短完成项目的时间,同时提高整体质量,尤其是在TDD时代。

答案 14 :(得分:1)

我做单元测试。我正在构建当前的约束验证引擎,我的客户希望它能够防弹。好吧,如果没有单元测试,我会因压力而死...

是的,我用它了!

答案 15 :(得分:1)

我写的大部分功能都有测试。像许多人所说的那样,单元测试是软件工程的重要组成部分。所以,回答你的问题,是的,我真的会写并运行测试。

此外,使用continuous integration,回归测试将自动进行并不断报告。

答案 16 :(得分:1)

关于依赖我的编码技巧,我发现当我使用TDD时我的编码技能实际上有所提高,并且在我打破测试时依靠我的单元测试来纠正我。您将学习如何使用许多语言功能,因为您可以进行调整以测试假设。

答案 17 :(得分:1)

另一个非常有用的提醒,为什么你想要在这篇文章中出现的任何地方进行单元测试:Top 12 Reasons to Write Unit Tests我需要在我的视网膜上刻上。

我个人可以证明从一开始就考虑如何测试某些东西的价值,并通过每次迭代开发测试。我自己需要更系统化。我现在打印出那份清单。

答案 18 :(得分:1)

如果进行单元测试,您的客户可能会节省整体资金。如果在开发阶段后期而不是在单元测试期间发现,则单元测试所阻止的一些错误更多是一种负担。它在未来节省了很多头痛,现在我使用它我不认为我可以回去。