《软件测试的艺术》摘要(中)
第五章 模块(单元)测试
1、测试用例的设计:使用一种或多种白盒测试方法分析模块的逻辑结构,然后使用黑盒测试方法对照模块的规格说明以补充测试用例。
2、增量测试:先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试。
非增量测试:先独立地测试每个模块,然后再将这些模块组装成完整的程序。
桩模块:用来模拟被测模块所调用的模块。
驱动模块:用来将测试用例传输到被测模块中。
3、增量和非增量的对比:
a)非增量测试所需的工作量要多一些。
b)增量测试可以较早地发现模块中与不匹配接口、不正确假设相关的编程错误。
c)增量测试时,调试会进行得容易一些。
d)增量测试会将测试进行得更彻底。
e)非增量测试所占用的机器时间显得少一些。
f)模块测试阶段开始时,非增量测试,会有更多的机会进行并行操作。
4、自顶向下的测试
优点:
a)如果主要的缺陷发生在程序的顶层将非常有利。
b)一旦引入IO功能,提交测试用例会更容易。
c)早期的程序框架可以进行演示,并可激发积极性。
缺点:
a)必须开发桩模块。
b)桩模块要比最初表现的更复杂。
c)在引入IO功能之前,向桩模块中引入测试用例比较困难。
d)创建测试环境可能很困难,甚至无法实现。
e)观察测试输出很困难。
f)使人误解设计和测试可以交迭进行。
g)会导致特定模块测试的完成延后。
5、自底向上的测试
优点:
a)如果主要的缺陷发生在程序的底层将非常有利。
b)测试环境比较容易建立。
c)观察测试输出比较容易。
缺点:
a)必须开发驱动模块。
b)直到最后一个模块添加进去,程序才形成一个整体。
第六章 更高级别的测试
1、功能测试:是一个试图发现程序与其外部规格说明之间存在不一致的过程。通常是一项黑盒测试,依赖于早期的模块测试过程实现的白盒测试结果。
2、系统测试:将系统或程序与其初始目标进行比较。并不局限与系统。如果产品没有一组书面的、可度量的目标,系统测试就无法进行。
利用程序的用户文档或书面材料,而不是外部规格说明,通过分析目标文档来设计系统测试。
测试用例的15个分类:
a)能力测试:确保程序的目标功能实现。
b)容量测试:发现处理大容量数据时的程序异常。
c)强度测试:发现在大规模负载、高强度不间断持续的数据处理中的异常。
d)可用性测试:评估最终用户在使用软件并与软件交互时的可用性问题。
e)安全性测试:试图攻破程序的安全防线。
f)性能测试:评估程序的响应时间以及吞吐量瓶颈。
g)存储测试:确保程序可以正确处理对其存储的要求,包括系统的存储和物理上的存储。
h)配置测试:检查程序是否能在推荐配置上流畅运行。
i)兼容性/转换测试:评估新版本是否兼容老版本。
j)安装测试:确保能够在所有支持的平台上安装软件。
k)可靠性测试:评估程序是否能达到规格说明中的运行时常和MTBF(平均故障间隔时间)要求。
l)可恢复性测试:测试系统恢复相关的功能是否按设计要求实现。
m)服务/可维护性测试:评估系统是否用于良好的数据处理和日志机制,以备技术支持和调试之需。
n)文档测试:校验所有的用户文档是否准确。
o)过程测试:对软件系统操作或维护所涉及的流程进行评估和确定。
3、验收测试:将程序与其最初的需求及最终用户当前的需要进行比较。
4、测试的计划与控制。好的计划应该包括
a)目标
b)结束准则
c)进度
d)责任
e)测试用例库及标准
f)工具
g)计算机时间
h)硬件配置
i)集成
j)跟踪步骤
k)调试步骤
l)回归测试:在对程序作了功能修改或进行了修改之后进行,目的是判断程序的改动是否引起了程序其它方面的退步。
5、测试结束准则:没有绝对的准则,依赖与对已有的测试结果的判断。
6、独立的测试机构:强调避免自己测试自己的软件。
第七章 可用性(或用户体验)测试
第八章 调试
1、简单地讲,调试是执行一次成功的测试之后所要进行的工作。所谓成功的测试表示经过测试发现一个错误。
2、蛮力法调试:
2.1 利用内存信息输出来调试
2.2 根据一般的“在程序中插入打印语句”建议来调试
2.3 使用自动化的调试工具进行调试
3、归纳法调试,调试步骤如下:
3.1 确定相关数据,寻找有价值的线索。
3.2 组织数据,尤其重要的是找到矛盾、事件。
3.3 研究线索之间的联系,利用线索结构里可能的模式作出一个或多个关于错误原因的假设。
3.4 证明假设,将假设与其最初的线索或数据相比较,以此来证明假设的合理性,确定这些假设可以完全解释这些线索的存在。
3.5 解决问题。
4、演绎法调试,演绎的过程是从一些普遍的理论或前提出发,使用排除和精炼的过程,达到一个结论(错误位置)。演绎的步骤如下:
4.1 列出所有可能的假设或原因。
4.2 利用数据排除可能的原因,选择最有可能的原因。
4.3 提炼剩下的假设。
4.4 证明剩下的假设。
4.5 修复问题。
5、回溯法调试,沿着程序的逻辑结构回溯不正确的结果,直到找到程序逻辑出错的位置。
6、测试法调试,编写特定的测试用例,尽量确定错误的位置。常和归纳法和演绎法一起使用。
7、调试的原则:
7.1 定位错误的原则:
a)动脑筋
b)如果遇到了僵局,就留到稍后解决
c)如果遇到了困境,就把问题描述给其他人听
d)仅将调试工具作为第二种手段
e)避免使用实验法,仅将其作为最后的手段
7.2 修改错误的技术:
a)存在一个缺陷的地方,很可能还存在其他缺陷
b)应纠正错误本身,而不仅是其症状
c)正确纠正错误的可能性并非100%
d)随着程序规模的增加,正确修改错误的可能性反而降低
e)应意识改正错误会引入新错误的可能性
f)修改错误的过程也是临时回到设计阶段的过程
g)应该改源代码,而不是目标代码
8、错误分析:
a)错误出现在什么地方
b)谁制造了错误
c)哪些做得不正确
d)如何避免该错误的出现
e)为什么错误没有早些出现
f)该如何更早地发现错误