你正在了解两个不同事物的利弊(骑马和骑摩托车的优缺点是什么?)
当然,两者都是“自动化测试”(~骑),但这并不意味着它们是可替代的(你不会骑马数百英里,也不会在不能行驶的泥泞地方骑摩托车)。
单元测试测试代码的最小单元,通常是一个方法。每个单元测试与它测试的方法密切相关,如果编写得好,几乎只与该方法联系在一起。
它们非常适合指导新代码的设计和现有代码的重构。它们非常适合在系统准备进行集成测试之前发现问题。请注意,我写的是指导,而所有的测试驱动开发都是关于这个词的。
手动单元测试毫无意义。
那么重构呢,似乎这是您的主要关注点?如果您只是重构方法的实现(内容),而不是它的存在或“外部行为”,则单元测试仍然有效且非常实用(在尝试之前无法想象有多有用)。
如果您更积极地重构,改变方法的存在或行为,则需要为每个新方法编写新的单元测试,并可能放弃旧的单元测试。但是编写单元测试,特别是在编写代码本身之前编写单元测试,将有助于澄清设计(即方法应该做什么,以及它不应该做什么),而不会被实现细节所困扰(即它应该如何执行需要完成的任务)。
自动集成测试测试代码的最大单元,通常是整个应用程序。
它们非常适合测试您不想手动测试的用例。但是您也可以进行手动集成测试,它们同样有效(只是不那么方便)。
今天开始一个新项目,没有单元测试是没有意义的,但是对于像你这样的现有项目来说,写所有已有并且工作良好的东西的单元测试可能没有太多意义。
在你的情况下,我更倾向于采用一种“折中”的方法:
- 编写较小的集成测试,仅测试您要重构的部分。如果您要重构整个项目,则可以使用当前的集成测试,但如果您只重构 - 比如 XML生成部分,那么要求数据库出现就没有任何意义了,所以我会编写一个简单而小巧的XML集成测试。
- 针对你要编写的新代码编写一堆单元测试。正如我之前写过的,只要你 “mess with anything in between”,单元测试就会准备好,确保你的“mess”是起作用的。
实际上,您的集成测试只会确保您的“mess”不起作用(因为一开始它不起作用,对吧?),但它不会给您任何关于以下问题的线索:
- 为什么它不能工作
- 是否真的正在修复“mess”调试错误
- “mess”调试是否破坏了其他东西
集成测试只会在整个更改成功后给出确认(相当长的时间答案都是“不”)。集成测试在重构过程中不会提供任何帮助,这将使它更加困难和令人沮丧。你需要单元测试。