概念
通过人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。
原则:
- 测试证明软件存在缺陷:无论执行什么样的测试操作都不能证明当前软件是没有缺陷的
- 不能进行穷尽测试:有些功能没办法将所有的测试情况都罗列处来
- 缺陷存在集群现象:二八理论,核心功能占20%,非核心占80%
- 某些测试需要依赖特殊的环境
- 测试应尽早介入
- 杀虫剂现象:同样的测试用例不能重复执行多次,因为软件会对它产生免疫
- 不存在缺陷谬论:任何软件不可能是完美的
流程:
- 需求分析:梳理清楚需要设计的点是什么。来源:需求规格说明书/API文档/同类产品分析/个人经验
- 制定测试计划:确定测试范围及测试策略。
- 设计用例:等价类划分法/边界值分析法/判定表
- 评审用例:
- 配置环境
- 执行用例:先进行冒烟测试
- 回归测试及缺陷跟踪
- 输出测试报告
- 测试结束
分类:
-
按测试阶段分类
- 单元测试(UT):最小单元的单元
- 集成测试(IT或接口测试):
- 系统测试(ST):业务角度
- 验收测试:alpha测试(内部测试)/beta测试(公测)/UTA测试(特定场景测试,目的是让客户为当前软件买单)
-
按测试手段分类
- 黑盒测试(功能测试):只测试功能,不关注内部实现,贴近用户的使用角度,自动化测试覆盖率低,复用率低。方法:等价类划分法,边界值分析法,错误推测法,因果图-->判定表法,正交试验分析法
- 白盒测试(单元测试):关注内部逻辑(语句,条件,条件组合,分支,路径)。 方法:代码检测法,静态结构分析法,静态质量度量法,逻辑覆盖法,基本路径测试法
- 灰盒测试(接口测试):介于白盒与黑盒之间
- 静态测试:无需执行代码(互审,走查,会议)
- 动态测试:执行代码
- 手工测试:易发现缺陷,容易实施,灵活性高
- 自动化测试:包括 单元测试,接口测试,性能测试,优点:高效率,速度快,高复用性,准确/可靠
-
按测试模型分类
- V模型:需求分析--概要设计--详细设计--软件编码--单元测试--集成测试--系统测试--验收测试。 优点:包含了底层测试(单元测试)和高层测试(系统测试);清楚的标识了开发和测试各个阶段;自上而下逐步求精,每个阶段分工明确,便于整体项目的把控。 缺点:错误不能及时进行修改;需求经常变化导致返工量大,灵活度较低 。 改进:每个步骤都可以进行小的迭代工作。
- W模型:需求和设计阶段也有测试活动。 优点:更早的介入测试,修复成本低,分阶段工作,方便项目整体管理。 缺点:需要文档,不适合小型公司。
- H模型:
- 敏捷测试:从客户角度进行测试,尽早测试,不间断测试
- 基于脚本的测试(SBT)
- 探索式测试(ET):完全抛开脚本的测试
- 基于风险的测试(RBT)
- 基于模型的测试(MBT)
-
按测试类型分类
- 功能测试:功能错误或遗漏,界面问题,性能错误,数据及访问错误,初始化及终止错误。 工具:selenium, QTP,(winrunner , silkTest , ratinal , watir ,sikuli)
- 性能测试:负载测试,压力测试,强度测试,渗透测试(通过模拟对软件系统的恶意攻击行为来评估系统安全性的一种测试)。并发用户数VU,每秒事务数TPS,系统响应时间,设备性能。 工具:jmeter, LoadRunner ,webload , apache bench , loadUI , silkperformer
- 安全测试:对软件产品进行测试以确保其符合产品安全需求和质量标准。 工具:appscan , webinspect , nessus , nmap , metaSploit , webScarab , fortify ,W3AF
- 兼容性测试:软件本身的兼容性,不同平台下的兼容性,软件对运行设备的兼容性,软件互操作性兼容性,浏览器兼容性。 工具:browsershots , browser sandbox
-
其他分类
- 回归测试:重心在关键模块和重点功能组件。主要使用自动化测试。
- 冒烟测试:对当前软件的核心功能快速的执行流程进行验证。
- 文档测试:针对软件产品的交付品,配套的文档类部件的测试。如用户帮助手册等。 测试内容:完整性/正确性/一致性/易理解性/易浏览性。
- 可靠性测试:硬件/环境测试
- 应用性测试:用户使用是否感觉方便
- 本地化测试:针对软件的本地化实施的针对性测试。如 语言/书写习惯/时区/日期格式/货币/当地风俗/法律法规/政治敏感内容等
- 部署测试:确保软件经过安装测试后可以正常使用。在不同的环境下的部署测试/参照部署文档执行,过程的合理性/正确性,以及基础数据的导入。
-
软件质量的六大特性
- 功能性:软件需要满足用户显式或者隐式的功能
- 易用性:软件易于学习和上手
- 可靠性:软件必须实现需求当中指明的具体功能
- 效率性:类似于软件的性能
- 可维护性:要求软件具有将某个功能修复后继续使用的能力
- 可移植性:软件可以从一个平台移植到另一个平台上使用的能力
-
开发模型
- 瀑布模型:项目计划--需求分析--软件设计--程序开发--软件测试--集成维护。 适合需求稳定阶段
- 快速原型模型:适合需求不明确,小型,灵活度高的项目。