自动化测试通常指单元测试、集成测试,以及其他任何可以自动化执行的测试。能否自动执行是其与手动测试之间的区别。自动化测试的目的是什么?首先,它们减少了回归测试工作量:我们不需要记住如何测试模块,自动化测试会帮我们搞定。我们只需点击一个按钮并选择相应的测试套件(可能包含成百上千个用例),运行并报告缺陷(如果发现)。节省时间非常重要,但这并不是自动化测试的唯一目的,在我看来,也不是最重要的目的。更重要的是它们扮演了安全网的角色。
你知道什么是安全网吗?维基百科的定义是“一张保护人们从高处坠落时防止伤害的网”。您很可能在正在建造或重建的建筑物上看到它。如图,红色的是安全网。
如果建筑工人不小心跌倒或掉落工具,他们不会失去生命,也不会伤害地面上的任何人。这样的设计是否有助于他们更有效地工作?我相信确实如此。我没有找到任何关于这个主题的研究,将如下两种状态的工人进行生产力比较:
- 知道自己下面有安全网的工人的生产力
- 知道失误很可能会夺去他们生命或伤害正在路上玩耍的孩子
我相信,这种研究的结果是显而易见的。
对于我们程序员来说也是如此。修改源代码并知道没有适当的自动化测试如同在没有安全网的情况下高空作业:一个错误可能会导致服务器宕机、客户流失、金钱损失,甚至可能失去工作。像这样工作时,程序员的生产力会有多高?我们需要做研究才能找到答案吗?或者答案和建筑工人一样明显?
为了给您足够的信心,自动化测试不仅必须编写并提交到代码库,而且必须在您每次修改Master代码时自动执行。您必须能够在本地进行每次更改后运行测试,同时逐步开发代码。然后,你必须知道,即使你不小心忘记在本地运行测试并将发送你的分支到Master的合并请求(MR),流水线也会拦截错误发生。
你投入的时间和精力越多,安全网越强大,也就说明,你的测试覆盖率越高,那么你的工作就会越有效率,你在引入新功能或修复缺陷时就会感到越安全。简而言之,您将编码更快更好。因为你知道你不会破坏昨天的成果。
当你开始一个新的项目时,你做的第一件事是实施安全网:建立流水线并创建一些简单的自动化测试。确保自动化测试保护你的项目。完成之后才开始编写代码。问建筑工人:他们是否可以在没有安全网的情况下开始工作?显然不是。我敢肯定这甚至是违法的。对于我们程序员来说也是如此:没有自动化测试安全网的编码一定是违法的。
当您的客户向您反馈缺陷时,这应该意味着安全网有漏洞。它不够可靠,这就是为什么“BUG”掉到客户头上的原因。在修复缺陷之前你会做什么呢?应该加固安全网。您添加了更多自动化测试,这些测试将在未来拦截此缺陷。只有这样你才能真正修复了缺陷。
我相信软件项目的安全网是软件最宝贵的资产。