软件测试修炼之道之——诊断

诊断问题是程序调试的关键,这个阶段,我们可以开始解决缺陷问题了,你可以了解看到的运行结果背后的根本原因。

  真正有效的缺陷修复要求思维方式既开放又有条不紊,解决方法既创新又注重全面综合,这和软件开发的其他很多方面是一样的。

  一种调试方法:提出一个可能提供解释的假设,然后再构建实验去证明你的假设,如下:

  1、按照你对软件运行情况的理解,提出一个可以导致这种运行状况的假设

  2、设计一个实验,证明你的假设正确与否

  3、如果你设计的实验不能证明你的假设,那么重新设计一个实验,然后再次进行实验

  4、如果实验支持你的假设,那么继续进行实验,直到能证明或伪证你的假设

  这种方法十分有效,但却十分抽象,怎么才能把它转化为实际行动呢?

  不同类型的实验:首先,你可以检查该软件内部状态的某个方面(直接运行程序,利用调试器运行等),然后你可以改变软件运行的某个方式(改变输入参数,换一个运行环境等),看它的结果是否有所不同,最后,你可以改变软件本身编码的逻辑,检查这种变化的影响。

  做出什么样的选择要由你的假设的性质而定,而能否做出最佳的选择取决于你的经验和直觉,记住:你的实验必须要有一个明确的目标。

  实验必须起到验证的作用:如果假设始终成立,尽了最大的努力也无法推翻它,那么可以底气十足的宣称你的假设坚不可摧。

  每次只做一个修改:多个修改会导致错误的结论。此规则适用于任何可能影响软件运行的要素。

  记录你所做过的调试:定期回顾你已经尝试过的实验和学到的东西。

  不要忽略任何的细节:凡是你不明白的都是潜在的缺陷。

  相关策略

  插桩:最简单,最直接的方法,充分利用语言环境,收集和整理数据,评估任何代码,测试相关条件。

  假设你正在追踪java代码中数据结构方面的错误,并依次处理各个节点:

while(node != null)
{
    node.process();
    node = node.getNext();
}

  会得到提示:有节点被处理了多次,但我们并不知道不止一次返回的是哪些节点,此时可以使用插桩技术解决这个问题:

HashSet processed = new HashSet();
 
while(node != null)
{
    if(!processed.add(node))
    {
        System.out.printfln("The problem node is:" + node);
    }
     
    node.process();
    node.getNext();
}

  我们可以使用插桩技术编写出自调试软件。

  分而治之:二分法,是一种搜索策略,但是不要太依赖于这种方法,只有当你的搜索空间可以被均分成两部分时才是最有效的。

  利用原代码控制工具:有时我们会陷入回归状态,即,一个缺陷本来不影响正常运行,但做了改变之后却变成了实实在在的缺陷,此时在回归跟踪时有一个特别有价值的工具——源代码控制系统。

  聚焦差异:通过比对差异寻找出最有可能的问题。

 向他人学习:许多缺陷只在你的代码中发生,但有时缺陷设计广泛的使用技术,这些技术可能其他人在你之前就已经遇到过,此时,你需要做的就是向他人学习。

  奥卡姆剃刀:其他条件相同的情况下,最简单的解释是最好的。

  调试器:在代码运行的时候对代码进行检验、设置断点、单步调试、检查程序运行状态。

  为什么要使用调试器?

  1、在开发过程的初期,调试器是非常有帮助的,对代码进行单步调试由助于使我们确信软件运行的结果和我们想要的实现时一致的。

  2、如果我们想让代码以一种特定的方式运行,就可以使用调试器来确认或反驳这个想法。

  3、最后,调试器可以帮助我们探究看不懂的代码。

  然而,随着时间的推移,会发现我们使用调试器的时间越来越少,而更多的是编写一个测试程序,因为调试会话是短暂的,而测试是永久性的。测试不仅现在证明了代码是工作的,而且今后仍能证明,还能被其他的团队成员运行甚至改善。

  在诊断期间有无数的方法会误导人,因此这里我们来一起看看所谓的陷阱。

  你做的修改是正确的吗?如果你做的修改似乎没有任何效果,那么你并没有改到点子上,因此要在潜意识里时刻提高警惕。

  验证假设:了解你正在做什么样的假设,对它们进行严格的检验。

  多重原因:面临多种原因的最常见信号是一种你处于模糊状态的感觉——发生了一些似乎没有明显解释的怪事情,最富有成效的解决多原因缺陷的办法是 对问题进行隔离,并找到一个方法来重现缺陷,重现的缺陷产生的原因只依赖于多个原因中的一个,而不依赖于其他原因。另一个方法是开始先找寻同一区域内其他 较明显的缺陷,处理这些缺陷有时可以扫清障碍,让你理解得更透彻,使初始问题更加凸显。

  流沙:模糊感觉产生的另一个原因是一个不断变化的基础系统。面对一个不断变化的基础系统,停下手头工作并弄清是什么在变化,为什么在变化。

  调试是很艰苦的,有时简直苦不堪言,当你看不清前进的方向的时候可以试试以下的技巧:

  旁观调试法:最有效的一个扫除障碍的策略就是向其他人求助,解释问题会帮助你理清思路。

  角色扮演:角色扮演在解释和探讨问题时十分有用,特别在涉及那些互相独立的系统之间相互作用的问题时。

  换换脑筋:让潜意识帮助自己。

  做些改变:有时候,完全陷入困境之中,做些改变是十分必要的,任何改变都可以,也许它不会告诉你任何东西,但有时它会让你感到惊奇,让你惊奇的事总会教给你一些东西。

  福尔摩斯原则:当你排除了一切不可能后,无论剩下什么,无论它多么不可思议,也一定是真相。

  坚持:虽然有时候看起来不是这样,但实际上任何一个缺陷都是可以被诊断的。只要有足够的时间,付出足够的精力和决心,一定会解决的。

  无论如何,当你诊断出了问题的所在,在进行修复之前,务必要验证诊断,可以向其他人解释你的诊断,也可以检查源代码的原始副本,尝试和他人讨论并假设自己是错误的,这样可以让你信任自己所做的诊断,也就可以开始着手进行修复了。

  本章至此告一段落,一旦确诊,接下来的我们就该聊聊修复的问题了~

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-01 01:04:59

软件测试修炼之道之——诊断的相关文章

软件测试修炼之道之——重现问题

运用实证(实证依赖的是观察和经验,而不是理论和纯逻辑推理)方法进行调试可以充分利用软件的独特能力来告诉你软件运行的状态,而发挥这种能力的关键是找到能够重现问题的方法. 为什么重现问题如此重要? 不能重现问题,就几乎不可能取得进展,因为实证过程依赖于我们观察存在缺陷的软件执行的能力. 如何重现? 要做的第一件事很简单,就是按照缺陷报告描述(或提示)的步骤做,要做好问题重现就要抓好控制,而需要控制的因素如下: 1.软件本身:如果缺陷存在于最近修改的地方,那么你应该首先保证你调试运行的软件和缺陷被提交

项目经理修炼之道(2) -- 必须读的书 .

软件这个行当里历来有个谣言:项目经理不懂技术没关系. 有人说这事儿是外国的先进经验,但我怀疑这是杜撰的. 这一观点的潜台词是:项目经理是管理者,指挥下属就行了,干嘛要懂技术! 这就像说班长不用拿枪上战场一样可笑. 持这个观点的可还记得:"将军起于行伍,宰相拔于州郡"这一说. 我的观点是,项目经理一定要懂技术,并且还要有比较扎实的功底,虽然在专门领域上不一定是专家. 在这篇文章里,我们将列几本用来打根基的书,这些书要精读而不能翻翻就算了. 这些书的用途,不在眼前,但却最终决定你的成长高度

《Ruby程序员修炼之道》(第2版)—第1章1.1节进入Ruby的世界

第1章 进入Ruby的世界 Ruby程序员修炼之道(第2版) 本章主要内容 Ruby语法的生存工具箱① Ruby基础编程指引:程序编写.保存.运行和错误检查 Ruby安装指南 Ruby的扩展机制 Ruby中易用的命令行工具,包括交互式Ruby解释器(irb) 本书的内容是Ruby基础,而本章是基础中的基石.本章的目标是让读者在开始学习Ruby之前掌握足够的知识和技巧. 接下来读者将看到Ruby的基本语法和技术,以及Ruby的运行机制:如何写一个程序,怎样使用Ruby运行程序,以及如何把一个程序分

《Ruby程序员修炼之道》(第2版)目录—导读

版权 Ruby程序员修炼之道(第2版) • 著 [美] David A. Black 译 钟凤鸣 陈雪静 责任编辑 杨海玲 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn • 读者服务热线:(010)81055410 反盗版热线:(010)81055315 版权声明 Original English language edition, entitled The W

PostgreSQL修炼之道:从小工到专家

数据库技术丛书 PostgreSQL修炼之道:从小工到专家 唐成著             图书在版编目(CIP)数据 PostgreSQL修炼之道:从小工到专家/唐成著. -北京:机械工业出版社,2015.4 (数据库技术丛书) ISBN 978-7-111-49872-8 I. P- II. 唐- III. 关系数据库系统 IV. TP311.132.3 中国版本图书馆CIP数据核字(2015)第063966号 PostgreSQL修炼之道:从小工到专家 出版发行:机械工业出版社(北京市西城

Spark修炼之道系列教程预告

课程内容 Spark修炼之道(基础篇)--Linux基础(15讲).Akka分布式编程(8讲) Spark修炼之道(进阶篇)--Spark入门到精通(30讲) Spark修炼之道(实战篇)--Spark应用开发实战篇(20讲) Spark修炼之道(高级篇)--Spark源码解析(50讲) 部分内容会在实际编写时动态调整,或补充.或删除. Spark修炼之道(基础篇)--Linux大数据开发基础(15讲). Linux大数据开发基础--第一节:Ubuntu Linux安装与介绍 Linux大数据开

Spark修炼之道——Spark学习路线、课程大纲

课程内容 Spark修炼之道(基础篇)--Linux基础(15讲).Akka分布式编程(8讲) Spark修炼之道(进阶篇)--Spark入门到精通(30讲) Spark修炼之道(实战篇)--Spark应用开发实战篇(20讲) Spark修炼之道(高级篇)--Spark源码解析(50讲) 部分内容会在实际编写时动态调整,或补充.或删除. Spark修炼之道(基础篇)--Linux大数据开发基础(15讲). Linux大数据开发基础--第一节:Ubuntu Linux安装与介绍 Linux大数据开

《Linux内核修炼之道》——分析内核源码如何入手?(上)

<Linux内核修炼之道>--分析内核源码如何入手?(上) 透过现象看本质,兽兽门无非就是一些人体艺术展示.同样往本质里看过去,学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的. 既然要学习内核源码,就要经常对内核代码进行分析,而内核代码千千万,还前仆后继的不断往里加,这就让大部分人都有种雾里看花花不见的无助感.不过不要怕,孔老夫子早就留给我们了应对之策:敏于事而慎于言,就有道而正焉,可谓好学也已.这就是说,做事要踏实才是好学生好同志,要遵循严谨的态度,去理解每

《Ruby程序员修炼之道》(第2版)—第1章1.4节易用的Ruby工具和应用程序

1.4 易用的Ruby工具和应用程序 安装Ruby后,就可以得到一组重要的命令行工具,它们被安装在配置信息bindir所指定的文件夹中,通常是/usr/local/bin./usr/bin或者/opt同等的目录中.(可以使用require "rbconfig"去测试一下RbConfig::CONFIG["bindir"]返回的结果.)这些命令行工具具体是以下几个. ruby:解释器. irb:Ruby交互式解释器. - rdoc和ri:Ruby文档工具. rake: