您问题的答案
有太多的单元测试吗?
当然...例如,您可能有多个测试,乍看之下似乎并不相同,但实际上测试的是相同的东西(逻辑上取决于被测试的“有趣”应用程序代码的相同行)。
或者,您可以测试代码的内部结构,这些内部结构永远不会向外浮出水面(即,它不是任何类型的接口协定的一部分),在那里人们可能会争论是否完全有意义。例如,内部日志消息的确切措辞或其他内容。
我的任务是为现有应用程序编写单元测试。完成第一个文件后,我有717行测试代码和419行原始代码。
这让我感到很正常。您的测试会在实际测试的基础上花费大量代码来进行设置和拆卸。该比率可能会提高,也可能不会。我本人的测试相当繁重,并且经常在测试上花费比实际代码更多的时间和精力。
随着我们增加代码覆盖率,这个比率会变得难以管理吗?
该比率没有考虑太多。测试还有其他一些性质,往往使其难以管理。如果在对代码进行相当简单的更改时经常需要重构大量测试,则应仔细查看原因。这些不是您拥有多少行,而是您如何进行测试编码。
我对单元测试的理解是测试类中的每个方法,以确保每个方法都能按预期工作。
从严格意义上讲,这对于“单元”测试是正确的。在这里,“单位”类似于方法或类。“单元”测试的重点是仅测试一个特定的代码单元,而不是整个系统。理想情况下,您将删除系统的整个其余部分(使用double或诸如此类)。
但是,在请求请求中,我的技术负责人指出我应该专注于更高级别的测试。
然后,当人们说单元测试时,他们就陷入了假设人们实际上意味着单元测试的陷阱。我遇到了许多程序员,他们说“单元测试”,但含义完全不同。
他建议测试该类最常使用的4-5个用例,而不是详尽地测试每个功能。
当然,只专注于重要代码的前80%也会减少工作量……我感谢您对老板的评价很高,但这并不是我的最佳选择。
对我来说,100%的单元测试覆盖率是一个崇高的目标,但是即使我们只达到50%,我们也知道那50%的覆盖率达到了100%。
我不知道什么是“单元测试范围”。我假设您的意思是“代码覆盖率”,即运行测试套件后,每行代码(= 100%)至少执行了一次。
这是一个不错的标准,但到目前为止,还没有达到最佳标准。仅仅执行代码行并不是全部。例如,这并不说明通过复杂的嵌套分支的不同路径。它更像是一种指标,将其手指指向测试过少的代码段(很明显,如果一个类的代码覆盖率为10%或5%,则出问题了);另一方面,100%的覆盖率不会告诉您您是否已经测试足够或测试是否正确。
整合测试
默认情况下,当人们今天不断谈论单元测试时,这使我非常恼火。我认为(和经验),单元测试对于库/ API非常有用;在更多面向业务的领域(我们在此处讨论用例,例如眼前的问题),它们不一定是最佳选择。
对于一般应用程序代码和一般业务(在这方面,赚钱,按时完成任务和提高客户满意度很重要,并且您主要想避免直接出现在用户面前的错误或可能导致真正灾难的错误-我们不是这里所说NASA火箭发射),整合或功能测试是很多更加有用。
它们与行为驱动开发或功能驱动开发并驾齐驱。根据定义,那些不适用于(严格)单元测试。
为了简短起见,集成/功能测试会遍历整个应用程序堆栈。在基于Web的应用程序,它会像一个浏览器通过点击应用程序(也没有,显然不具备成为该简单化,有非常强大的框架存在,要做到这一点-退房的http://黄瓜。 io)。
哦,回答您的最后一个问题:通过确保仅在新功能实施和失败后才对其进行编程,才能使整个团队具有较高的测试覆盖率。是的,这意味着所有功能。这样可以保证 100%(正)的功能覆盖率。根据定义,它可以保证您应用程序的功能永远不会“消失”。它不能保证100%的代码覆盖率(例如,除非您主动编程否定功能,否则您将不会执行错误处理/异常处理)。
它不能保证您没有错误的应用程序。当然,您会希望针对明显或非常危险的错误情况,错误的用户输入,黑客行为(例如,周围的会话管理,安全性等)编写功能测试;但是,即使仅对肯定的测试进行编程也具有巨大的好处,并且对于现代,强大的框架而言是完全可行的。
功能/集成测试显然具有其自身的蠕虫能力(例如,性能;对第三方框架的冗余测试;由于您通常不使用double,因此根据我的经验,它们也往往更难编写...),但是我d每天都要使用100%经过正面功能测试的应用程序,而不是100%经过代码覆盖率单位测试的应用程序(不是库!)。