【问题标题】:How to test a legacy application (and adopt Test Driven Development) without introducing risk?如何在不引入风险的情况下测试遗留应用程序(并采用测试驱动开发)?
【发布时间】:2013-02-26 14:46:06
【问题描述】:

我被要求更新一个基于 Java 的旧应用程序,并与我正在开发的更多当前应用程序内联。

我们想介绍的一件事是测试驱动开发,用于任何新的增强功能。

代码单元测试覆盖率目前非常低

作为应用程序的新手,我希望这个百分比更大,以便让我有信心在不引入缺陷的情况下进行更改。

问题是要提高这个百分比,很多代码需要重构才能测试。

因此,使用如此低的单元测试覆盖率进行重构可能会带来问题,但要提高测试覆盖率,您必须重构吗?!

在尝试这样做时是否有降低风险的方法?

【问题讨论】:

  • 出于兴趣,您如何计算您的覆盖率?私有方法应该通过范围更广(公共/受保护)的方法进行间接测试——它们不需要自己的测试......
  • 是的,我同意。覆盖统计数据来自声纳。我还为 Eclipse 使用了 EclEmma 插件。谢谢
  • 那么您是纯粹为了增加覆盖率而进行重构,还是这是一个单独的活动(使其与当前应用程序保持一致)?
  • 纯粹为了测试覆盖
  • 提高测试覆盖率肯定是一个值得的目标吗?并且使用 TDD 进行新的增强是有意义的 - 这当然是我尝试工作的方式(但同样,现有代码的状态最初可能会或可能不会适合 TDD)。此外,提高代码覆盖率可以提高对应用程序的理解,这反过来意味着在添加新增强功能时破坏某些东西的可能性远低于没有/不重构/添加测试的情况。

标签: unit-testing testing junit tdd


【解决方案1】:

对此的低风险方法是测试和重构是非常小的增量。您必须在修改任何内容之前引入尽可能多的测试(并不总是那么容易),然后继续该过程,但将重构纳入其中。

如果您保持最初的重构以将自包含代码块提取到小的自包含方法中,那么风险很低(不是无风险,但很低),然后您可以尽可能地测试原始方法,但另外彻底测试提取的方法。

模拟在这方面也有很大帮助——你可以传递模拟而不是真正的服务等,这有很大帮助。您仍然会遇到麻烦的情况,即代码在内部实例化/调用您不想测试的服务,但随着时间的推移,您也可以通过引入依赖注入来解决这个问题(这样您就可以注入模拟而不是真正的服务) .但这可能是一个长期战略。

我过去这样做的方式是务实 - 最初似乎无法克服,但如果您经常并及时重复执行上述操作,您最终会得到代码,您不再“害怕”的。这需要时间,但可以做到。

对于这类事情,我可以彻底推荐 Michael Feather's Working with Legacy Code - 它提供了许多实用策略来处理您(我们都经历过,在某些时候)面临的问题

【讨论】:

  • 是的 - 不是一个非常性感的话题,但它是我们大多数人在某个时候必须处理的一个......
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多