软件测试的定义:测试是为发现错误而执行程序的过程
一、软件测试的心理学
人类行为总是倾向于具有高度目标性,确立一个正确的目标有着重要的心理学影响。如果我们的目的是证明程序中不存在错误,那就会在潜意识中倾向于实现这个目标,所以应该一开始就假设程序中隐藏着错误,然后测试程序发现尽可能多的错误。
二、软件测试的经济学
测试投入的目标在于通过有限的测试用例,最大限度的提高发现问题的数量,已取得最好的测试效果。
三、软件测试的准则
这些原则看上去大多都显而易见,但常常被我们忽略掉
- 测试用例中一个必须的部分是对预期输出或结果的定义
- 程序员应当避免测试自己编写的程序
- 编写软件的组织不应当测试自己编写的软件
- 应当彻底检查每个测试的执行结果
- 测试用例的编写不仅应当根据有效和预期的输入情况,而且也应当根据无效和未预料到的输入情况
- 检查程序是否“未做其应当做的”仅是测试的一半,测试的另一半是检查程序是否“做了其不应该做的
- 应避免测试用例用后即弃,除非软件本身就是一个一次性的软件
- 计划测试工作时不应该默许假定不会发现错误
- 程序某部分存在更多错误的可能性,与该部分已发现错误的数量成正比
- 软件测试是一项极富创造性、极具智力挑战性的工作
四、测试方法:
白盒测试逻辑驱动,关注的是测试用例执行的程度或覆盖程序逻辑结构(源代码)的程度,
白盒测试的方法:
- 语句覆盖:程序中的每条语句至少被执行一次。
- 判定覆盖:使得每一个判断都至少有一个为真和为假的输出结果。
- 条件覆盖:确保将一个判断中的每个条件的所有可能的结果至少执行一次。
- 判定/条件覆盖:将一个判断中的每个条件的所有可能的结果至少执行一次,将每个判断的所有可能的结果至少执行一次,将每个入口点都至少调用一次。
- 多重条件覆盖:将每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。
黑盒测试/数据驱动的测试,测试目标与程序的内部机制和结构完全无关,而是将重点集中放在发现程序不按其规范正确运行的环境条件。
黑盒测试的方法:
- 等价类划分:有效等价类和无效等价类
- 边界值分析 :在任何情况下都应使用边界值分析方法。
- 因果图分析
- 错误猜想:利用直觉和经验猜测出错的可能类型,然后编写测试用例还暴露这些错误。
建议:综合最多的测试方法来设计严格的程序测试,某种方法遗漏掉的错误用其他方法就可能会找出来。
测试策略
- 如果规格说明里面包含条件组合的情况,应首先使用因果分析方法
- 在任何情况下都应该使用边界值分析方法,对输入和输出边界都要进行测试
- 应该为输入和输出确定有效和无效等价类,必要的情况下对上面的测试用例进行补充
- 使用错误猜测技术增加更多的测试用例
- 针对上述的测试用例集检查程序的逻辑结构,应考虑使用逻辑覆盖准则
五、模块测试
- 模块测试:模块测试是对程序中的单个子程序、子程序或过程进行测试的过程。
- 动机:减轻了调试(准确定位并纠正某个已知错误的过程)的难度,一旦问题暴露出来轻易就知道具体是哪个模块的错误
- 目的:将模块的功能与定义模块的功能规格说明或接口规格说明进行比较。即所有测试过程的目的不是说明模块符合其规格说明,而是为了说明模块与其规格说明存在着矛盾
-
设计测试用例
依赖:模块的规格说明+模块的源代码
模块测试的测试用例设计过程:使用一种或多种白盒测试方法分析模块的逻辑结构,然后使用黑盒测试方法对照模块的规格说明以补充测试用例
驱动模块:用来将测试用例驱动或传输到被测模块中。
桩模块:测试上层模块时用来模拟下层模块的的模块。
非增量测试:先独立地测试每个模块,然后再将这些模块组装成完整的程序。
增量测试:先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试。又叫集成测试。增量测试优于非增量测试
1)自顶向下;
2)自底向上。
image.png
六、更高级别的测试
功能测试的目的是为了证明程序未能符合其外部规格说明。
系统测试的目的是为了证明软件产品与其初始目标不一致,即将系统或程序与其初始目标进行比较,也就是说比较程序、程序目标和用户文档之间的不一致性。
系统测试
- 能力测试:确保程序的目标功能实现,逐条语句地检查目标文档,判断程序是否满足
- 容量测试:发现处理大容量数据时的程序异常
- 强度测试:发现在大规模负载、高强度不间断持续的数据处理中的异常(有的也叫压力测试)
- 可用性测试:评估最终用户在使用软件并与软件交互时存在的可用性问题(也可叫做用户体验测试,即真实用户的使用体验)
- 安全性测试:试图攻破程序的安全防线
- 性能测试:评估程序的的响应时间和吞吐率
- 存储测试:设计测试用例来证明软件的存储目标(内存或辅助存储)没有达到。
- 配置测试:测试软件在不同配置环境下(操作系统,浏览器等)程序不同的反应。
- 兼容性/转换测试:评估新版本是否能兼容老的版本
- 安装测试:确保能够在所有支持的平台上安装软件
- 可靠性测试:评估程序是否能达到规格说明中的运行时常和平均故障间隔时间要求
- 可恢复性测试:证明系统的恢复机制不能够正确发挥作用。恢复机制是当系统发生故障时,如何从程序错误、硬件失效和数据错误中恢复过来。
- 服务/可维护性测试:评估系统是否拥有良好的数据处理和日志机制,以备技术支持和调试之需
- 文档测试:校验所有用户文档是否准确
- 过程测试:对软件操作系统或维护所需涉及的流程进行评估和确定
七、总结
- 软件测试是一个破坏性的过程,甚至是一个“施虐”的过程!!!
- 切记软件测试的基本准则!
- 不要听rd的,不要听rd的建议而如何如何测试
- 软件测试是一项极富创造性、极具智力挑战性的工作
- 书中自有黄金屋书中自有颜如玉