我的过渡经验
多年以来,我一直误以为我没有足够的时间为我的代码编写单元测试。当我确实编写测试时,它们是肿的,沉重的东西,这仅鼓励我认为我应该只在知道需要它们时才编写单元测试。
最近,我被鼓励使用“ 测试驱动开发”,我发现它是一个完整的启示。我现在坚信,我没有时间不编写单元测试。
根据我的经验,通过考虑测试进行开发,最终会得到更简洁的界面,更集中的类和模块以及通常更多的SOLID可测试代码。
每当我使用没有单元测试的遗留代码而不得不手动测试某些东西时,我一直在想:“如果此代码已经具有单元测试,这将更快。” 每当我不得不尝试向具有高耦合性的代码中添加单元测试功能时,我总是在想:“如果以非耦合的方式编写,这将变得更加容易”。
比较和对比我支持的两个实验站。一个已经存在了一段时间,并拥有大量的遗留代码,而另一个则相对较新。
在向旧实验室中添加功能时,通常是下到实验室并花费大量时间来研究其所需功能的含义以及如何在不影响任何其他功能的情况下添加该功能的情况。根本没有将代码设置为允许离线测试,因此几乎所有内容都必须在线开发。如果我确实尝试离线开发,那么最终我将得到比合理数量更多的模拟对象。
在较新的实验室中,我通常可以通过以下方式添加功能:在我的办公桌上离线开发它,仅模拟那些立即需要的东西,然后只花很短的时间在实验室中,以解决所有未解决的问题。 -线。
我的建议
看来您的开端很好,每当您要对开发工作流程进行重大更改时,都必须确保每个人都参与制定该决策,并且理想情况下,大多数人都已对此做出了选择。从您的问题来看,您似乎已经正确。如果人们对这个想法不感兴趣,那么它注定会失败或产生不良意愿。
除非您能提出令人信服的业务案例,否则我不建议您为整个系统完全实施单元测试和规范。正如我上面提到的,如果系统设计时没有考虑到测试,那么为它编写自动化测试可能非常困难。
相反,我建议从小处开始,并使用童子军规则:
一定要离开营地的清洁工。
如果在此代码库上实施某些工作时,可以确定测试现有行为并从旧行为过渡到新行为所需的特定测试,那么您既已记录了规范的更改,又开始了针对以下方面的单元测试的实现你的系统。
您不接触的模块不会获得单元测试,但是如果您不接触它们,则可能是因为它们已经在使用中经过了全面测试,不需要更改,或者从未使用过。
您要避免的是浪费开发人员的工作量,编写不必要的测试(YAGNI的测试代码与生产代码* 8'一样好用),再也不会被使用并使人们士气低落认为测试毕竟没有用。
摘要
从小处着手,逐步建立对测试的信任,并在何时何地开发对您的团队最有利的测试中获得业务价值。