如何复现难以复现的缺陷

简介: 重现缺陷很容易陷入盲目的尝试,直到测试人员感到疲倦而放弃,也没有多少进展。提出错误猜测使得测试有明确的目标,在它的指引下测试人员可以自由发挥,而不会迷失方向。整个过程的特征是设定明确的目标、用实验去获得信息、根据新信息建立新目标。

调查一个难以重现的缺陷与软件调试非常相似,测试人员可以借鉴一些调试原则和方法。可以试试一下9条调试规则不但可以指导调试,还能帮助测试。
1.理解系统(Understand the system) 。解决一个具体问题,很多时候需要在整体上理解系统。重现一个缺陷也要求测试人员在宏观上和细节上都能把握软件。在项目全程,测试人员需要积极地学习被测软件的领域知识、产品架构、代码实现、技术平台、调试工具等。只有较全面地理解软件,才能有效地分析信息、设计实验、快
速测试。软件开发与测试没有捷径,持续积累才是正途。
2.制造失败(Make it fail) 。影响软件行为的因素包括软件自身的状态和软件的外部输入(用户的输入、操作系统的输入、其他软件的输入等)。测试人员应该列举这些影响软件行为的因素,并分析哪些因素可能与当前缺陷有关。然后,他需要大量尝试这些因素的取值组合,并试着总结缺陷重现的模式。有时测试人员需要求助于程序员,让他提供更好的测试钩子以控制软件的状态和输入,或提供更好的调试日志以了解软件的状态和输出。
3.观察先于思考(Quit thinking and look) 。在猜测引发错误的原因之前,应该仔细地观察软件的状态、操作系统的状态、所依赖的软件或服务的状态,并分析软件的输入数据和输出数据。细心观察可以更好地推测缺陷原因,设计更有效的测试,相反,凭空猜测很可能使测试误入歧途,费时费力却没有收获。
4.分而治之(Divide and conquer) 。如果运行一次测试需要大量的准备工作(如初始化数据库、复制数据文件、重启服务等),测试就不能提供快速的反馈,缺陷调查的效率就很低。为此,测试人员需要建立一个可以快速测试的环境,这通常需要隔离一些无关的数据、软件和服务,也需要测试钩子的帮助。在此环境中,测试人员通过逐次逼近来缩小搜索的范围,即通过测试来排除一些影响软件的因素,从而慢慢锁定若干重要的因素。
5.一次只做一处修改(Change one thing at a time) 。在科学实验中,科学家一次只修改一个变量的值,从而了解该变量对于实验结果的影响。同样,在测试中,测试人员一次只修改一个变量的值,从而了解它对软件行为的影响。
6.保持审计跟踪(Keep an audit trail) 。在调查过程中,要记录下所做的测试和测试结果。魔鬼隐藏在细节中,而人的记忆总是不可靠的。应该将测试、软件和环境的细节记录下来,作为缺陷报告的一部分。
7.检查基本假设(Check the plug) 。如果测试人员的调查没有进展,他也许要质疑一下他的基本假设。面对复杂的问题,测试人员的思考常常基于一些能简化情况的假设,例如他会假定“服务器返回的数据应该是没问题的”、“这个模块一直很稳定,不会出错”、“错误检查代码一定能过滤掉无效的输入数据”等。这些假设在大多数时候成立,但是并非永远如此,要质疑并检查它们。
8.获得全新视角(Get a fresh view) 。如果重现的努力没有成功,测试人员可以向程序员或测试同伴请教。软件是如此的复杂,每个人都有盲点。向别人解释问题,会强迫测试人员组织思路,这有助于他跳出原来的思维模式,获得新的见解。也许叙述完毕,测试人员就获得了新的测试灵感。此外,被咨询人可能知道一些知识,能够提供有效的测试策略或关键线索,这会显著提高调查效率。
9.如果你没有修复它,它就一直存在(If you didn't fix it, It ain't fixed) 。当重现缺陷的努力失败时,测试人员不能简单地说:“它一定随风而去了。”缺陷在测试环境中不出现,但可能在用户的环境中出现,更可能在公司领导向媒体做公开演示时出现。为了让项目团队获得必要的信息,测试人员应该提交缺陷报告。调查不可重现的缺陷可能是一个“时间黑洞”。测试人员应该根据缺陷的严重程度,设定不同长度的时间盒。在时间耗尽时,他可以自问:“是否追加一个时间盒继续调查?在下一个时间盒中能获得突破吗?对于项目而言,是继续调查还是开始新的测试更有利?”经过评估,他可以决定是继续调查,还是结束调查并提交缺陷报告。

相关文章
|
缓存 算法 Java
【开发利器Hutool】推荐一个超好用的本地缓存
【开发利器Hutool】推荐一个超好用的本地缓存
2468 0
【开发利器Hutool】推荐一个超好用的本地缓存
|
10月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【卷积层】| CVPR-2023 SCConv 空间和通道重建卷积:即插即用,减少冗余计算并提升特征学习
YOLOv11改进策略【卷积层】| CVPR-2023 SCConv 空间和通道重建卷积:即插即用,减少冗余计算并提升特征学习
281 0
YOLOv11改进策略【卷积层】| CVPR-2023 SCConv 空间和通道重建卷积:即插即用,减少冗余计算并提升特征学习
|
9月前
|
网络协议 网络安全
如何使用Traceroute定位网络问题?
`Traceroute` 是网络诊断工具,用于追踪数据包从源主机到目标主机的路径,帮助定位网络延迟、路由故障或中间节点问题。常用参数包括禁用DNS解析(`-n`)、指定最大跳数(`-m`)、每跳探测包数量(`-q`)等。结果解读涉及时间值、符号含义(如`*`表示未响应),并可进行高级用法如指定源接口、强制使用ICMP或TCP协议。常见问题包括中间节点高延迟、路径终点无法到达和路径环路,需根据具体情况进行排查和解决。
1651 1
|
人工智能 自然语言处理 算法
具身智能高校实训解决方案 ----从AI大模型+机器人到通用具身智能
在具身智能的发展历程中,AI 大模型的出现成为了关键的推动力量。高校作为培养未来科技人才的摇篮,需要紧跟这一前沿趋势,开展具身智能实训课程。通过将 AI 大模型与具备 3D 视觉的机器人相结合,为学生搭建一个实践平台。
1183 64
|
索引 Python
NumPy 快速入门:数组操作基础
【8月更文第30天】NumPy 是 Python 中一个非常重要的科学计算库,它提供了高性能的多维数组对象以及用于操作这些数组的工具。NumPy 数组(也称为 `ndarray`)是 NumPy 库的核心,它比 Python 内置的列表类型更高效,特别是在处理大型数据集时。本文将介绍 NumPy 数组的基本概念、创建方法以及一些常用的数组操作。
279 2
|
监控 关系型数据库 分布式数据库
PolarDB 读写分离的最佳实践
【8月更文第27天】PolarDB 是阿里云推出的一款高度兼容 MySQL、PostgreSQL 和 Oracle 的云原生数据库服务。它支持读写分离,能够显著提高应用的性能和响应速度。本文将详细介绍如何在 PolarDB 中实施读写分离策略,并通过示例代码演示具体的配置步骤。
521 1
|
SQL 数据挖掘 数据库
|
负载均衡 安全 应用服务中间件
nginx配置ssl和反向代理的配置代码
【5月更文挑战第2天】nginx配置ssl和反向代理的配置代码
822 3
|
人工智能 算法 安全
分享实录 | 阿里巴巴代码缺陷检测探索与实践
3月3日,阿里巴巴算法工程师别象在云效DevOps交流群中分享了《阿里巴巴代码缺陷检测探索与实践》。从阿里巴巴代码平台在探索缺陷检测和补丁推荐问题时遇到的挑战入手,介绍了目前业界和学术界较为流行的缺陷检测手段,并针对其局限性,提出PRECFIX方法。
6683 0
分享实录 | 阿里巴巴代码缺陷检测探索与实践
|
算法 安全 Linux
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
287 0