Unit testing 是否存在过度的单元测试?

Unit testing 是否存在过度的单元测试?,unit-testing,tdd,Unit Testing,Tdd,我对单元测试的概念并不陌生,但同时我也没有掌握它们 最近,当我在使用TDD方法编写代码的同时编写单元测试时,我脑子里一直在想的一个问题是:我应该测试到什么级别 有时我想知道我是否过度使用了单元测试 开发人员应该在什么时候停止编写单元测试并完成实际工作 在人们认为我反对使用TDD之前,我可能需要澄清这个问题 我正在努力解决的是测试的粒度 当我的应用程序有配置文件时,我应该 测试是否可以检索值 从档案中?我倾向于是的……但是 那么我要写一封信吗 每个可能配置的单元测试 将要呈现的值?ie检查它们是

我对单元测试的概念并不陌生,但同时我也没有掌握它们

最近,当我在使用TDD方法编写代码的同时编写单元测试时,我脑子里一直在想的一个问题是:我应该测试到什么级别

有时我想知道我是否过度使用了单元测试

开发人员应该在什么时候停止编写单元测试并完成实际工作

在人们认为我反对使用TDD之前,我可能需要澄清这个问题

我正在努力解决的是测试的粒度

  • 当我的应用程序有配置文件时,我应该 测试是否可以检索值 从档案中?我倾向于是的……但是
  • 那么我要写一封信吗 每个可能配置的单元测试 将要呈现的值?ie检查它们是否存在…并且可以解析为正确的类型
  • 当我的 应用程序将错误写入日志我需要什么 测试它是否能够写入 日志?那么我需要写作吗 用于验证条目是否正确的测试 你真的把它弄坏了

我希望能够使用我的单元测试来验证我的应用程序的行为……但我不太确定该在哪里停止。是否可以编写过于琐碎的测试?

是的,单元测试可能会过度/极端化

请记住,只有必要测试功能;其他一切都是如此

因此,不必测试是否可以从配置文件中读取值,因为一个(或多个)功能需要从配置文件中读取值-如果不需要,则不需要配置文件

编辑:我想说的似乎有些混乱。我并不是说单元测试和特性测试是同一件事——它们不是。Per:“单元是应用程序中最小的可测试部分”,从逻辑上讲,这样的“单元”比大多数“功能”都小

我想说的是,单元测试是极端的,几乎没有必要——除了超关键软件(例如,可能危及生命的实时控制系统)或没有预算和时间限制的项目之外


对于大多数软件来说,从实用的角度来看,测试特性是所有必需的。测试比功能更小的单元不会有什么坏处,这可能会有所帮助,但生产率与质量改进之间的权衡是有争议的。

单元测试需要测试每一项功能、边缘情况,有时甚至是边缘情况

如果您在测试边缘和角落案例后发现,您正在执行“中间”案例,那么这可能是过度的

此外,根据您的环境,单元测试编写起来可能非常耗时,也可能非常脆弱


测试确实需要持续的维护,因此您编写的每个测试将来都可能会中断,需要修复(即使没有检测到实际的错误)-尝试用最少的测试次数进行足够的测试似乎是一个好目标(但不要只是将多个测试拼凑成一个不必要的测试-一次测试一件事情)是的,确实有可能编写过多的单元测试。比如说,

  • 测试getter和setter
  • 测试基本语言功能是否正常工作

在单元测试中,您将编写一个测试,显示可以从配置文件中读取项。您可以测试任何可能的怪癖,以便有一组具有代表性的测试,例如,您是否可以读取空字符串、长字符串或带有转义字符的字符串,系统是否可以区分空字符串或缺少的字符串

完成该测试后,不必每次其他类使用您已经测试过的工具时都重新检查该功能。否则,对于您测试的每个功能,您必须重新测试它所依赖的每个操作系统特性。对给定特性的测试只需要测试该特性的代码负责纠正哪些错误

有时,如果这很难判断,那么它表明需要重构一些东西,以使问题更容易回答。如果您必须为不同的功能编写多次相同的测试,这可能表明这些功能内部共享一些东西,这些东西可以移入单个函数或类中,测试一次,然后重新使用


从广义上讲,这是一个经济学问题。假设您已经停止了不必要的重复测试,您能负担多少测试来完成?由于可能发生的各种情况的组合,实际上不可能为任何非平凡的程序编写真正完整的测试,因此您必须进行调用。许多成功的产品,包括一些有史以来最著名的桌面应用程序,尽管在最初发布时没有进行单元测试,但它们已经占领了全球。他们不可靠,但足够好,如果他们在可靠性方面投入更多,那么他们的竞争对手就会击败他们,使他们在市场份额上占据第一位。(看看Netscape,他凭借一款众所周知不可靠的产品获得了第一名,但当他们花时间以正确的方式做每件事时,它就彻底消失了)。这不是我们作为工程师想要听到的,希望这些天的客户更挑剔,但我怀疑不是太多。

绝对有可能过度进行单元测试,测试功能是一个很好的开始。但也不要忽视测试错误处理。当给定的输入不满足其前提条件时,您的单位应做出明智的响应。如果您自己的代码是错误输入的原因,那么断言失败是明智的响应。如果用户可能导致错误输入,那么您需要对异常或错误消息进行单元测试

每个报告的bug都应该导致至少一个单元测试

关于你的一些细节:我