如今,单元测试对此有些神秘。人们将其视为100%的测试覆盖率是一个圣杯,并且将单元测试视为开发软件的唯一途径。
他们错过了重点。
单元测试不是答案。 测试是。
现在,每当讨论出现时,都会有人(甚至是我)大声疾呼Dijkstra的名言:“程序测试可以演示错误的存在,但从不演示错误的存在。” Dijkstra是正确的:测试不足以证明软件能够按预期工作。但是这是必要的:在某种程度上,必须有可能证明软件正在按照您想要的方式工作。
许多人手工测试。即使是坚定的TDD爱好者也可以进行手动测试,尽管有时他们会拒绝这样做。它无济于事:就在您进入会议室将软件演示给客户/老板/投资人/等人之前,您将手动操作以确保其能正常工作。这没什么不对,事实上,即使没有100%的单元测试覆盖率和对测试最大的信心,只是期望一切都能顺利进行而无需手动运行(也就是测试),这将是疯狂的事情。
但手动测试,即使它是必要为构建软件,很少足够。为什么?因为手动测试是繁琐且耗时的,并且由人工执行。而且,众所周知,人类在执行乏味且耗时的任务方面很糟糕:他们尽可能避免执行这些任务,并且在被迫执行任务时往往做得不好。
另一方面,机器在执行乏味且耗时的任务方面非常出色。毕竟,这就是发明计算机的目的。
因此测试至关重要,而自动化测试是确保测试始终如一的唯一明智的方法。随着软件的开发,测试和重新测试很重要。这里的另一个答案指出了回归测试的重要性。由于软件系统的复杂性,对系统某一部分的频繁看似无害的更改会导致系统其他部分的意外更改(即错误)。没有某种形式的测试,您将无法发现这些意外的更改。而且,如果您想获得有关测试的可靠数据,则必须以系统的方式执行测试,这意味着您必须拥有某种自动化的测试系统。
这与单元测试有什么关系?好吧,由于其性质,单元测试是由机器而不是人工来运行的。因此,许多人误以为自动化测试等于单元测试。但这不是事实:单元测试只是超小型的自动化测试。
现在,超小型自动化测试的价值是什么?优势在于它们可以隔离测试软件系统的组件,从而可以更精确地确定测试目标,并有助于调试。但是单元测试并不是本质上意味着更高质量的测试。由于它以更精细的级别涵盖软件,因此通常会导致更高质量的测试。但是可以完全测试整个系统的行为,而不能测试其组合部件的行为,并且仍然可以对它进行彻底的测试。
但是,即使具有100%的单元测试覆盖率,仍可能无法对系统进行彻底的测试。因为单个组件可以孤立地完美工作,但是一起使用时仍然会失败。因此,单元测试虽然非常有用,但不足以确保软件按预期运行。实际上,许多开发人员通过自动集成测试,自动功能测试和手动测试来补充单元测试。
如果您没有在单元测试中看到价值,那么最好的入门方法是使用另一种自动化测试。在Web环境中,使用诸如Selenium之类的浏览器自动化测试工具通常会以较小的投资获得巨大的成功。将脚趾浸入水中后,您将更容易看到自动化测试的帮助。而且,一旦有了自动化测试,单元测试就变得更加有意义,因为它可以提供比大型集成或端到端测试更快的周转时间,因为您可以将测试仅针对当前正在使用的组件进行测试。
TL; DR:不必担心单元测试。只需担心先测试软件即可。