2008-08-21 30 views
5

我加入了一个可以在产品上工作的团队。这款产品已经存在了大约5年左右的时间,并且使用了ASP.NET WebForms。它的原始架构随着时间的推移而逐渐消失,整个解决方案中的事情变得相对混乱。这绝不是可怕的,但绝对可以使用一些工作;你都知道我的意思。在现有系统上进行可重构性重构

自从6个月前加入项目团队以来,我一直在进行一些重构。其中一些重构很简单,提取方法,拉方法提升等。一些重构更具结构性。后面的变化让我感到紧张,因为没有一套全面的单元测试来陪伴每个组件。

整个团队都需要通过重构进行结构变更,但是我们的项目经理表达了一些担心,我们没有足够的测试来重构,因为我们没有引入回归错误进入系统。他希望我们先写更多的测试(针对现有架构),然后执行重构。我的观点是系统的类结构过于紧密,无法编写足够的测试,而在执行我们的重构时使用更多的“测试驱动”方法可能会更好。我的意思不是针对现有组件编写测试,而是针对特定功能需求编写测试,然后重构现有代码以满足这些需求。这将允许我们编写可能在系统中具有更长寿命的测试,而不是编写一堆“丢弃”测试。

有没有人有任何经验,最好的行动是什么?我有自己的想法,但希望听到社区的一些意见。

回答

5

你PM的担忧是有效的 - 确保你在进行任何重大的重构之前获得下测试系统。

我强烈建议您获取一份Michael Feather的书Working Effectively With Legacy Code(以“Legacy Code”羽毛表示任何未经单元测试覆盖的系统)。对于如何以安全的方式来分解您所说的联接和依赖关系,这不会冒着引入回归错误的风险,这充满了很好的想法。

祝您好运,重构计划;根据我的经验,这是一个令人愉快且极具挑战性的过程,您可以从中学到很多东西。

2

你能重新平行吗?我的意思是用TDD重写要重构的部分,但保留现有的代码库。那么当你的新测试满足你的PM需求时,逐步淘汰现有的代码?

0

就折腾出第二个建议,对于遗留代码,一个优秀的书,让我大开眼界的是,几乎所有的旧/糟糕/不可测试代码可以口角有效地开展工作!

1

我也想在建议由Martin Fowler参观Refactoring网站抛出。他从字面上写这本书的东西。

至于引入的单元测试代入公式,我发现最好的方法是找一个顶级组件并确定所有这对混凝土的对象外部依赖性,并与接口替换它们。一旦你这样做了,编写针对你的代码库的单元测试会容易很多,并且你可以一次完成一个组件。更好的是,你不必扔掉任何单元测试。

单元测试ASP.Net可能会非常棘手,但也有很多的框架,使人们更容易做的。 ASP.Net MVCWCSF等等。

0

完全同意Ian Nelson的回答。此外,我会开始获取一些“高级”测试(功能或组件测试)以保持用户的观点的行为。这一点可能是您PM的最重要关注点。