《软件测试的艺术》笔记之软件调试

《软件测试的艺术》读书笔记

  • 《软件测试的艺术》一书里面有专门的一章用来介绍调试的,可见当软件出现意想不到的错误的时候,调试时何其重要!所以这一章里面的笔记内容是比较多的。简单地讲,调试是执行一次成功的测试之后所要进行的工作。记住,所谓成功的测试,是指它可以证明程序没有实现预期的功能。虽然调试对于程序测试来说非常必要、不可或缺。但它似乎是软件开发过程中最不受程序员欢迎的部分之一。其主要原因可能包括以下几点:个人自尊会从中阻扰、热情耗尽、可能会迷失方向、必须自力更生。
  • 暴力法调试

这种方法之所以流行,是因为它不需要过多思考,是耗费脑力最少的方法,但同时也

效率低下,通常来讲不是很成功。至少可以被划分为三种类型:

  1. 利用内存信息输出来调试
  2. 根据一般的”在程序中插入打印语句”建议来调试
  3. 利用自动化的调试工具进行测试

这 些暴力调试方法的主要问题在于:它们都忽略了思考的过程。我们可以在调试程序和侦破谋杀案之间找出相似点来。实际上,在几乎所有的谋杀悬念小说中,谜案都是通过仔细分析线索,讲表面上不重要的细节全联结起来而最终侦破的。这不是一个使用蛮力的方法,要使用蛮力的是寻觅障碍物或搜寻财宝。

还有一些证据表明,无论调试小组成员是富有经验的程序员还是学生,肯动脑筋而不是依赖别人帮助的人能够更快、更准确地发现程序错误。因此,我们建议仅在下列情况下使用暴力调试方法:(1)其他的方法都失败了;(2)作为我们下面将会讨论的思考过程的补充,而不是替代方法。

  • 归纳法调试

归纳是一种特殊的思考过程,可以从细节转到全局,也即是从线索(即错误的症状,可能是一个或多个测试用例的结果)出发,寻找线索之间的联系。

归纳调试的步骤如下:

  1. 确定相关数据:列举出所有知道的程序执行的正确和不正确之处,那些相似却不相同、且未引起症状出现的测试用例提供了额外的有价值的线索。

  2. 组织数据:组织这些相关数据,以便观察线索间的模式,尤其重要的是找到矛盾、时间。

  3. 作出假设:研究线索之间的联系,利用线索结构里可能的模式作出一个或多个关于错误原因的假设。

  4. 证明假设:应将假设与其最初的线索或数据相比较,以此来证明假设的合理性,确定这些假设可以完全解释这些线索的存在。如果无法解释,要么这些假设是无效的或不完整的,要么还有更多的错误存在。

  • 演绎法调试

演绎的过程是从一些普遍的理论或前提出发,使用排除和精炼的过程,达到一个结论(错误的位置)。

演绎的步骤如下:

  1. 列举出所有可能的原因或假设:建立一份所有想象得到的错误线索的清单,线索不需要有完整的解释;它们纯粹是一些推测,帮助我们组织和分析现有的数据。

  2. 利用数据排除可能的原因:详细检查所有的数据,尤其寻找存在矛盾的地方,然后尽量排除所有可能的原因,仅留下一条。

  3. 提炼剩下的假设:此时的可能原因也许是正确的,但可能不够具体,不能指出错误来。因此,需要使用现有的线索来提炼这个准则。

  4. 证明剩下的假设。

  • 回溯法调试

沿 着程序的逻辑结构回溯不正确的结果,直到找到程序逻辑出错的位置。也即,从程序产生不正确结果的地方开始,从该处观察到的结果推断出程序变量应该是些什么值。在头脑中,从这个位置开始逆向执行程序,重复使用”如果程序在此处的状态时这样的,那么程序在上面位置的状态就必然是那样的”过程,就能很快定位出错 误。

  • 测试法调试

最后一个”思维型”的调 试方法是使用测试用例。考虑下面两种类型的测试用例:供测试的测试用例,其目的是暴露出以前尚未发现的错误;供调试的测试用例,其目的是提供有用的信息,供定位某个被怀疑的错误之用。换句话说,当发现了某个被怀疑的错误的症状之后,我们需要编写与原先有所变化的测试用例,尽量确定错误的位置。

  • 调试的原则
    • 定位错误的原则
      1. 动脑筋
      2. 如果遇到了僵局,就留到稍后解决
      3. 如果遇到了困境,就把问题描述给其他人听
      4. 仅将测试工具作为第二种手段
      5. 避免使用试验法 — 仅将其作为最后的手段
    • 修改错误的技术
      1. 存在一个缺陷的地方,很有可能还存在其他缺陷
      2. 应纠正错误本身,而不仅仅是其症状
      3. 正确纠正错误的可能性并非100%
      4. 正确修改错误的可能性随着程序规模的增加而降低
      5. 应意识修改错误会引入新错误的可能性
      6. 修改错误的过程也是临时回到设计阶段的过程
      7. 应修改源代码,而不是目标代码
  • 错误分析

调 试除了有消灭程序中错误的价值之外,还有其他重要作用:它可以告诉我们软件错误的一些本质,我们对此了解得非常之少。关于软件错误本质的信息可以为改进将来的设计、编码和测试过程提供有价值的反馈信息。任何程序员或编程机构都可以从详细分析发现的错误,或至少一部分错误的过程中获得提高。详细的错误分析会 包括如下内容:

· 错误出现在什么地方?

· 谁制造了这个错误?(不是为了处罚某人,而是为了进行培训)

· 哪些做得不正确?

· 如何避免该错误的出现?

· 该如何更早的发现错误?

分析的过程是很艰难的,但是找到的答案为改进后续的编程实践提供极其宝贵的价值。

《《软件测试的艺术》笔记之软件调试》有0个想法

  1. 博客写的不错啊,文章写的挺多的啊 哈哈~~ 加油啊 希望下次来的时候你做的更好,加油啊!

发表评论

电子邮件地址不会被公开。 必填项已用*标注