我被要求更新一个旧的基于 Java 的应用程序,并与我正在开发的更多当前应用程序内联。
我们想介绍的其中一件事是测试驱动开发,用于任何新的增强功能。
代码单元测试覆盖率目前非常低<20%
作为该应用程序的新手,我希望这个百分比更大,以便让我有信心在不引入缺陷的情况下进行更改。
问题是要提高这个百分比,很多代码需要重构才能测试。
因此,使用如此低的单元测试覆盖率进行重构可能会引入问题,但是要提高测试覆盖率,您必须重构吗?!
尝试这样做时有没有降低风险?
我被要求更新一个旧的基于 Java 的应用程序,并与我正在开发的更多当前应用程序内联。
我们想介绍的其中一件事是测试驱动开发,用于任何新的增强功能。
代码单元测试覆盖率目前非常低<20%
作为该应用程序的新手,我希望这个百分比更大,以便让我有信心在不引入缺陷的情况下进行更改。
问题是要提高这个百分比,很多代码需要重构才能测试。
因此,使用如此低的单元测试覆盖率进行重构可能会引入问题,但是要提高测试覆盖率,您必须重构吗?!
尝试这样做时有没有降低风险?
对此的低风险方法是测试和重构非常小的增量。您必须在修改任何内容之前引入尽可能多的测试(并不总是那么容易),然后继续该过程,但将重构包括在组合中。
如果您将最初的重构保留为将自包含代码块提取为小的自包含方法,那么风险很低(不是无风险,但很低),然后您可以尽可能地测试原始方法,但另外测试提取的方法彻底。
模拟在这方面也有很大帮助——你可以传递模拟而不是真正的服务等,这有很大帮助。您仍然会遇到麻烦的情况,即代码在内部实例化/调用您不想测试的服务,但随着时间的推移,您也可以通过引入依赖注入来解决这个问题(这样您就可以注入模拟而不是真正的服务) . 但这可能是一个长期战略。
我过去这样做的方式是务实的——最初似乎是不可逾越的,但如果你经常重复上述操作,你最终会得到你不再“害怕”的代码。这需要时间,但可以做到。
对于这类事情,我可以彻底推荐Michael Feather 的 Working with Legacy Code - 它提供了许多实用的策略来处理你(我们都经历过,在某些时候)面临的问题