你需要一个测试来证明重构没有破坏任何东西。
我非常喜欢@Squirrel 描述的基于 AB 理论的测试。
我也是Michael Feathers 的《有效地使用遗留代码》中的特征测试的忠实粉丝。
就个人而言,这是我在 90% 的遗留代码工作中使用的技术(它是表征测试的一种变体)。
- 减少到功能,
- 跑步,
- 通过批准测试 (www.approvaltests.com) 捕获结果。
第 1 步:假设您正在重构一堆功能代码。这意味着; 所有使用的参数都传入,没有副作用,总是确定性的(纯的);返回所有有用的结果。
例如,你有一个方法string Foo(int a, boolean b)
;这很容易测试,只需输入一些数据,然后按照步骤 2 和 3进行操作,您就会得到很好的特性测试。
当然这不是现实世界,在现实世界中我会得到类似的东西:void Foo()
所以首先我会弄清楚它的副作用是什么。它们可能是以下组合:1. 更改全局变量,2. 更改数据库,3. 更改文件,4. 进行 Web API 调用。
那么我将记录所有这些更改:
Log(sql)
Statement.Execute(sql)
现在我可以将功能视为
Log Foo()
然后运行它,看看会发生什么,它可能不是确定性的,因为你没有传入任何变量,当你开始看到发生了什么时,你可以开始查看需要传入的内容。假设这是一个数据库。那么你需要有效地进行回滚。
database.startTransaction()
log = LogToString()
Foo()
database.rollback();
Approvals.Approve(log)