任何人都可以推荐一些关于如何解决启动UnitTest大型现有CodeBase问题的最佳实践吗?我目前面临的问题包括:
巨大的代码库
ZERO现有的UnitTests
类之间的高耦合
复杂的OM(我在这里做的不多 - 这是一个复杂的业务领域)
缺乏编写UnitTests/TDD的经验
数据库依赖
外部源依赖项(Web服务,WCF服务,NetBIOS等)
显然,我明白我应该从重构代码开始,使它更少耦合,更可测试.但是,如果没有UnitTests(鸡和鸡蛋,任何人?),进行这样的重构是有风险的.
另外,您是否建议在Domain类或层级类(日志记录,实用程序等)上启动重构和编写测试?
首先,我是第二个"有效地使用遗产代码"的建议,Jeffrey Frederick给出的建议.
正如您在问题中所述,您无法更改代码,因为您目前没有可用于检测回归的单元测试,并且您无法添加单元测试,因为您的代码库不是单元可测试的.在这种情况下,您可以创建特征测试:端到端自动测试,可帮助您检测软件外部行为的变化.一旦到位,您就可以开始慢慢修改代码.
但是,将您的巨大代码库置于测试之下是一项巨大的努力,风险很高,而且您可能会让团队在执行此操作时耗费精力,因为他们必须在测试覆盖率方面做出强有力的努力并获得低回报.将整个代码库置于测试之下是一项无穷无尽的努力.
相反,从代码库开发新功能,这样就不会妨碍你.完成新代码测试后,将其集成到代码库中.
还要尝试在每次修复代码库中的问题时创建单元测试.这将是第一次很难,但一旦你准备好设置一些单元测试环境,它会变得更容易.
缺乏编写UnitTests/TDD的经验
我认为这是最重要的.
标准建议是首先开始为所有新代码编写单元测试,以便在尝试对现有代码进行单元测试之前学习如何进行单元测试.我认为这在理论上是很好的建议,但在实践中很难遵循,因为大多数新工作都是对现有系统的修改.
我认为你可以获得一名"球员教练",一个可以与你的团队一起完成项目并在应用过程中教授技能的人.
而且我认为我有法律义务告诉你让Michael Feather 有效地使用Legacy Code.
管理它的书中有很好的建议!约翰娜罗斯曼
我还可以重新考虑以下内容:
在新创建的源代码段上使用单元测试
为bug创建单元测试
为应用程序中最危险的部分创建单元测试
为应用程序中最有价值的部分创建单元测试.
如果耦合太高,则创建测试,这是更多的模块或集成测试,但是自动化.
单个单元测试无济于事.但它需要开始.之后,将对应用程序中最危险的部分进行一些单元测试,这将有助于防止这些部分中的错误.当你到达这一点时,大多数开发人员将意识到单元测试的有用性.