测试理论知识七:暴力法调试、归纳法调试、演绎法调试、回溯法调试、测试法调试

1. 调试

调试是执行一次成功的测试之后所要进行的工作。

调试包含了两个步骤:

  1. 确定程序中可疑错误的准确性质和位置。

  2. 修改错误。

2. 暴力法调试

暴力调试方法可至少被划分为三种类型:

  1. 利用内存信息输出来调试。

  2. 根据一般的”在程序中插入打印语句”建议来调试。

  3. 使用自动化的调试工具进行调试。

2.1. 内存信息输出

使用内存信息输出是最缺乏效率的暴力调试方法。原因如下:

  1. 难以在内存区域与源程序中的变量之间建立对应关系。

  2. 即使对于复杂程度较低的程序,内存信息输出也会产生数量非常庞大的数据,其中的大多数都是与调试无关的。

  3. 内存信息输出显示的是程序的静态快照,仅能显示出在某一个时刻程序的状态,为了发现错误,还需要研究程序的动态状态(随时间的状态变化)。

  4. 内存信息输出很少可以精确地在错误发生的地方产生,因此无法显示在错误发生时程序的状态。错误发生到输出内存信息这段时间之内程序执行的活动,可能会掩盖掉发现错误所需的线索。

  5. 通过分析输出的内存信息来发现问题的方法并不太多(因此很多程序员都是密切注视,急切地渴望着错误能神奇地从内存信息输出中自行暴露出来)。

2.2. 程序中插入打印语句

在失效的程序中插入输出变量值的语句,这种做法也不具有很强的优势。它有如下缺点:

  1. 它不是鼓励我们去思考程序中的问题,而主要是一种碰运气的方法。

  2. 它所产生的需要分析的数据量非常庞大。

  3. 它要求我们修改程序,这些修改可能会掩盖掉错误、改变关键的时序关系,或者会引人新的错误。

  4. 它可能对小型程序有效,但如果应用到大型程序,成本就相当高。况且对于某些类型的程序,如操作系统或过程控制软件,这种办法甚至无法使用。

2.3. 自动化工具调试

这个方法比上述的两个测试方法要好些,但是仍处于碰运气的测试状态。所以暴力测试法我们推荐的优先级是比较低的。

3. 归纳法调试

归纳法调试可以从细节转到全局,也就是从线索出发,寻找线索之间的联系。

归纳法调试的步骤如下:

  1. 确定相关数据,最好将所有可用的数据或症状都考虑进去。

  2. 组织数据。

  3. 作出假设。

  4. 证明假设。

  5. 解决问题。

4. 演绎法调试

演绎的过程是从一些普遍理论或前提出发,使用排除法和精炼的过程。

演绎法调试过程如下:

  1. 列举出所有可能的原因或假设。

  2. 利用数据排除可能的原因。

  3. 提炼剩下的假设。

  4. 证明剩下的假设。

  5. 修复问题。

5. 回溯法调试

从程序产生不正确的结果的地方开始,从该处观察到的结果推断出程序变量应该是些什么值。使用回溯法调试,可以确定程序中从状态符合预期值的位置点,到第一个状态不符合预期值的位置点之间的范围。

6. 测试法调试

当发现了某个被怀疑的错误的症状之后,我们需要编写与原先有所变化的测试用例,尽量确定错误的位置。

7. 调试的原则

调试原则包括定位错误的原则和修改错误的原则

7.1 定位错误的原则

  • 动脑筋。

  • 如果遇到了僵局,就留到稍后解决。

  • 如果遇到了困境,就把问题描述给其他人听。

  • 仅将调试工具作为第二种手段。

  • 避免使用试验法——仅将其作为最后的手段。

7.2 修改错误的技术

  1. 存在一个缺陷的地方,很有可能还存在其他缺陷。

  2. 应纠正错误本身,而不仅是其症状。

  3. 正确纠正错误的可能性并非100%。

  4. 随着程序规模的增加,正确修改错误的可能性反而会降低。

  5. 应以是改正错误会引入新错误的可能性。

  6. 修改错误的过程也是临时回到设计阶段的过程。

  7. 应修改源代码,而不是目标代码。

8. 错误分析

详细的错误分析包括如下内容:

  • 错误出现在什么地方?

  • 谁制造了这个错误?

  • 哪些做得不正确?

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

  • 为什么错误没有早些发现?

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

相关推荐

  1. Linux程序库文件调试测试方法

    2023-12-23 13:08:03       14 阅读
  2. Linux设备调试-GDB调试器

    2023-12-23 13:08:03       33 阅读
  3. CAMERA调试

    2023-12-23 13:08:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 13:08:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 13:08:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 13:08:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 13:08:03       18 阅读

热门阅读

  1. 4.5 基于范围的for循环

    2023-12-23 13:08:03       35 阅读
  2. Vue3+Ts项目——第三方认证登录

    2023-12-23 13:08:03       42 阅读
  3. 最新Unity DOTS Physics物理引擎碰撞事件处理

    2023-12-23 13:08:03       40 阅读
  4. 创建与配置多路复用帧的嵌入式接收器

    2023-12-23 13:08:03       32 阅读
  5. 面试算法69:山峰数组的顶部

    2023-12-23 13:08:03       35 阅读
  6. Linux中vim常用的命令

    2023-12-23 13:08:03       32 阅读
  7. 第一章 $ZF Callout接口

    2023-12-23 13:08:03       36 阅读
  8. 力扣:205. 同构字符串(Python3)

    2023-12-23 13:08:03       50 阅读
  9. 我的创作纪念日

    2023-12-23 13:08:03       47 阅读
  10. 【宽度优先搜索 BFS】LeetCode-200. 岛屿数量

    2023-12-23 13:08:03       40 阅读