六、软件测试
概述
软件开发典型阶段
什么是软件测试?
测试(Testing)
软件测试是软件质量保障的方法之一,是广泛意义上“验证与确认”[IEEE1012-2004](简称V&V)的一部分。
-
验证(Verification):检查开发者是否正确的使用技术建立系统,确保系统能够在预期的环境中按照技术要求正确的运行。
-
确认(Validation):检查开发者是否建立了正确的系统,确保最终产品符合规格。
软件测试要做什么?
软件测试的目标
-
有效性测试:使用用户希望的方式来测试软件系统,发现缺陷并改进。
向开发者和用户展示软件满足了需求,表明软件产品是一个合格的产品; -
缺陷测试:具有更大的重要性,目标是发现缺陷。
找出软件中的缺陷和不足。
注意:只有发现了缺陷的测试才是成功的测试。
什么时候进行软件测试?
从实现阶段的后期即开始测试执行。
软件测试要怎么做?
为什么要做软件测试? 软件测试是软件质量控制的关键步骤。
- 软件测试是在软件投入生产性运行之前,对软件需求分析、设计规格说明和编码的最终复审。
质量和质量保证
(一)、质量保障(Quality Assurance)
所有的活动都是为了保障产品质量。
质量保障覆盖所有阶段,包括计划和维护阶段
。
(二)、质量(Quality)
质量的客观方面
- 稳定性(Stability)/ 无缺陷(bug-free)
- 符合规范
质量的主观方面(客户一般都是主观方面)
- 体现用户的整体价值 / 满足用户的需求
- 终端用户体验愉悦
- 使得用户想更多的使用产品
注意:Bug-free vs High Quality
Bug-free就是指通过了质量保证。
High Quality(高质量)
宝马车和QQ车都通过了质量标准,都能上路跑,谁的质量高?
原因:设计阶段决定了软件质量,测试用例无法测试出设计方案的好坏。
为什么质量如此重要?
-
低质量的软件更难于维护和支持
表现:1.用户抱怨更多,需要更多人手来做客服;2.不断给软件打补丁;3.安排额外的发布 -
低质量的软件导致法律问题—用户会法律诉讼你
-
低质量的软件会降低公司声誉,很难挽回
因果关系:低质量的产品\(\to\)公司的生成份额降低,声誉降低\(\to\)股票掉价\(\to\)员工薪资福利降低
测试足以保证质量吗?
- 经典的测试技术仅测量客观的质量因素。
如 稳定性,是否符合规格说明 - 测试通常发生在设计阶段的很长时间之后,因此设计过程中的问题被搁置。
- 测试用例的生成类似于艺术创作,因此覆盖的可靠性不稳定。
- 测试时间经常会被牺牲。
三个错误观点:
- 软件开发完成后,对其调试完就完成了测试。
调试!=测试
- 软件测试是为了发现程序错误,因此软件测试的对象是代码。
测试的对象包括:源程序、目标程序、数据以及相关文档等
- 完成测试的软件,就是高质量的软件。
Bug-free != High Quality
测试对象 和 测试设计方法
软件测试的对象
- 需求规格说明书
- 概要设计规格说明书、详细设计规格说明书
- 源程序
基本的两种测试设计方法:
-
黑盒测试:1.需求规格说明书;2.概要设计规格说明书、详细设计规格说明书
-
白盒测试:源程序
(一)、黑盒测试(Black Box Testing)
在设计测试时,把软件系统当作一个“黑盒”。
即:从软件的行为,而不是内部结构出发来设计测试。
目的:测试系统或模块的功能(行为),是否满足Spec。
(二)、白盒测试(White Box Testing)
在设计测试时,可以看到软件系统的内部结构。
使用软件的内部结构和知识来选择测试数据及测试方法。
目的:测试软件的代码结构。
两种方法举例与对比 :
如何证明软件没有Bug?
穷举测试:显然不科学
如何做测试设计?
测试设计的原则
在测试时必须精心设计测试用例,从数量极大的可用测试用例中精心的挑选少量的测试数据,以达到最佳的测试效果(能够高效的把隐藏的错误尽可能多的揭露出来)。
因此:
- 测试具有不完全性、不彻底性。
- 经过测试后,即使没有发现错误,也不能说软件是没有问题的。
软件测试过程、文档和原则
记录并报告Bug
软件的缺陷
- 症状:从用户的角度看,软件出了什么问题。
- 程序错误:从代码的角度看,代码的什么错误导致了软件的问题。
- 根本原因:错误根源,即导致代码错误的根本原因
Bug的完整例子:
1)症状:用户报告,QQ有时在查看群文件时报错,程序未响应,不能使用。
2)程序错误:有时候一个子窗口的handle为空,导致程序访问了非法内存地址,产生代码错误。
3)根本原因:代码没有确保创建子窗口(CreateSubWindow())发生在调用子窗口之前,因此子窗口的handle变量有时会在访问时处于未赋值状态(为空),导致出现上面提到的代码错误。
测试工作中的文档
- 测试计划:指定测试时间、任务、人员、规范等;
- 测试设计说明书TDS:告诉测试人员要如何设计测试;
- 测试用例:按照TDS的描述,对每一个功能点的测试,描述测试前的环境,如何操作,预期的结果是什么。
- 错误报告:记录在测试执行过程中发生的故障,即缺陷(Bug)
- 测试报告:完成一个阶段的测试后,要报告各个功能测试的结果。
注意:测试计划阶段和测试设计同时发生。
软件测试的原则
(1)“尽早地和不断地进行软件测试” 。
(2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。
(3)程序员应避免检查自己的程序。
(4)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
(5)充分注意测试中的群集现象。把Pareto原理应用于软件测试。
Pareto原理:测试发现的错误中的80%很可能是由程序中20%的模块造成的。
(6)严格执行测试计划,排除测试的随意性。
(7)应当对每一个测试结果作全面检查。
(8)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。
测试进阶
功能需求和非功能需求 \(\to\) 功能测试和非功能测试
非功能测试
- 压力测试
测试软件在负载情况下能否正常工作。 - 效能测试
测试软件的效能。 - 可访问性测试
测试软件是否向特殊用户(如残疾人用户)提供了足够的辅助功能。 - 本地化/全球化测试
测试软件是否考虑了本地语言文化/全球语言文化。 - 兼容性测试
考虑软件在不同软硬件基础环境下是否能正常工作。 - 配置测试
测试软件在各种配置下能否正常工作。 - 易用性测试
测试软件是否好用。 - 软件安全性测试
测试的层次和顺序
测试的时机和作用
软件设计的顺序是__________, 软件构建和测试的顺序是____________。
- 冒烟测试(Smoke Test) :测试不通过,不能进行下一步工作。
- 构建验证测试(Build Verification Test):验证构建是否通过基本测试。
- 验收测试(Acceptance Test):全面考核某方面的功能/特性。
测试的层次和顺序: V模型