测试是一件浪费时间的事吗?

简介:

让我们详细地说明

作为开发人员,我们都知道我们应该测试我们的代码。我们应该写单元测试,但这也通常是我们发现没时间时跳过的第一步。

作为团队的领导者或者管理者我们都知道测试是必要的,但是当截止日期临近的时候,我们倾向于减少测试,而把更多的重点放到编码上。

这样看测试领域似乎很紧张。我们都知道测试对我们是有利的,但是一旦项目面临压力时我们就不再测试了。

测试是一件浪费时间的事吗?

我们为什么测试?

Edsger W Dijkstra 说过:测试可以用来找到显式的缺陷(bug),但是无法显示潜伏的软件缺陷(bug)。

这意味着测试不能百分百保证你的软件没有缺陷(bug),但是它确实很有帮助。我们也可以换种说法,如果我们不进行测试我们几乎可以百分百保证我们 的软件会有缺陷(bug),除非我们是在编写像“hello world!”那样简单的程序。但是即使这么简单的程序你也会测试,因为一旦你输入完你的代码你就会很好奇它的输出是不是真的是“hello world!”。

而这就是第一类形式的测试,也是我们一直在做的: 手工测试. 我们编写程序,然后启动它去检验运行结果。 对于一个简单的“hello world”这可能是足够的,但是对于复杂度更高的程序这可能会导致时间的浪费,这是对一个已知的行为结果集的手工重复。这难道不是我们发明计算机的初衷 吗?

对于“hello world”这不是大问题,但是当你创建一个web应用时,测试场景是在翻页十次,点击某些按钮,在大量表单中输入(正确的)数据之后再测试某些特定条 件,你就看到自动化会节省大量的时间。如果你能通过测试运行器(test runner)直接执行你想要测试的函数,而不是必须花费半分钟手工执行到那个函数,你会节省很多时间!

但这也意味着我们需要多一点点编程,而更多的编程意味着更多的时间和精力。所以它会花费更多的时间而你的项目可能因此完工的晚些。

也许未必

让我们创建一个控制台应用程序来计算最大公约数(GCD)的两个整数。有很多方法可以解决这个问题,但为简单起见,我们将

1.输入两个整数

2.不管其算法怎么样,计算一下 GCD

3.显示输出

让我们浏览一下正常的开发周期。我们通常写一个 main() 函数,得到了两个整数,以及调用一个函数来计算一下 GCD,然后显示结果。

测试。在你的控制台中输入 2 个整数会花一些时间,这将变得相当无聊,如果你需要多次重复你的代码。这也很容易在控制台应用程序中输入出错,导致程序崩溃。这意味着你必须重新启动程 序,输入两位数,然后再次验证结果。请你要记住,我们讨论的是一个控制台应用程序,只需要两个输入值,不需要点击(在 web 应用程序中),我们已经看到,这将需要花费一些时间。

然后,我们很可能会想要测试一些更多意味着重启程序的值,进入两位数(正确地),然后测试。。。所以我们即使看到也不会立即这样做,因为它要花费太多的时间。Edge 案例将会被遗忘,错误只会在生产中被发现!

此外,当我们改变一些我们需要再次运行所有的测试(手动),使用一个被遗忘的,或者使用快捷键的高风险的测试。

在那儿,不会有跟踪我们的测试工作。不写入日志文件,在整个测试期间,除非你增加这个你做的事情列表工作(手动)。

消极反馈循环

通常,当项目(因为某种原因)延期了,则容易陷入一种消极反馈循环。有时我们会先决定跳过编写测试代码,而这则会造成情况如下图所示:

测试是一件浪费时间的事吗?

项目延期,造成我们不得不去编写更多的代码。所以与其“浪费时间”去不停地测试代码,不如不停地去开发项目。而这样做的结果就是代码质量进一步下 降,并最终(或早或晚)导致返工。返工又通常会在最有限的时间里变得十分紧急(有些人叫这种现象为“墨菲是个乐天派!”)。其实返工什么也改变不了,项目 现在只会进一步被延迟。很奇怪吧,我们编写越多的代码,我们的项目完工越晚。一种常用应对措施是让更多的开发人员被参与到项目的研发中,然而这样的作用也 只是加剧消极反馈循环而已。

若项目缺乏测试,在验收和生产环境时,通常用户则会发现许多 bug,这将会快速地降低用户对项目的信任度,从而产生消极反馈。这种反馈传递给(工作过度的)开发人员,就造成开发人员“疲劳”现象。后果就是开发人员 工作积极性下降,开发人员离职,……,项目又进一步延迟了。

打破消极循环

我想你已经想到有一个办法可以解决这种现象。让我们来绘制一幅不同的场景:

测试是一件浪费时间的事吗?

我们可以从一个理想计划“项目按时完工”开始。我们开发代码,然后立即测试它。测试最好是自动化(编码实现)的,这样我们可以轻松有效的去执行它 们。我们把开发和测试紧密的结合在一起,每个开发测试循环可以很快速的执行。当一个开发测试循环结束时我们有信心保证代码质量是很高的,因为它已经通过了 测试。而且用户因为发现缺陷(bug)的数目变少而对我们继续高度信任。即使他们发现了一个缺陷(这依然是有可能的),我们也可以扩充我们的测试集合,去 避免相关缺陷的重现。

如此下去,返工将不再是必须的,项目得有继续。

如果我们的项目已经延期了,就需要我们花些时间来采用这种方法论。对新功能的冻结也许是必须的。停止开发新的代码,取而代之去为最严重的(恼人的-清晰的-高代价的)缺陷编写测试。

项目延期的情况下再去为你完整的代码库编写测试是不可行的,只针对其中的一些部分就可以,不要去浪费你的时间。但是要记住其它部分也还是需要编写测 试的。我在这种情况下会去找出最严重的问题(划分优先级),然后为它们编写测试。之后“快速”修改代码就会变的更容易,并且可以保证在修改其他部分是它不 会出错。自动化测试可以很频繁的执行,从而降低了缺陷(bug)重现的风险。好了,现在可以开始去有效的强健我们项目了

上面这些通常会要求进行代码重构,从而使它可测试化。我会在另一篇文章里介绍它。

总结

大部分的项目中,会考虑测试和编码之间的平衡。不过我希望大家都能清楚,测试其实是项目的加速器,而不是在浪费时间。

下一篇文章我将带你进入测试驱动开发的领域,你会发现自己能变得更有效率!

测试愉快!


来源:51CTO

相关文章
|
21天前
|
网络协议 安全 测试技术
性能工具之emqtt-bench BenchMark 测试示例
【4月更文挑战第19天】在前面两篇文章中介绍了emqtt-bench工具和MQTT的入门压测,本文示例 emqtt_bench 对 MQTT Broker 做 Beachmark 测试,让大家对 MQTT消息中间 BenchMark 测试有个整体了解,方便平常在压测工作查阅。
115 7
性能工具之emqtt-bench BenchMark 测试示例
|
1月前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
29 0
|
15天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
4天前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
13 0
|
6天前
|
测试技术 API
探索软件测试中的自动化工具与挑战
本文探讨了软件测试领域中自动化工具的应用与挑战。通过分析目前主流的自动化测试工具,探讨了其在提高测试效率、减少人工成本、增强测试覆盖率等方面的优势。然而,自动化测试也面临着诸如脆弱性、维护成本高等挑战。最后,提出了一些应对挑战的建议,以期为软件测试领域的自动化工作提供一些启示。
13 1
|
11天前
|
机器学习/深度学习 人工智能 测试技术
提升软件测试效率与准确性的策略与工具
【5月更文挑战第2天】 在软件开发生命周期中,测试阶段是确保产品质量的关键。然而,传统的测试方法往往耗时且容易出错。本文将探讨一系列现代软件测试策略和工具,旨在提高测试效率和准确性。我们将分析自动化测试框架、持续集成(CI)、测试驱动开发(TDD)以及人工智能(AI)在测试中的应用,并讨论如何结合这些技术和方法来优化测试流程。
|
12天前
|
敏捷开发 监控 测试技术
探索自动化测试工具Selenium Grid的高效集成策略
【4月更文挑战第30天】在现代Web应用的快速迭代和持续部署中,测试自动化已成为确保产品质量的关键。Selenium Grid作为一款支持多种浏览器和操作系统的测试工具,提供了并行执行测试用例的能力,极大地提升了测试效率。本文将深入探讨如何高效地将Selenium Grid集成到现有的测试框架中,以及实施过程中的最佳实践,帮助团队最大化测试覆盖率,同时降低资源消耗。
|
12天前
|
中间件 测试技术 API
探索自动化测试工具的新边界:Selenium与Appium的集成实践
【4月更文挑战第30天】 随着移动应用和Web应用的不断融合,传统的自动化测试工具需要适应新的测试环境。本文将详细分析Selenium和Appium这两款流行的自动化测试工具的集成实践,探讨如何构建一个能够同时支持Web和移动端应用的自动化测试框架。通过对比两者的技术架构、功能特性以及在实际项目中的集成过程,我们旨在为读者提供一个清晰的指导,帮助他们在复杂的应用环境中实现高效、稳定的自动化测试流程。
|
12天前
|
机器学习/深度学习 人工智能 机器人
深入理解自动化测试:框架、工具与实践
【4月更文挑战第30天】 在现代软件开发周期中,自动化测试已成为确保产品质量和加速市场交付的关键环节。本文将探讨自动化测试的核心框架、常用工具以及实际应用的最佳实践,旨在为软件测试工程师提供深入的理解和有效的策略,以改进其自动化测试流程。我们将分析几种流行的测试自动化框架,包括Selenium、Appium和JUnit,并讨论如何根据项目需求选择适合的工具。此外,文中还将介绍持续集成(CI)环境下的自动化测试策略,以及如何通过测试结果分析和报告来优化测试过程。目标是帮助读者构建更健壮、更高效的自动化测试系统。

热门文章

最新文章