如果unit testing这么好,为什么没有更多的公司在这样做呢?
我所从事的第一个真正的软件公司就是unit testing(NUnit)。 我不知道当时我们是真正的坚持者 – 我不知道我们的代码覆盖是什么样的,我正在写大部分的unit testing。 从那时起,我遇到了一些进行大量testing的公司,但这是testing的主angular:依靠一个人在那里,具有较低的重复性和很less发现错误的可能性。 另一种态度是:这是他们想要用“未来”去做的事情; 基本上当金钱从天而降。
我想念unit testing – 它只是让生活更轻松。 但是我发现,当我寻找一份新工作时,unit testing或者是公司希望在未来可以“一起工作”的东西,或者是他们根本不想做的事情(呃,它已经存在一段时间了现在!)。 我想说,在过去的两年里,我看过的60-75%的工作要求都没有列出unit testing。 我只能想到一个或两个具有unit testing经验的要求(对于中级开发人员职位)。
所以问题是什么 ? 我认为这会让人们更富有成效,但是这只是在花费了大量的时间才能做到的。 对于unit testing的成本节省没有任何好的研究吗? 这是我正在看的公司types吗?
编辑:即使标题有点恶魔倡导者,我认为自己是一个unit testing的支持者。
根据我的经验,这有几个因素:
- pipe理层并不真正了解unit testing究竟是什么,或者为什么对他们有真正的内在价值。
- pipe理层往往更关注快速的产品交付,并且(错误地)认为unit testing会对这个目标产生反作用。
- 有一种误解,认为testing完全属于质量保证的范畴。 开发人员是编码人员,不能编写testing。
- 有一种常见的误解,即pipe理人员不得不花钱做正确的unit testing,尽pipe这些工具是免费提供的。 (当然,开发人员需要考虑时间,但这并不是真的令人望而却步。)
- 威尔的答案将围绕这个答案:这是很难确定testing代码的价值(编辑jcollum)
当然,还有其他一些因素,但这些正是我迄今为止所遇到的。
1)很难
2)需要时间
3)确定testing代码的价值是非常困难的
第3点是一个粘性的。 良好的unit testing可以减less错误。 但是好的生产代码也是如此。 你如何确定有多less错误因为你的unit testing而不存在? 你不能衡量什么不存在。 你可以指向研究,但是他们不适合你的业务经理的电子表格。
把所有的责任归咎于“pipe理”是容易的。但pipe理层是否真的告诉你特别不做任何unit testing?
一般来说pipe理层不会(也可能不应该)告诉你如何做你的工作,无论是模块化,抽象数据types,devise模式还是unit testing。 这些都是一个成功的,有能力的软件工程师应用的交易工具,但是一个贫穷的工程师却不能。
我认为你的问题真正的答案是:unit testing真的很难,而计算机科学的学生没有受过培训。
编写自己的string类时很容易。 当您testing真实产品时,遇到幻灯片中没有人提到过的挑战:
- 用户交互。 一半的应用程序是用户界面的逻辑。 你如何以自动化的方式进行testing,如果你移动一个button不会中断?
- 与外部API和框架的交互。 如果您正在编写Windows内核驱动程序,您如何对其进行unit testing? 你是否为每个使用的IRP和内核函数编写存根,有效地创build一个OS内核的模拟?
- networking通信是21世纪的事情。 你如何协调由多个分布式组件组成的unit testing?
- 你如何select好的testing用例? 我经常看到人们试图“在1000次迭代循环中做随机事件,看看是否中断”方法。 当你这样做的时候,努力比回报要高,错过了重要的错误,unit testing被放弃了。
- 你如何testing满足性能要求?
- testing模式知识稀缺:存根,jar头响应,回归testing是大多数人不知道的概念。 你工作的地方有多less人真的读了一本关于unit testing的书?
我们可以指责pipe理的一件事是,需求规格很less包含对交付品质量级别的任何要求。
下次你的老板要求你做一个时间估计,包括编写unit testing的时间,看看会发生什么。
大多数testing不testing任何东西。
你写一个fileopen()函数和一个unit testing,如果文件不存在,则失败,如果该文件存在,则成功。 大! 现在,你检查它是否与BIG5中文文件名一起工作? 在NFS共享? 在Vista上与U盘上的文件和UAC打开?
问题在于,unit testing是由编写函数的同一个程序员编写的,也是由同一套假设和相同的技能水平组成的。 要真正开展testing,必须由其他人编写,只有发布的规范没有看到代码。 – 在大多数公司只是获得书面规格将是一个突破!
unit testing检查单个函数代码中的错误。 他们可以在数据访问层,math库等工作,input/输出是众所周知的,内部结构是复杂的,但在很多情况下,他们只是浪费时间。
当错误是由于代码的不同部分之间或与操作系统和用户之间的交互而导致失败时。 诸如高/低DPI设置混淆对话框或外语设置交换'。 和','通常不会被find。
已经有关于unit testing的ROI的研究 – 看到这个问题 。
我发现很多对unit testing不感兴趣的开发人员。 当你开始的时候,总是看起来像很多工作,没有多less回报。 没有人想签署额外的工作,所以他们抵制。 一旦人们开始,他们通常热烈地坚持下去,但是让他们开始可能很难。
除了采用unit testing的问题之外,unit testing并不总是值得的,但总的来说,我认为是正确的。 unit testing没有什么特别之处,可以使他们免于受到不良build设的影响。
unit testing具有成本(创build,维护和运行),只有提供比这些成本更大的收益才是有价值的。 testing创造是一种技能,它需要具体的经验和成功的知识。 没有足够的经验,对于那些经验丰富的开发人员来说,创build低质量,低价值和/或高成本的unit testing是很不容易的。 尤其是如此判断一个unit testing的价值是多么困难。
另外,unit testing只是提高代码质量的一种方法,但并不是唯一的方法。 在某些情况下,有些团队可能不是提高软件质量的最有效方法。
请记住,在unit testing中投入大量精力并不能保证高质量的软件。 而且,也有可能在没有任何unit testing的情况下生产最高质量的软件。
在那里有很多公司没有沿着最佳实践行事。 没有代码评论,没有unit testing,没有testing计划,没有任何东西,只是在他们的裤子座位。
以此为契机,让他们使用持续集成平台并开发unit testing! 简单的方法来打动你的代码的能力,同时提高你的代码的质量和稳定性
编辑:至于原因,我认为他们只是简单的没有意识到目前的工具,使CI和unit testing非常容易。
那么,我的公司还没有跟TDD或unit testing一起去。 说实话,我们不知道该怎么做。 我们显然可以为像CapitalizeString()等愚蠢的函数做这件事,但我们不知道如何处理复杂对象的高度复杂的系统。 而且,大部分被访者都有零经验或有限的经验。 从SO人群来看,unit testing看起来很大,但在可用的工作中并不是特别大。
TDD是一个单独的主题。 我们道德上反对TDD。 我们不是牛仔编码员,但是我们确实认为这阻碍了项目的创造性和灵活性。 而且,编写unit testingfunction的编码人员是没有意义的。 当我做一些事情的时候,我会对所有我能想到的边缘案例进行编码。 我需要的是另一个大脑来寻找我可能错过的东西。 我们没有这个 团队规模小,自成体系。
总之,我们不相信TDD,但是我们想unit testing。 我们只是没有这样的经验,我们不能轻易find它。
与编译器一样,unit testing应该只是代码开发工作stream程的一个自然部分。
不过,这要求教育pipe理单位testing的好处。 尽pipe如此,初级开发者的机会相对较低。 因此,公司是否是unit testing的支持者,取决于他们是否拥有一名高级开发人员或架构师,他们是unit testing的倡导者。
我相信这是你的问题的答案“缺less什么,为什么不是更多的公司做unit testing” 。 🙂
它可能是你已经提到的一些事情的组合。 很难衡量TDD的成本节约。 如果你想外包你的IT,你可以显示你每年支付给员工的人员的费用与承包的费用; 它非常具体。 How do you say,“哦,这个testing发现了一个错误,这将花费我4个小时来debugging和修复…”?
有些地方不使用它的原因很简单,因为开始和继续需要很多工作。 编写unit testing花费的时间与编写实际function所花费的时间差不多,一些pipe理人员似乎将开发人员的生产力降低了一半。
最重要的是,你build立团队(或某人)需要把基础设施安置好并维护它。
正如艾伦所说,很多地方根本不使用最佳实践 – 他们只是想看到一些有形的东西。
我不认为懒惰是unit testing不当的根本原因。 对于我的公司来说,时间的限制和“完成它”的态度是做unit testing的最大障碍。 此外,我们的系统失败的地方往往更多地集中在一级(服务,数据库访问,需要特定数据进行testing的复杂查询),而不是“单位级别”。 这些东西很难testing,如果你没有足够的时间来完成这个function,你可能没有时间去同时完成任何有用的testing。
我认为程序员必须开始这样做。 开始的一些简单testing很容易certificate是开发的一部分。
像unit testing一样几乎总是需要快速debugging转身。 只要解释启动testing的速度比安排正确的input,设置debugging器断点,启动应用程序等要快得多。
在代码中loggingtesting。 只要说一下解释testing在哪里以及如何运行。 未来的程序员会看到它,希望testing会传播!
从我所看到的,很多公司都有巨大的,高度耦合的代码库,实际上不是unit testing的。 他们也没有体面的可testing的要求,所以unit testing将testing“build立”事实上的要求。
unit testing是大多数人听说过的黑匣子术语之一,但不知道unit testing到底是什么,从哪里开始,如何编写它们,如何真正运行testing,testing什么,等等。等等
在很多情况下,不确定的开发人员更容易将其视为不必要的或者只是“企业级开发人员”所需要的一些结冰。
我是unit testing的狂热粉丝,我也是一家公司的合作伙伴,为不同types的客户进行合同开发项目。 在一个月内,我们会触及3-4个不同尺寸的不同项目。
如果一个项目看起来像是一次性的,那么我不会在unit testing上投入巨资,因为unit testing并没有为我的业务做出回报。 在这些types的项目中,我将unit testing我不确定/不熟悉或可能频繁更改的事物(例如,我无法控制的数据源的parsing器)。
而如果我正在构build一些我知道会有很长一段时间的工作,那么这是一个更大的工作,我将通过多次迭代来进行工作,或者如果发生错误,将会对我的客户产生很大的影响,我打算投资更多的unit testing。 testing的优先次序围绕着不确定/不熟悉/不断变化的代码。
我认为unit testing应该围绕着一个任务的复杂性,以及它们是否会得到回报。 编写额外的代码是没有意义的,不会被使用。
根据我的经验,这取决于你正在编写的软件。 我发现为UI编写unit testing是非常困难的。 我只对具有明确进/出的系统部分使用unit testing。
我想念unit testing – 它只是让生活更轻松。
这实际上不是公司采用unit testing的充分理由。
一个充分的理由可能是“便宜”(和/或“更好”):这并不容易certificateunit testing。
唯一好的理由可能是“编写unit testing是开发人员时间的最佳利用”,这实际上很难certificateIMO:在某些地方,某些软件,某些开发人员,在其他地方可能是这样。
有很多开发人员不认为unit testing的世界:包括一些认为其他forms的testing(例如自动集成/functiontesting)可能更便宜和更有价值的人,例如, 我是唯一一个没有进行unit testing的开发人员,像unit testing?
当然,在理想的世界里,你不能反对进行unit testing。
然而,你是否写unit testing取决于许多事情:
-
软件将如何使用。 如果你正在为自己编写软件,你会写unit testing吗? 可能不会。 如果你正在编写预先打包的商业软件,可能是的。
-
有多less人维护代码….如果只是你自己,那么你可能已经知道了足够的信心,在做出改变之后,快速运行代码就足以确保没有任何事情发生。 如果其他原本没有编写代码的人现在必须维护它,那么unit testing将帮助他们相信,当他们更新代码来修复一个很大的(这显然不是在unit testing中捕获的)时,他们没有破坏任何东西。
-
代码复杂度:只testing需要testing的代码。 一行variables赋值方法不需要testing。 具有多个执行path的50行方法可能会执行。
-
实际的商业考虑因素:事实是编写unit testing需要的时间比不这样做要长。 如果你正在编写一个原型软件,那么这个软件的商业前景是不确定的,那么现在,在代码快速运行之间还有一个回报,那就是在2周内unit testing代码运行得更好。 有时候,如果软件会有一个短小的架子,并且继续进行下一个项目,那么快速找出(消费者偏好)是值得的。
正如其他人所指出的那样,一个testing只和写它的人一样好。
主要原因是许多开发人员和开发经理不知道存在unit testing或者如何使用它们。
第二个原因是unit testing只能使用(明智的方式)已经满足一些质量标准的代码。 有可能,现有的一些代码库不属于这个类别。
第三个原因是懒惰和/或廉价。
我认为问题的一部分就是开发人员期望商务人员拥有相同的价值观,并真正关心“我们应该unit testing还是不应该?”的答案。 我们事先没有得到业务部门的批准,使用高级语言而不是汇编语言 – 这通常是完成工作的明智方式。
关键是, 我们是唯一有资格进行这一呼吁的人(这并不是说我们所有人都对这个话题有相同的认识)。 而且,即使你的团队没有按照政策的要求进行unit testing(或者说你的方法),但这通常并不意味着你不能这样做。
事实是,我们无法真正certificate我们所做的大部分工作都是以精细的方式实现的。 为什么unit testing不符合这个不合理/非典型的certificate标准是超出我的…
人们很懒,只有在被迫时才采取变化。
我的2美分:
- 这需要一些教育和纪律,但新gradle生已经有了适当的知识。
- testing开销可以通过更好的工具来减less,这也正在发生(重构等)
所以,这只是时间问题。
鲍勃·马丁(Bob Martin)断言马丁 – 科普伦(Martin-Coplien)的辩论是:
“现在,开发者在unit testing中发布一行他没有执行的代码是不负责任的。”
如果您想在testing中销售所有人,请执行以下操作:
- 写一堆testing。
- 通知其他开发者谁更改代码,并通过testing(S)。
- 他们将修复他们的代码。
- 现在你可以释放这些特定的错误。
即使是经理也能理解这一点。
公司没有进行unit testing,出于同样的原因,许多网站写得很差 – 无知,而且人们习惯于习惯。 在我的公司,我们开始进行unit testing(使用Nunit和Typemock ),我们达到了更高的代码覆盖率,并在更短的时间内推出了软件。
像大多数好的想法一样,采用更多的是与组织的path依赖而不是想法的质量。
在大多数已经交付产品的公司中,已经build立了一个质量保证部门,拥有高级质量保证部门负责人。 testing是QA团队的领导。
QA团队不太可能编写unit testing代码,因为公司通常不会为质量保证团队配备重型编码器。
编程团队不愿意编写testing代码,因为它会与QA团队产生冲突。
我已经看到更多的兴趣和采用unit testing的小组中,QA没有被分解成单独的工作职能
编写和更新unit testing简单,花费不菲。 大多数公司以前的软件没有unit testing,花费太多的时间来编写。 所以他们不这样做,它增加了开发过程的时间,所以他们也不会把它添加到新的function。
大多数公司是无用的。 显然,不是你(或我)工作的那个人。
有两件事是unit testing的障碍
- 一切都很难做到
- 一切没有可衡量的利润,是不好的。
- 人类是懒惰的。 开发者的确如此。
在我的公司(> 5.000 emp)unit testing“在那里”,但没有机会做TDD或得到一个大的代码覆盖。 这很难完成。