我已经将单元测试引入到以前没有的单元库中。当我到达团队时,我参与的最后一个大项目是产品在生产时已经进行了零单元测试。当我离开时-两年后-我们进行了4500多个测试,在具有230000 +生产LOC(实时财务Win-Forms应用程序)的代码库中,代码覆盖率约为33%。听起来可能很低,但是结果是代码质量和缺陷率有了显着提高-士气和盈利能力也得到了提高。
只要您对有关各方都具有正确的理解和承诺,就可以做到这一点。
首先,必须了解单元测试本身就是一项技能。您可以按照“常规”标准成为非常有生产力的程序员,而仍然难以以能够在较大项目中扩展的方式编写单元测试。
此外,特别针对您的情况,将单元测试添加到没有测试的现有代码库中本身也是一项专门技能。除非您或您的团队中的某人在将单元测试引入现有代码库方面具有成功的经验,否则我会读Feather的书(不是可选的,也不推荐这样做)。
向代码的单元测试过渡是对人员和技能的投资,就像对代码库质量的投资一样。就心态和管理期望而言,了解这一点非常重要。
现在,对于您的评论和问题:
但是,我担心如果最终从一开始就使用TDD,最终会错过总体情况,最终会错过一些基本测试。
简短的回答:是的,您会错过测试,是的,它们最初可能看起来不像在绿色田野中的情况。
更深层次的答案是:没关系。您从没有测试开始。开始添加测试,然后进行重构。随着技能水平的提高,开始提高添加到项目中的所有新编写代码的标准。持续改进等...
现在,在两行之间阅读时,我得到的印象是,这种思想来自“完美作为不采取行动的借口”的思想。更好的心态是专注于自我信任。因此,由于您可能尚不知道该怎么做,因此您将找出解决方法,并填补空白。因此,没有理由担心。
再次,它是一种技巧。您不能以一种线性方式从一种“过程”或“循序渐进”的“烹饪书”方法从零测试过渡到TDD完美。这将是一个过程。您的期望必须是逐步和逐步的进步与改进。没有神奇的药丸。
好消息是,随着几个月(甚至几年)的过去,您的代码将逐渐开始成为“适当的”经过良好分解和测试的代码。
作为旁注。您会发现在旧代码库中引入单元测试的主要障碍是缺乏内聚力和过多的依赖关系。因此,您可能会发现,最重要的技能将变成如何打破现有的依赖关系和解耦代码,而不是自己编写实际的单元测试。
是否应遵循任何流程/步骤,以确保对现有解决方案进行正确的单元测试,而不是仅仅局限于其中?
除非您已经拥有它,否则请设置构建服务器并设置一个持续集成的构建,该集成将在每个签入(包括具有代码覆盖率的所有单元测试)上运行。
训练你的人。
从客户的角度出发,在某处开始并开始添加测试(请参见下文)。
使用代码覆盖率作为测试您的生产代码库的指导性参考。
建立时间应始终为FAST。如果您的构建时间很慢,那么您的单元测试技能就会落后。找到较慢的测试并加以改进(解耦生产代码并单独进行测试)。写得好,您应该能够进行数千个单元测试,并且仍然可以在10分钟内完成构建(〜1毫秒/测试是一个很好的方法,但是非常粗糙,可能会出现一些例外情况,例如使用反射的代码等) )。
检查并适应。
如何确保测试的质量好,而不仅仅是任何测试的总比没有测试要好。
您自己的判断必须是现实的主要来源。没有可以取代技能的指标。
如果您没有这样的经验或判断力,请考虑与有经验的人签约。
总的代码覆盖率和构建速度是两个粗略的辅助指标。
为生产中的现有解决方案付出努力值得吗?
是。在定制的系统或解决方案上花费的绝大部分钱是在投入生产后花费的。而且,对质量,人员和技能的投资绝不应该过时。
更好地忽略此项目的测试并在将来可能的重写中添加它吗?
您不仅要考虑对人员和技能的投资,而且还必须考虑总拥有成本和系统的预期使用寿命。
在大多数情况下,我个人的回答是“当然可以”,因为我知道它要好得多,但我知道可能会有例外。
什么会更有益;花几个星期添加测试还是几个星期添加功能?
都不行 当您在功能方面取得进步时,您的方法应该是在代码库中添加测试。
同样,这是对人员,技能和代码库质量的投资,因此将需要时间。团队成员需要学习如何打破依赖关系,编写单元测试,学习新习惯,提高纪律和质量意识,如何更好地设计软件等。重要的是要了解,当您开始添加测试时,团队成员可能不会拥有这些技能,但要使该方法成功,就必须具备这些技能,因此,停止进度花费所有时间来添加很多测试根本是行不通的。
而且,将单元测试添加到任何规模可观的项目规模的现有代码库中都是一项艰巨的任务,需要投入和坚持。您不能改变一些基本的东西,在途中需要大量学习,并要求您的赞助商不要通过停止业务价值流来期望任何投资回报。那不会飞,坦白说不会。
第三,您想在团队中灌输合理的业务重点价值观。质量永远不会以牺牲客户为代价,没有质量就无法走得快。此外,客户生活在一个瞬息万变的世界中,而您的工作就是使客户更容易适应。与客户保持一致需要质量和业务价值流。
您正在做的是还清技术债务。您这样做的同时仍在满足不断变化的需求的客户。随着债务的偿还,情况逐渐改善,更容易为客户提供更好的服务并提供更多的价值。等等。这种积极的动力是您的目标,因为它强调了可持续发展步伐的原则,并将维护和改善道德–无论是对于您的开发团队,您的客户还是您的利益相关者。
希望能有所帮助