单元测试多少钱是件好事?

时间:2009-10-02 15:49:17

标签: unit-testing testing junit automated-tests

(没有“相关问题”似乎指出这一点,所以在这里。)

我处理生产代码。争论用户不可见的任何事情有时很难做到。如果销售人员无法看到它,那么这对他们来说是一个外部成本,他们会反对它,除非有充分的理由不这样做。

多少单元测试是件好事?如果您测试每个类,每个方法,您当前的版本将花费更长时间,可能更长。如果您没有进行任何测试,将来的维护将花费更长的时间,可能会更长,因为错误修正和新功能会导致您无法预见的问题,并且单元测试会被捕获。

您如何找到健康,合理的平衡?

编辑:回答人们合理提出的一些问题......

  1. 销售人员没有运行该流程,但他们肯定有输入, 在任何组中都有限制输入。他们是支付账单的人。如果他们完全指导一切,那显然是不合理的。

  2. 我确定没有最佳答案,但我很好奇其他人认为合理的事情。我期待两种极端(一切!没有!),中间还有很多。

  3. 没有人可以选择他们的经理,如果一个关于单元测试的错误政策是与公司住在一起的成败决定/ project ...你有一个很多比我们大多数人,朋友更多的职业选择。 :-)

  4. 第二次编辑:“正当”是一个重要的词。如果我希望有时间预算/允许进行单元测试,并且不想隐藏它,我将需要证明其原因。对我来说,现在最重要的答案是“之前已经破解的测试事物”,因为我总能证明反应政策的合理性。

    关于如何为积极主动的事情辩护的任何想法?

15 个答案:

答案 0 :(得分:15)

最小单位测试的两个建议,将提供最大的“降压”:

首先分析您的应用程序以找到最常用的部件 - 确保这些部件经过单元测试。继续向外移动到不太常用的代码。

修复错误后,编写一个可以检测到它的单元测试。

答案 1 :(得分:14)

我认为这是一个谬论:

  

如果你测试每个班级,每个方法,   您当前的版本需要更长时间,   可能更长。

测试 - 尤其是测试优先 - 改善我们的流量,让我们保持在区域内,实际上加速了我们。我的工作做得更快,因为我测试了。它未能通过测试减缓我们的速度。

我不测试getter和setter;我认为这是毫无意义的 - 特别是因为它们是自动生成的。但几乎所有其他事情 - 这都是我的做法和建议。

答案 2 :(得分:5)

向我提出的建议是:

  • 按你的想法尝试;过了一会儿,评估自己:
  • 如果测试花费的时间超过您认为合理的时间,并且您的投资回报率太低,那么测试的次数就会减少。
  • 如果您的产品经过足够的测试而且您已经浪费了时间,请进行更多测试。
  • 根据需要循环。

另一种算法: - )

  • 有些测试非常简单,非常实用。始终以高优先级执行此操作。
  • 某些测试确实难以设置,很少有用(例如,它可能会在您的过程中经常发生的人工测试中重复)。停止这样做,它正在浪费你的时间。
  • 介于两者之间,尝试找到余额,这可能会随着时间的推移而变化,具体取决于项目的各个阶段......

更新评论,关于证明某些测试的有用性(你坚信的那些):

我经常告诉年轻的同事,我们,技术人员(开发人员等)缺乏与管理层的沟通。正如您所说,对于管理层而言,未列出的成本并不存在,因此他们避免使用这些成本无法证明其他成本合理。我曾经也对此感到沮丧。但想一想,这就是他们工作的本质。如果他们在没有正当理由的情况下接受不必要的成本,他们就会成为糟糕的经理!

这并不是说我们认为这些活动是有用的,这些活动是正确的。但我们首先要明确成本。更重要的是,如果我们以适当的方式报告成本,管理层将不得不做出我们想要的决定(或者他们将是糟糕的经理;请注意,决策仍可能优先考虑......)。因此,我建议跟踪成本,以便不再隐藏它们:

  • 在您跟踪消费时间的地方,单独记下未经测试的代码(如果工具中没有,请将其添加为评论)
  • 在专用报告中汇总这些费用,如果该工具没有,那么每周,您的经理会读到您花费的时间的X%
  • 每次评估负载时,分别评估几个选项,无论是否进行自动化测试,显示手动测试或自动测试的时间大致相同(如果您将自己限制在最有用的范围内)测试,如前所述),而后者是反对回归的资产。
  • 将错误链接到原始代码。如果链接不在您的过程中,请找到一种方法来连接它们:您需要证明该错误来自于没有自动测试。
  • 还累积了这些链接的报告

要真正影响经理,您可以每周向他们发送最新的电子表格(但包含整个历史记录,不仅仅是本周)。 SpreadSheet提供了立即理解的图形,让不信的经理得到原始数字......

答案 3 :(得分:5)

开始为最有问题的区域创建单元测试(即经常断开并导致销售团队和开发人员之间进行大量通信的代码部分)。这将导致销售团队和其他人员立即产生明显的影响。

然后,一旦你有可信度并且他们看到了价值,就开始添加较少问题的区域,直到你开始注意到ROI不再存在。

理论上确实完全覆盖是好的,但在实践中通常没有必要。更不用说太贵了。

答案 4 :(得分:3)

“成本”是在开发期间支付的,当它更具成本效益时,并且在持续维护期间实现回报,而修复错误则更加困难和昂贵。

我通常总是对以下方法进行单元测试:

  • 读/写数据存储
  • 执行业务逻辑,
  • 验证输入

然后,对于更复杂的方法,我会对它们进行单元测试。对于简单的事情,比如getter / setter,或简单的数学,我不会测试。

在维护期间,大多数合法的错误报告都会进行单元测试,以确保不会再发生特定错误。

答案 5 :(得分:3)

我始终相信不是极端。特别是当时间和精力有限时。你无法全部测试。

并非每个方法/功能都需要单元测试。以下可能不需要。 (1)明显不复杂的一个,如get / set,little condition或loop。 (2)将通过其他方法调用的单元测试。

有了这两个标准,我认为你可以削减很多这些标准。

只是一个想法。

答案 6 :(得分:2)

IMO,如果足以让那些继承代码的人有一个想法,以便他们可以开始进行更改,无论是修复错误还是进行增强,而不必花费数天时间阅读代码来获取它,那就是我的建议。

因此,不要测试所有的东西,但要覆盖一些常见的情况和一些边缘情况,只是为了看看如果事情没有按照最初的规定发生会发生什么。

答案 7 :(得分:2)

进行足够的测试,以便您可以放心,测试会抓住一个糟糕的重构器。通常,它足以测试逻辑和管道/接线代码。如果您的代码基本上是getter / setter,为什么要测试它们?

关于销售人员认为不需要测试的意见 - 好吧,如果他们知道这么多,他们为什么不进行血腥编码?

答案 8 :(得分:1)

自动化单元测试带来了很多好处。我们在几个项目中使用过它。如果有人打破了构建,那么每个人都会立即知道是谁做的并且他们会修复它。它也内置于Visual Studio的更高版本中。看看

  

测试驱动开发

它应该为您节省大量时间,并且不会产生大量开销。希望这可以帮助!如果是,请标记。

答案 9 :(得分:0)

对于单元测试,我公司采用了一个相当不错的策略:我们有一个分层应用程序(数据层,服务层/业务对象,表示层)。

我们的服务层是与数据库交互的唯一方式(通过数据层中的方法)。

我们的目标是至少为服务层中的每个方法进行基本的单元测试。

它对我们有用 - 我们并不总是彻底检查每个代码路径(特别是在复杂的方法中),但每种方法都有最常见的代码路径验证。

除非通过服务层测试,否则我们的对象不经过单元测试。它们也往往是“哑”对象 - 除了那些所需的方法之外,大多数都没有方法(例如Equals()和GetHastCode())。

答案 10 :(得分:0)

开发人员测试的目的是加速开发具有可接受质量水平的已完成软件。

这导致两个警告:

  1. 完全可能做错了,所以它实际上会减慢你的速度。因此,如果你发现它减慢了你的速度,很可能是你做错了。
  2. 您对“可接受的质量”的定义可能与营销的定义不同。最终,他们是正确的,或者至少拥有最终决定权。
  3. 工作的软件是一个专业的利基市场,相当于由专业昂贵的材料制成的高端工程硬件。如果你在那个市场之外,那么客户将不再希望你的软件可靠地工作,而不是期望他们的衬衫停止子弹。

答案 11 :(得分:0)

单位测试多少是好事:

单元测试并非一成不变,一旦完成并且您的工作完成,它将持续产品的使用寿命,直到您不再停止对产品的进一步开发

基本上每次都要进行单元测试:   1)你做了一个修复

2)新版本

3)或者您找到了新的问题

我没有提到开发期,因为在此期间您的单元级别测试已经发展。

这里的基本要素不是数量(多少),而是单位测试的覆盖范围

例如:对于你的应用程序,你喜欢一个特定功能X的问题,你做了一个                 修复X,如果没有其他模块被触摸,你可以进行单元测试                 适用于模块X,现在这是X点的单元测试数量                 覆盖

所以你的单位测试必须检查:

1)每个界面

2)所有输入/输出操作

3)逻辑检查

4)特定应用结果

答案 12 :(得分:0)

我建议拿起这本书The Art of Unit Testing。第8章介绍了将单元测试集成到您的组织中。有一个很棒的表(第232页)显示了两个小组的试验结果(一个使用测试,一个没有);测试团队将整个发布时间缩短了两天(包括集成,测试和错误修复),并且在生产中发现了1/6的错误。第9章讨论了使用遗留代码获得最大优势的测试可行性分析。

答案 13 :(得分:0)

虽然有可能过度测试(收益递减点),但很难这样做。测试(特别是在过程早期测试)可以节省时间。缺陷在产品中停留的时间越长,修复成本就越高。

经常测试早期测试并完全按照实际测试!

答案 14 :(得分:0)

虽然单元测试非常有用,但您确实应该为每个版本制定一个系统测试计划 - 这应该包括测试应用程序的正常用例(用于回归)和更深入处理的特定功能。

自动化系统测试对于避免回归非常重要 - 单元测试都可以通过,你的应用程序仍然是粪便。

但如果您无法对所有用例进行自动化系统测试(大多数应用程序都有复杂的用例,特别是在与第三方系统和用户界面交互的情况下),那么您可以运行手动系统测试。

用户界面会产生主要问题 - 大多数其他事情都可以相对轻松地自动化。有很多工具可以自动测试用户界面,但它们非常脆弱,即在每个版本中都需要调整自动测试才能通过(假设没有新的错误)。