老测试告诉你自动化测试需要考虑什么?

news2025/1/14 19:52:42

写在前面

这篇文章译自著名测试专家James Bach的《Test Automation Snake Oil》一文,是笔者在学习和研究探索性测试时偶然发现的一篇较有意义的文章,很好地解答了我们对自动化测试的疑惑。

比如万能的自动化测试是否可以替代一切,还给我们提供了可行性很强的建议。

正如作者所说:先思考测试,再思考自动化,切莫本末倒置。

案例分析

先看几个案例。

案例1

一个产品从开发运维人员传递到下一个。

新开发人员发现产品设计文档已经过时,构建过程被破坏了。经过一个月的分析,每个人都宣称自己的设计很差,并坚持重写大部分代码。再过几个月,开发人员要么辞职,要么被重新分配,如此循环往复。

案例2

一个产品在开发过程中被匆忙完成,开发人员没有充分理解它应该解决的问题。

交付几个月后,审查发现问题,运行和维护系统的成本比自动化执行的流程的成本要高。

案例3

花费10万美元购买一套现代化的集成开发工具,很快就发现,这些工具的功能不够强大,可移植性不强,也不可靠,不足以服务于大规模的开发工作。

经过近两年的努力让它们工作,最终还是被抛弃了。

案例4

编写软件是为了自动化一组的业务任务,但是任务变化太大,导致项目远远落后于进度,系统的输出也不可靠。为了帮助手工完成任务,开发人员会周期性地退出项目,这使得他们在软件上的落后程度进一步加深。

案例5

一个由数百个几乎独立的功能组成的程序,只经过了基本的测试就投入使用,就在交付之前,作为调试的一部分,很大一部分功能被停用。几乎过了一年,才有人发现这些功能不见了。

这些都是我自己的经历,但我打赌它们听起来很熟悉。人们经常抱怨大多数软件项目都失败了,这也不该惊讶——从外部来看,软件似乎很简单,但魔鬼就藏在细节中,不是吗?

经验丰富的软件工程师知道这一点,并以警惕的眼光和怀疑的心态来对待每个新项目。

自动化测试也很困难,再看一下上面的五个例子,它们不是来自产品开发项目,相反,它们每一个都是自动化测试的成果。

在我管理测试团队和与测试自动化一起工作的9年里(注意,在一些软件行业最时髦、最富有的公司),我获得的最重要的洞察力是,测试软件项目和任何其他软件项目一样容易失败。

事实上,在我的经验中,他们失败的频率更高,主要是因为大多数组织没有像对待交付产品那样,对他们的测试件报以同样的关心。

奇怪的是,几乎所有的测试专家、实践测试人员、测试经理,当然还有销售测试工具的公司,都以压倒性的热情推荐测试自动化。

好吧,也许用“奇怪”这个词并不合适,毕竟CASE工具曾经风行一时,测试工具只是CASE的另一种。

从面向对象到“无程序员”编程,对我们这个行业来说,不切实际的鼓吹并不是什么新鲜事。

因此,也许关于测试自动化的公开信息和分析质量不高并不奇怪,而仅仅是该领域不成熟的标志。

也许我们还处于赞赏测试自动化很酷的想法阶段,还没有到认识到它的陷阱的地步。

比起其他测试任务,我更喜欢做自动化。大多数全职测试人员,以及可能所有的开发人员都梦想着可以按下一个巨大的绿色按钮,让一个充满忠诚的机器人的实验室去做艰难的测试工作,解放自己去做其他事,比如玩游戏。然而,我们想要实现这样的梦想,就必须谨慎行事。

本文对GUI应用回归测试自动化的“脚本和回放”进行了批判性分析。

剖析自动化测试
 

揭穿经典 自动化的理由

“自动化测试在没有人为干预的情况下执行一系列操作,这种方法有助于消除人为错误,并提供更快的结果。由于大多数产品需要多次测试,而自动化测试通常会带来显著的人工成本节省。通常,一个公司在运行两到三次自动化测试后,就会超过劳动力成本的盈亏平衡点。”

这句话来自于一个领先的测试工具供应商发布的关于测试自动化的白皮书,类似的声明可以在大多数商业回归测试工具的广告和文档中找到。

有时,文档中还夹杂着令人印象深刻的图表,这些说法与图标可以归结为:计算机比人类更快、更便宜、更可靠,因此选择自动化。

这种推理基于许多不顾后果的假设,让我们来看看其中的8个:

鲁莽假设1:测试是一个“行动序列”

一种更有用的方法是将测试看作是穿插着评估的一系列交互,这些交互中有些是可预测的,有些可以用纯粹客观的术语来指定。

然而,还有许多其他的交互是复杂、模糊和不稳定的。尽管将包含给定测试的一般动作序列概念化通常是有用的,但如果我们试图将测试简化为死记硬背的一系列动作 ,结果将得到一个狭窄和浅层的测试集。

而人工测试则是一个容易适应变化、能够应对复杂情况的过程。人类能够检测出数百种问题模式,一眼望去,就能立刻将它们与无害的异常区分开。

人类甚至可能不会意识到他们正在进行评估,但在“行动序列”中,每一个评估都必须明确规划。测试可能看起来只是一组行动,但好的测试是一个互动的认知过程。这就是为什么自动化最好只应用于一小部分的测试,而不是大部分的测试过程。

如果你打算将所有必要的测试都执行自动化,可能会花费大量的金钱和时间来创建相对较弱的测试,这些测试忽略了许多有趣的bug,并发现许多“问题”,这些问题最终只不过是意料之外的正确行为。

鲁莽假设2:测试意味着一遍又一遍地重复相同的动作

一旦一个特定的测试用例被执行了一次,并且没有发现任何bug,那么这个测试用例找到bug的可能性就很小了,除非一个新的bug被引入到系统中。

不过,如果测试用例中有变化,就像手工执行测试时通常会出现的情况一样,那么新问题和旧问题暴露出来的可能性就会更大,可变性是手工测试相对于脚本和回放测试的一大优势。

当我在Borland的时候,电子表格组用来跟踪bug是通过自动化还是手动测试发现的——始终如一。超过80%的bug是通过手动发现的,尽管在自动化方面投入了几年的时间。

他们的理论是,手工测试的变量更多,针对新功能就更容易发现bug的特定变化领域。

高度可重复性的测试实际上可以将发现所有重要问题的几率降到最低,同理,踩着别人的脚印也可以将踩坑的几率降到最低。

鲁莽假设3 :我们可以做自动化测试

一些对人来说容易的任务对计算机来说很难,也许自动化最难的部分是解释测试结果。对于GUI软件来说,在忽略无关紧要的问题的同时,自动注意到所有类别的重大问题是非常困难的。

在一个典型的创新软件项目中,高度的不确定性和变化加剧了自动化的问题。在市场驱动的软件项目中,通常使用增量开发方法,这几乎可以保证产品将发生根本性的变化。

再加上通常没有完整准确的产品规格说明,使得自动化开发有点像开车穿越无指示牌的森林:可以做到,但必须慢一点,有可能会走回头路,也可能会卡住。

即使我们有一个特定的操作序列,原则上是可以自动化的,但我们只有在拥有合适的的工具的情况下,才能做到这一点。

然而,关于工具的信息很难获得,回归测试工具的最关键的点是不可能评估的,除非我们使用该工具创建或审查工业规模的测试套件。

以下是在选择测试工具时需要考虑的一些因素,请注意,其中有多少永远无法通过阅读用户手册或观看贸易展演示来评估:

可学习性:能在短时间内掌握工具吗,是否有培训课程或书籍来帮助这个过程?

性能阐述:与手工测试相比,该工具的是否足够快,能够大幅节省测试开发和执行时间?

非侵入性:该工具模拟实际用户的效果如何,被测软件在有没有自动化的情况下是一样的吗?

鲁莽假设4: 自动化测试更快,因为它不需要人工干预

所有自动化测试套件都需要人工干预,哪怕只是诊断结果和修复有问题的测试,要让一个复杂的测试套件顺利运行,也可能出乎意料地困难。

常见的罪魁祸首是被测软件的变化、内存问题、文件系统问题、网络故障以及测试工具本身的bug。
 

鲁莽假设5:自动化减少了人为错误

确实减少了一些错误,比如人类在被要求执行一长串测试时会犯的错误。

但其他错误被放大了,任何在生成主比较文件时未被注意到的bug都会消失。

每次执行套件时都会系统地忽略掉,或者调试过程中的一个疏忽可能会意外地使数百个测试失效。

Borland的dBase团队曾经发现,他们的套件中大约有3000个测试被硬编码报告成功,而不管产品中实际存在什么问题。为了避免这些问题,应该定期对自动化进行测试或审查。

在另一方面,使用基本的测试管理文档、报告和实践,更容易发现相应的失误。

鲁莽假设6:我们可以量化手动测试和自动化测试的成本和收益

事实是,手动测试和自动化测试实际上是两个不同的过程,而不是两种不同的方式来执行同一个过程。它们的动态是不同的,它们倾向于揭示的bug也是不同的。

因此,直接以成本或发现的bug数量来比较它们是没有意义的。

此外,最好的评估方法是在一系列真实的软件项目的背景下进行。这就是为什么我建议把测试自动化作为一个优秀的测试策略的多方面追求的一部分,而不是一个支配过程的活动,或者独立于它。

鲁莽假设7:自动化将带来“显著的劳动力成本节省”

“通常,一家公司在进行两到三次自动化测试后,就会超过劳动力成本的盈亏平衡点。”这种估计可能来自实地数据,也可能来自营销专家的想法,无论如何,这都是无稽之谈。

自动化测试的成本由几个部分组成: 阐述自动化开发的成本-操作自动化测试的成本-产品变化时维护自动化的成本-其他必要的新任务的成本。

这必须与任何剩余的人工测试的成本进行权衡,这可能会相当多。事实上,我从未经历过这样的自动化,它将手动测试的需求减少到如此程度,以至于手动测试人员最终需要做的工作更少。

这些成本如何计算取决于很多因素,包括被测试的技术、使用的测试工具、测试开发人员的技能,以及测试套件的质量。

编写一个测试脚本并不一定需要很多精力,但是构建一个合适的测试工具可能需要几周或几个月的时间。决定购买哪种工具、自动化哪些测试、如何将自动化跟踪到测试过程的其余部分,当然还有学习如何使用工具,然后实际编写测试程序的过程,也是如此。

要思考出一个全面的方法来处理这个过程(即一个产生有用的产品)通常需要几个月的全职工作,如果自动化开发人员对测试自动化的问题或工具和技术的细节缺乏经验,则需要更长的时间。

持续的维护成本如何呢?大多数自动化测试的成本分析完全忽略了因为自动化而必须完成的特殊的新任务,比如:

测试用例必须被仔细地记录下来;

自动化本身必须经过测试;

每次执行套件时,都必须有人仔细检查结果,以区分假阴性和真正的bug;

必须审查待测试产品中的根本变化,以评估它们对测试套件的影响,并且可能必须编写新的测试代码来应对它们;

如果被测试的产品随后被移植到一个新的平台,甚至是同一个平台的新版本,那么必须要做移植测试。

这些新任务对测试人员的日常生活产生了重大影响,我工作过的大多数GUI软件测试团队都尝试过让所有测试人员做兼职自动化工作,但每个团队最终都放弃了这个想法,转而选择一个专门的自动化工程师或团队。

编写测试代码和执行交互式手测试是如此不同的活动,一个被分配到这两种职责的人将倾向于专注于其中一项而忽略另一项。

而且,由于自动化开发是软件开发,它需要一定的开发人才数量,有些测试人员做不到。无论如何,对自动化持严肃态度的公司通常最终会有全职员工来做这件事,而这必须计入到整体战略的成本中。

不计后果的假设8:自动化不会伤害测试项目

最后留下了我们在追求自动化策略时面临的所有问题中最棘手的一个:将我们不理解的东西自动化是危险的。

如果我们在引入自动化之前没有弄清楚测试策略,测试自动化的结果将是大量完全没有人能理解的测试代码。

随着套件的原始开发人员漂移到其他任务中,其他人接管维护工作,套件在测试团队中获得了某种归属身份。维护者害怕扔掉任何旧的测试,即使它们看起来毫无意义,因为它们可能在以后被证明是重要的。

因此,这套套件继续增加新的测试,成为一个越来越神秘的神谕,就像一些古老的喜马拉雅大师或迪士尼电影中的说话橡树。没有人知道套件实际测试的是什么,也没有人知道产品“通过测试套件”意味着什么,而且规模越大,就越不可能有人不费苦心地去寻找。

这种情况在我个人身上发生过(不止一次,在我吸取教训之前),我也看到和听说过这种情况发生在许多其他测试经理身上。

大多数人甚至没有意识到这是一个问题,直到有一天一个开发经理问测试套件覆盖了什么,不覆盖什么,没有人能够给出答案。

或者有一天,在最需要它的时候,整个测试系统崩溃了,并且没有手动的过程来进行备份。这种情况的讽刺之处在于,诚实地尝试更专业地进行测试,最终可能会确保它是盲目和无知地完成的。

手动测试策略也可能会受到混淆的影响,但是当测试是从相对较小的一组原则或文档动态创建时,审查和调整策略就容易得多。是的,手动测试速度较慢,但更灵活,它可以应对不完整和不断变化的产品和规格的混乱。

一种明智的自动化方法

尽管本文提出了关注,但我确实相信测试自动化,毕竟我是一名测试自动化顾问。

就像可以有高质量的软件一样,也可以有高质量的自动化测试。然而,要创建好的测试自动化,我们必须小心谨慎,这条道路充满了陷阱。以下是一些需要牢记的关键原则:

仔细区分自动化和它所自动化的过程。测试过程应该是一种便于审查的形式,并映射到自动化过程中,套件将与人工测试一起使用,而不是作为人工测试的替代品。

仔细选择测试工具。从其他测试人员和组织收集经验,在购买之前尝试候选工具的评估版本。

仔细考虑购买或构建一个测试管理工具,一个好的测试管理系统可以真正帮助使套件更可查看和可维护。

确保测试套件的每一次执行都会产生一个状态报告,其中包括哪些测试通过了,哪些测试失败了,以及实际发现的bug。该报告还应详细说明为维护或增强套件所做的任何工作,我发现这些报告是分析自动化的成本效益的不可或缺的原始材料。

确保产品足够成熟,使不断更改测试的维护成本不会压倒所提供的任何好处。

几年前的一天,在一场猛烈的夜间风暴中发生了一次停电,影响了我们团队创建的测试套件。当我们第二天早上到达工作地点时,我们发现我们的套件已经自动重启了自己,重置了网络,从中断的地方重新开始,并完成了测试。

为了让我们的套件变得如此防弹,我们做了很多工作,我们很高兴。事情是这样的,我们后来在审查套件中的测试脚本时发现,在大约450个测试中,只有大约18个测试是真正有用的。

这是一个很长的故事,但它的结果是,我们有一个可靠性极高测试套件,发现我们正在测试的软件的任何重要的bug。

我已经把这个故事告诉了其他不以为然的测试经理,他们不认为这种事情会发生在他们身上,但如果测试的机器让你从测试的技巧上分心,它就会发生。

自动化是个好想法,但要让它成为一项好的投资,秘诀是先考虑测试,然后再考虑自动化。如果测试是为了了解软件质量的一种手段,那么自动化只是一种手段中的手段。你不会从广告中了解到这一点,但它只是支持有效软件测试的众多策略之一。
 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是多相流?在熟悉工业中常见的两相及多相流的分类及特点

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

安全工程与运营

安全工程与运营 系统安全工程系统安全工程重要性安全工程系统安全工程理论基础 成立成熟度模型、系统安全工程能力成熟度模型能力成熟度模型(Capability Maturity Model)能力成熟度模型基本思想系统安全工程能力成熟度模型SSE-CMM的作用SSE-CMM体系结构域…

第9章:创建和管理表

一、数据库的创建修改和删除 1.SQL的分类 DDL:数据定义语言 create创建、alter修改、drop删除、rename重命名、truncate清空 DML:数据操作语言 insert、delete、update、select DCL:数据控制语言 commit提交、rollback回滚、savepoint保存…

Spot CEO:我们为什么选择Babylon.js而不是Three.js

为现代网络开发令人兴奋的事情之一是底层平台的快速发展。 WebAssembly、WebGL、WebGPU、Web Worker 等正在解锁以前典型 Web 产品无法想象的体验。 在过去的几年里,我们看到像 Figma 这样的产品利用这一点创造了极具吸引力的业务和产品。 推荐:用 NSDT设…

前端-01Html5基本知识

1 基本 1.1 第一个前端程序 内容 <html><head><title>我的网页</title></head><body>Hello,我的第一个网页</body> </html>使用浏览器打开 1.2 工具安装 浏览器 谷歌浏览器 清缓存 ctrlshiftdelete vscode 生成浏览器文…

cubic 的 tcp friendliness 与拐点控制

TCP CUBIC 应该是迄今为止综合表现最优秀的算法&#xff0c;其中有两个亮点&#xff0c;一个是 RTT 无关性&#xff0c;另一个是可扩展性。RTT 无关性表现在 CUBIC 的 cwnd 表达式中没有 RTT 因子&#xff0c;而可扩展性则来自于曲线本身&#xff1a; 随着 BDP 增加&#xff0…

音视频技术开发周刊 | 292

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功&#xff0c;微软是OpenAI的重要投资者&#xff0c;它将ChatGPT植入必应搜索&#…

【16】SCI易中期刊推荐——计算机 | 人工智能领域(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

【IO】零拷贝、mmap、sendfile

文章目录 前言一、普通IO二、mmap三、sendfile1. Linux2.1的sendfile2. Linux2.4的sendfile 四、总结与扩展1. 结论2. 解释、扩展 参考 前言 概念&#xff1a; 没有发生CPU拷贝数据&#xff0c;都是DMA&#xff08;直接内存访问&#xff09;拷贝 优势&#xff1a; 减少内核态…

《算经》中的百钱买百鸡问题,你会做吗?试下看看(39)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 你知道我国历史上有个王朝叫北魏吗&#xff1f; 北魏&#xff08;386年—534年&#xff09;&#xff0c;南北朝时期北…

HashMap 简述

文章目录 前言一、HashMap的数据结构二、HashMap存储数据的大致过程1 哈希值2 什么是哈希冲突?3 为何有两种数据结构? 三、HashMap常用知识总结 前言 HashMap 是开发中常用的一种数据结构,通常用做返回值,计算比对等,会经常用到; 一、HashMap的数据结构 jdk8之后,数据结构是…

时至今日,Pascal系列Turbo Pascal 5.0依旧是我心中永远的神

从DOS时代到Windows时代&#xff0c;从桌面应用到Web应用&#xff0c;每一个时代都有它特定的编程工具 在我看来&#xff0c;DOS时代的编程语言&#xff0c;Pascal必占一席之地。 尤其是Turbo Pascal系列的最后一个版本——Turbo Pascal 5.0&#xff0c;更是我心目中永不褪色的…

nginx企业级高性能配置优化

一、基础配置优化 1、CPU亲和性优化 1.1、推荐直接将配置项设置成auto (worker_cpu_affinity)&#xff0c;即采用了Nginx推荐的CPU绑核策略方式。 1.2、手动绑定&#xff0c;将worker线程数量与CPU核心数一一绑定方式设置&#xff0c;设置成auto Nginx会自动识别并按照推荐策略…

New Bing 全面开放?我看未必

前段时间大家应该都被ChatGPT刷屏了&#xff0c;其实就回答来说New Bing 才是最厉害的&#xff0c;因为它底层使用了ChatGPT 并且可以支持联网查询数据&#xff0c;回答中还能支持看到出处&#xff0c;方便确认其真实性。 New Bing 是微软基于 OpenAI ChatGPT 技术开发的新一代…

vue3项目搭建

一、安装 vue3.0 脚手架 &#xff08;1&#xff09;node安装&#xff08;前端开发环境&#xff09; 打开node官网:https://nodejs.org/zh-cn/ 下载node并安装&#xff08;安装vue3建议node在10.0版本以上&#xff09;。 输入node -v可显示node版本 &#xff08;2&#xff09;…

使用思维链(Chain-of-thoughts)提示在大型语言模型中引出推理

语言模型(LM)在NLP领域的发展速度非常快&#xff0c;特别是在大型语言模型(LLM)方面&#xff1a;当语言模型具有大量参数或权重/系数时&#xff0c;它们被称为“大型”。这些“大型”语言模型拥有处理和理解大量自然语言数据的能力。 LLM被用于一系列自然语言任务&#xff0c;…

【Java EE】-Servlet(三) MessageWall

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 寂寞会发慌&#xff0c;孤独是饱满的。——史铁生《命若琴弦》 主要内容&#xff1a;前后端交互接口协商&#xff0c;约定好&#xff0c;使用什么数据格式传输&…

变现 起航篇! 手把手交你用chatgpt快速生成视频!

Chatgpt 很多同学都用的非常熟练了&#xff0c;但是都停留在文字阶段&#xff0c;有没有更好玩的用法&#xff0c;可以深度的利用chatgpt做一些事情呢&#xff1f; 今天菜哥就找一个方法可以快速利用chatgpt制作视频&#xff0c;整个过程大概3分钟&#xff0c;非常有趣&#xf…

浪涌保护器的工作类型及其应用

所有电路系统中的电气设备都需要浪涌保护器的保护支持。这主要取决于器件的内部电路如何能够处理电压波动。如果器件出现输入电压波动&#xff0c;则会导致器件损坏&#xff0c;因为电源电压的波动可能对器件有害。在本文中&#xff0c;我们将了解什么是浪涌保护器&#xff0c;…

【源码+个人总结】Spring 的 三级缓存 解决 循环依赖

Spring可以通过以下方法来避免循环依赖&#xff1a; 构造函数注入&#xff1a;使用构造函数注入来注入依赖项&#xff0c;这是一种比较安全的方式&#xff0c;因为在对象创建时就会注入依赖项&#xff0c;可以避免循环依赖。 Setter方法注入&#xff1a;使用Setter方法注入依赖…