Unit testing 如何在没有单元测试的情况下优雅地集成单元测试?

Unit testing 如何在没有单元测试的情况下优雅地集成单元测试?,unit-testing,standards,design-principles,principles,Unit Testing,Standards,Design Principles,Principles,我的任务是为公司内部测试标准和程序编制一份文件。我做了大量的研究,发现了一些好文章,但我总是喜欢在这里向社区征求意见 话虽如此,我的问题是:如果一家公司有一个非常大的遗留代码库,而且几乎不可测试(如果可以测试的话),那么您如何尝试测试您可以有效地测试的内容?关于如何为紧密耦合的代码创建一些有用的自动化测试用例,您有什么建议吗 我们所有的新代码都是以尽可能松耦合的方式编写的,我们都对新开发的方向感到非常自豪。作为记录,我们是一家从VB向C#ASP.NET开发过渡的微软公司。这个问题实际上有两个方面

我的任务是为公司内部测试标准和程序编制一份文件。我做了大量的研究,发现了一些好文章,但我总是喜欢在这里向社区征求意见

话虽如此,我的问题是:如果一家公司有一个非常大的遗留代码库,而且几乎不可测试(如果可以测试的话),那么您如何尝试测试您可以有效地测试的内容?关于如何为紧密耦合的代码创建一些有用的自动化测试用例,您有什么建议吗


我们所有的新代码都是以尽可能松耦合的方式编写的,我们都对新开发的方向感到非常自豪。作为记录,我们是一家从VB向C#ASP.NET开发过渡的微软公司。

这个问题实际上有两个方面:技术和政治

技术方法在Michael Feathers的书中有很好的定义。因为您不能一次测试整个代码块,所以需要沿着想象中的非体系结构“接缝”将其分开。这些可能是代码中的逻辑瓶颈,其中一个功能块似乎与代码库的其余部分有点隔离。这不一定是拆分它的“最佳”架构位置,而是选择一个可以独立测试的独立逻辑块。此时将其分为两个模块:大部分代码和独立的函数。现在,在这一点上添加自动测试,以执行独立的功能。这将证明您对逻辑所做的任何更改都不会对大部分代码产生不利影响

现在,您可以按照坚实的OO设计原则、DRY原则等重构孤立的逻辑。这本书在这里是一个很好的参考。重构时,将单元测试添加到新重构的类和方法中。试着保持“在你用你创造的分裂画的线后面”;这将有助于防止兼容性问题

您希望最终得到的是一组结构良好的、完全经过单元测试的逻辑,遵循最佳OO设计;这将附加到一个临时兼容层,该层将连接到您先前剪切的接缝。对逻辑的其他隔离部分重复此过程。然后,您应该能够开始连接它们,并丢弃临时层。最后,您将得到一个漂亮的代码库

请提前注意,这将需要很长很长的时间。从而进入政治。即使您说服您的经理,改进代码库将使您能够更好/更便宜/更快地进行更改,但他们上面的管理人员可能不会认同这一观点。高管们看到的是,花在重构代码上的时间不是花在添加所需功能上的时间。他们并没有错:你和我可能认为是必要的维护不是他们想要花有限的预算。在他们看来,今天的代码运行良好,即使维护成本很高。换句话说,他们在想“如果它没有坏,就不要修理它。”

您需要向他们展示一个计划,以获得重构的代码库。这将包括方法、涉及的步骤、您看到的大量工作以及估计的时间线。在这里提出替代方案也很好:完全重写会更好吗?你应该换语言吗?您是否应该将其转移到面向服务的体系结构?您是否应该将其移动到云中,并将其作为托管服务进行销售?所有这些都是他们应该在高层考虑的问题,即使他们今天没有考虑这些问题

如果您最终得到了他们的同意,那么请不要浪费时间升级您的工具,并建立一个现代开发链,其中包括对等代码审查和自动化单元测试执行、打包以及QA部署等实践

我亲自为这棵树剥皮已经11年了,我只能向你保证这非常不容易。它需要在组织中技术阶梯的顶端进行一系列的变革:首席信息官、首席技术官、开发高级副总裁,或者其他任何人。您还必须说服您的技术同行:您可能有人对旧产品有着悠久的历史,但他们并不真正想改变它。他们甚至可能将你对其当前状态的抱怨视为对其编码技能的人身攻击,并可能会对你的努力进行破坏或沙袋


我真诚地祝你事业好运

这个问题实际上有两个方面:技术和政治

技术方法在Michael Feathers的书中有很好的定义。因为您不能一次测试整个代码块,所以需要沿着想象中的非体系结构“接缝”将其分开。这些可能是代码中的逻辑瓶颈,其中一个功能块似乎与代码库的其余部分有点隔离。这不一定是拆分它的“最佳”架构位置,而是选择一个可以独立测试的独立逻辑块。此时将其分为两个模块:大部分代码和独立的函数。现在,在这一点上添加自动测试,以执行独立的功能。这将证明您对逻辑所做的任何更改都不会对大部分代码产生不利影响

现在,您可以按照坚实的OO设计原则、DRY原则等重构孤立的逻辑。这本书在这里是一个很好的参考。重构时,将单元测试添加到新重构的类和方法中。试着保持“在你用你创造的分裂画的线后面”;这将有助于防止兼容性问题

您希望最终得到的是一组结构良好的、完全经过单元测试的逻辑,遵循最佳OO设计;这将附加到一个临时兼容层,该层将连接到您先前剪切的接缝。重复这个