如何在 none 存在的地方优雅地集成单元测试?
How to gracefully integrate unit testing where none is present?
我的任务是为我们公司的内部测试标准和程序制定一份文件。我一直在做大量研究并找到了一些好文章,但我总是喜欢在此处与社区联系以征求意见。
话虽这么说,但我的问题是:您如何让一家公司拥有非常庞大的遗留代码库,而这些代码库几乎无法测试(如果可以测试的话),并尝试有效地测试您可以测试的内容?关于如何为紧密耦合的代码创建一些有用的自动化测试用例,您有什么建议吗?
我们编写的所有新代码都尽可能松耦合,我们都为新开发的方向感到自豪。作为记录,我们是一家从 VB 过渡到 C# ASP.NET 开发的 Microsoft 商店。
这个问题实际上有两个方面:技术和政治。
迈克尔·费瑟斯 (Michael Feathers) 的书 Working Effectively With Legacy Code 中对技术方法进行了很好的定义。由于您无法一次测试整个代码块,因此您可以沿着假想的非架构 "seams" 将其分解。这些将是代码中的逻辑瓶颈,功能块似乎与代码库的其余部分有些隔离。这不一定是拆分它的 "best" 架构位置,而是选择一个可以单独测试的隔离逻辑块。此时将其拆分为两个模块:大部分代码和您的独立函数。现在,在该点添加自动化测试以执行隔离的功能。这将证明您对逻辑所做的任何更改都不会对大部分代码产生不利影响。
现在您可以去镇上按照 SOLID OO 设计原则、DRY 原则等重构孤立的逻辑。Martin Fowler's Refactoring 这本书是这里的极好参考。在重构时,将单元测试添加到新重构的 类 和方法中。尽量保持"behind the line"你用你创建的分割绘制;这将有助于防止兼容性问题。
您最终想要的是一组结构良好的完全单元测试逻辑,遵循最佳 OO 设计;这将附加到一个临时兼容层,将其连接到您之前切割的接缝上。对其他孤立的逻辑部分重复此过程。然后,您应该能够开始加入它们,并丢弃临时层。最后,您将得到一个漂亮的代码库。
提前注意,这需要很长时间。从而进入政界。即使您说服您的经理相信改进代码库将使您能够做出更改 better/cheaper/faster,他们的上级主管也可能不会认同这种观点。高管们看到的是,花在重构代码上的时间没有花在添加请求的功能上。他们并没有错:你我可能认为必要的维护并不是他们想要花费有限预算的地方。在他们看来,即使维护成本很高,今天的代码也能正常工作。换句话说,他们在想 "if it ain't broke, don't fix it."
您需要向他们展示一个重构代码库的计划。这将包括方法、涉及的步骤、您看到的大块工作以及估计的时间线。在这里展示替代方案也很好:完全重写会更好吗?你应该改变语言吗?您是否应该将其移至面向服务的架构?您是否应该将其移至云端,并将其作为托管服务出售?所有这些都是他们高层应该考虑的问题,即使他们今天没有考虑。
如果您最终让他们同意,请立即升级您的工具并建立现代开发链,其中包括同行代码审查和自动化单元测试执行、打包和部署到 QA 等实践。
亲手培育这棵树 11 年,我只能向你保证,这绝非易事。它需要在您组织的技术阶梯顶端进行全面变革:CIO、CTO、开发高级副总裁或其他任何人。你还必须说服你的技术同行:你可能有一些人对旧产品有很长的历史,而且他们真的不想改变它。他们甚至可能将您对其当前状态的抱怨视为对他们作为编码员技能的人身攻击,并可能试图破坏或掩饰您的努力。
衷心祝愿您事业顺利!
我的任务是为我们公司的内部测试标准和程序制定一份文件。我一直在做大量研究并找到了一些好文章,但我总是喜欢在此处与社区联系以征求意见。
话虽这么说,但我的问题是:您如何让一家公司拥有非常庞大的遗留代码库,而这些代码库几乎无法测试(如果可以测试的话),并尝试有效地测试您可以测试的内容?关于如何为紧密耦合的代码创建一些有用的自动化测试用例,您有什么建议吗?
我们编写的所有新代码都尽可能松耦合,我们都为新开发的方向感到自豪。作为记录,我们是一家从 VB 过渡到 C# ASP.NET 开发的 Microsoft 商店。
这个问题实际上有两个方面:技术和政治。
迈克尔·费瑟斯 (Michael Feathers) 的书 Working Effectively With Legacy Code 中对技术方法进行了很好的定义。由于您无法一次测试整个代码块,因此您可以沿着假想的非架构 "seams" 将其分解。这些将是代码中的逻辑瓶颈,功能块似乎与代码库的其余部分有些隔离。这不一定是拆分它的 "best" 架构位置,而是选择一个可以单独测试的隔离逻辑块。此时将其拆分为两个模块:大部分代码和您的独立函数。现在,在该点添加自动化测试以执行隔离的功能。这将证明您对逻辑所做的任何更改都不会对大部分代码产生不利影响。
现在您可以去镇上按照 SOLID OO 设计原则、DRY 原则等重构孤立的逻辑。Martin Fowler's Refactoring 这本书是这里的极好参考。在重构时,将单元测试添加到新重构的 类 和方法中。尽量保持"behind the line"你用你创建的分割绘制;这将有助于防止兼容性问题。
您最终想要的是一组结构良好的完全单元测试逻辑,遵循最佳 OO 设计;这将附加到一个临时兼容层,将其连接到您之前切割的接缝上。对其他孤立的逻辑部分重复此过程。然后,您应该能够开始加入它们,并丢弃临时层。最后,您将得到一个漂亮的代码库。
提前注意,这需要很长时间。从而进入政界。即使您说服您的经理相信改进代码库将使您能够做出更改 better/cheaper/faster,他们的上级主管也可能不会认同这种观点。高管们看到的是,花在重构代码上的时间没有花在添加请求的功能上。他们并没有错:你我可能认为必要的维护并不是他们想要花费有限预算的地方。在他们看来,即使维护成本很高,今天的代码也能正常工作。换句话说,他们在想 "if it ain't broke, don't fix it."
您需要向他们展示一个重构代码库的计划。这将包括方法、涉及的步骤、您看到的大块工作以及估计的时间线。在这里展示替代方案也很好:完全重写会更好吗?你应该改变语言吗?您是否应该将其移至面向服务的架构?您是否应该将其移至云端,并将其作为托管服务出售?所有这些都是他们高层应该考虑的问题,即使他们今天没有考虑。
如果您最终让他们同意,请立即升级您的工具并建立现代开发链,其中包括同行代码审查和自动化单元测试执行、打包和部署到 QA 等实践。
亲手培育这棵树 11 年,我只能向你保证,这绝非易事。它需要在您组织的技术阶梯顶端进行全面变革:CIO、CTO、开发高级副总裁或其他任何人。你还必须说服你的技术同行:你可能有一些人对旧产品有很长的历史,而且他们真的不想改变它。他们甚至可能将您对其当前状态的抱怨视为对他们作为编码员技能的人身攻击,并可能试图破坏或掩饰您的努力。
衷心祝愿您事业顺利!