C# 如何在重构之前添加高级测试以锁定行为?

C# 如何在重构之前添加高级测试以锁定行为?,c#,unit-testing,refactoring,C#,Unit Testing,Refactoring,我有一个中等规模、高度混乱、杂乱无章的大泥球项目,我想重构它。大约有5万行代码,我是唯一的维护者。一个类是10k LOC长,线宽为400个字符。功能仍在添加中,尽管速度很慢。我对重构部分感觉很好。撕碎代码对我来说很舒服。然而,围绕应用程序进行一系列测试以确保我不会破坏它似乎让人望而生畏。巨大的对象图和模拟所有数据库将是真正的麻烦。我可能可以在不破坏东西的情况下进行大规模重构。但是,谨慎要求进行一定程度的测试,以确保至少一定程度的安全性。同时,我不想花太多时间在代码周围进行一组“行为锁定”测试。我

我有一个中等规模、高度混乱、杂乱无章的大泥球项目,我想重构它。大约有5万行代码,我是唯一的维护者。一个类是10k LOC长,线宽为400个字符。功能仍在添加中,尽管速度很慢。我对重构部分感觉很好。撕碎代码对我来说很舒服。然而,围绕应用程序进行一系列测试以确保我不会破坏它似乎让人望而生畏。巨大的对象图和模拟所有数据库将是真正的麻烦。我可能可以在不破坏东西的情况下进行大规模重构。但是,谨慎要求进行一定程度的测试,以确保至少一定程度的安全性。同时,我不想花太多时间在代码周围进行一组“行为锁定”测试。我完全打算在事情稍微解耦后添加一整套单元测试。重写是不可能的


有人有什么建议或技巧吗?以前有人做过这种事吗?

心态

一般来说,为没有考虑可测试性的应用程序编写自动化测试(甚至是高级测试)可能会很困难

最好的事情是确保在重构时编写测试是有纪律的(听起来像是有意的)。这将慢慢地把代码球变成一个优雅的舞蹈独角兽,它包含封装良好的可测试类

建议

从创建一些手动高级测试开始(例如,用户进入第一页,单击红色按钮,然后出现一个文本框…)以获得一个起点。根据应用程序内置的技术,有一些框架可以帮助自动化这些高级(通常是UI驱动的)测试:

对于web应用程序是一个很好的选择,对于WPF应用程序,您可以使用,对于其他应用程序,虽然它有点初级,但可以成为一个救生圈

> P>这里我是如何在C++(和C)中实现的。p>
  • 创建一个目录来存放测试,并将cd放入该目录
  • 创建一个目录来存放mock对象,比如mock objs
  • 创建一个makefile来编译所有感兴趣的对象文件
  • 添加必要的include目录或mock.h文件以编译所有对象文件
  • 祝贺你自己,你完成了90%
  • 添加您选择的测试线束(例如CPPFUnit、atf测试、google测试..)
  • 添加一个空测试用例-只需启动、记录并声明成功
  • 添加必要的库和/或mock.c/.cpp文件,直到链接成功并且第一次测试通过。注意:这些.c/.cpp mock文件中的所有函数应仅包含一个原语,以便在调用时使测试失败
  • 祝贺你自己,你完成了99%
  • 添加一个基本的事件调度器:比如说回调列表——这样您就可以发布请求并从事件回调接收响应
  • 添加一个基本计时器:如果您只需要几个计时器,可以说是计时器轮,甚至是计时器列表
  • 写入提前时间函数:(a)处理所有排队事件(b)将当前时间增加到下一个节拍,(c)使等待此节拍的所有计时器过期,(d)反复处理所有排队事件,直到没有剩余事件,(e)如果未达到结束时间提前,则转至步骤(b)
  • 祝贺自己:现在您可以相对轻松地添加测试了:添加测试用例,根据需要修改模拟函数,然后重复

  • 这可能属于程序员,但无论如何:无论你做什么,这都是一种痛苦。我建议从最安全的地方开始,在做任何改变之前仔细测试。测试将是痛苦和丰富的,但就是这样,否则就不做了。我会在瓶颈处开始重构——也许有一个特定的类访问数据库?然后从那里构建测试。重构时间可能比在(可能)不稳定的结构上进行测试要有用900%。