第01章 概述
第01章 概述
一、软件测试
软件测试的必要性和重要性
- 基本事实:各种各样的软件已经到处都是
- 软件错误会带来巨大的潜在损失(直接损失和发现错误后的修复成本等)
- 即使是优秀的程序员,即使有很好的系统设计,在绝大多数情况下都不是error-free的
- 如何保障软件质量:除了提高代码质量,改善软件工程方法之外,做软件测试已经成为了主要的软件质量保障方法
软件测试的目的
- 功能正确
- 了解性能
- 测试安全性
- 测试易用性
- 在完成以上几项的基础上尽量减小测试开销
如何获取高质量的软件
- 过程的管理
- 测试软件
二、基本概念
- 软件测试的概念:测试=查找输入值以对照软件进行检查的过程(本课程的重点)软件测试就是执行程序,带着找出错误的目的去做
- 错误肯定是存在的,永远不要相信自己找完了所有的错误。测试只能说明目前产品在测试范围里面是不是有问题,但不能证明没有问题。证明没有错误是验证做的事情。
- Debug:根据给定的failure找到fault的过程
- 测试用例:包含输入和期望输出
- 错误(Error):一个好的同义词就是mistake。错误往往会传播;
- 故障(fault):错误的具体表现,故障不一定是由编程错误引入的,也有可能是物理设备故障,系统设计错误和用户交互错误。往往都是Error导致的
- 失效(failure):代码运行时发生故障的后果,错误转为失效需要满足RIPR模型,用状态图分析程序,当执行过一个故障时,程序的状态与期望的程序状态将出现差异
- 事故(incident):用户能够明确发现的失效
三、Myers准则
- 在软件开发的早期就开始测试,并持续测试
- 避免开发者测试自己的软件
- 测试用例不仅要包含输入,还要包含期望输出
- 测试用例需要包涵有效输入和无效输入
- 测试用例需要覆盖“软件该做什么”和“软件不该做什么”
- 测试发现的错误和实际存在的错误的量成正比
- 应当进行多轮反复测试
- 软件测试是创新性的工作!
- 独立性准则(第三方测试)
- 完备性准则
- 完成测试计划
- 达成一定的覆盖率指标
四、测试过程
基本过程包括:
- 设计测试计划(作为测试的指导方针)
- 生成测试用例(要去用最少的测试用例,达到最完备的测试目的,软件测试的核心就是测试用例的设计)
- 搭建测试环境
- 执行测试用例
- 评估测试结果
测试的一些类型:
- 面向对象的
- 基于组件的
- 并发的测试
- 分布式的测试
- Web测试
- 用户图形界面的测试
测试的目标也有:
- 功能方面的
- 性能方面的
- 安全方面的
- 可用性方面的
- 正确性方面的
一些其他事实:
- 可能的输入集合(在大部分情况下)是难以遍历的甚至无法遍历的,软件测试需要选出一些有价值的输入输出作为测试用例
- 软件测试的开销是不可忽略的(事实上甚至往往超过软件总开发成本的一半!),软件测试工程常常要在测试开销和测试效果(测试覆盖率)之间做trade-off
- 软件测试不能保证软件是error-free的,需要证明error-free请转隔壁形式化验证
五、RIPR模型
- Reachability - 故障是可达的。测试用例要能达到它就能让它运行
- Infection - 故障会导致代码状态出错。一个程序运行过程里面,它的状态是不断的互相有依赖的,它们之间有这种依赖关系,它就传染性,
- Propagation - 错误的状态会导致代码的最终状态或输出出错。是整个一个过程,最终传播的话它能够一步一步的话传递到,最后面的一个状态里面去,传染是是两个之间,但是传播的话它一是有传播链的
- Revealability - 最终状态错误或输出错误必须是可观察的
- 可以用RIPR模型帮助设计测试用例
- 首先我们测试用例,你得能够执行到相应的错误的类型里面去,到达以后,会通过程序的互相的这种错误状态的传,这种相互依赖关系最终能够达到一个最终的状态的错误的产生,这个状态产生的话就说我们容易去观察到,因为它可以是一个系统的输出。最终定位到错误的位置。
六、第三方测试
- 现在很多软件验收的时候都是第三方测试,因为第三方测试的话它是站在一个相对中立的
- 它不是甲方就是那个需求的提出者,也不是乙方这个软件的开发者,但这样的话会发现,软件很多一些问题。
- 完整性准则,他不是说我要把所有可能的错这个测试都要跑一遍,它的完整性是相对的,是相对我们的测试计划完整的
七、Fault的类型
- 有物理错误,还有设计错误,还有这种交互的错误,
- 如下图所示:
- 交互式错误有时候不太好发现,但是这类错误往往是最致命的,因为很难发现。然后交互式的错误往往是在特定的交互场景下会出现