什么是软件测试
软件测试是软件质量保障的方法之一,是广泛意义上的“验证与确认”的一部分,验证与确认常被简称为“V&V”,其目的如下:
- 验证(Verification):检查开发者是否正确使用技术建立系统,确保系统能够在预期的环境中按照技术要求正确地运行。
- 确认(Validation):检查开发者是否建立了正确的系统,确保最终产品符合规格。
软件测试的目的
- 有效性测试:向开发者和用户展示软件满足了需求,表明软件是一个合格的产品
- 缺陷测试:找出软件中的缺陷和不足
桩与驱动
- 桩程序是被测试部件的交互环境,它扮演被测试部件需要调用的其他系统部件。桩程序对其他系统部件的扮演仅限于规格相同(即接口相同),内部代码要简单得多,通常是直接返回固定数据或者按照固定规则返回数据
- 驱动程序负责常见被测试部件的执行环境,并驱动和监控被测试部件执行测试用例的过程,判定测试用例的执行结果
桩(stub)和 mock的区别
软件测试的分类
单元测试
单元测试是对程序单元(软件设计的最小单位)进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是一个函数与过程;在面向对象编程中,一个单元就是类的一个方法。
程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中,需要经过多次的单元测试以验证程序。
集成测试
集成测试又称为组装测试,即对程序模块一次性或采用增量方式组装起来,对系统的接口进行正确性检验的测试工作。集成测试一般在单元测试之后,系统测试之前进行。
集成测试非常依赖桩程序和驱动程序,桩程序和驱动程序的使用又依赖于系统的集成策略,常见的集成策略包括大爆炸集成和增量集成,增量集成有自顶向下、自底向上、持续集成等多种方式。
系统测试
- 单元测试、集成测试更加关注技术上的正确性,重在发现设计缺陷和代码缺陷。系统测试则不同,它更关注不符合需求的缺陷和需求自身的内在缺陷。
- 根据测试目标的不同,有很多不同类型的系统测试:功能测试、非功能性测试、验收测试、安装测试等等。但是发生在软件测试阶段,完全由软件测试人员控制和执行的主要是功能测试和非功能性测试。
- 系统测试关注整个系统的行为,所以不依赖于桩程序和驱动程序。但是,使用一些测试工具可以让系统测试过程更加自动化。
- 系统测试的功能测试计划以需求规格说明文档或用例文档为基础,主要使用随机测试和基于规格的测试技术设计功能测试用例。在测试非功能性需求时需要使用针对非功能需求的特定测试技术进行测试计划和测试用例设计。
软件测试技术
黑盒测试方法
black-box testing
黑盒测试是把测试对象看作一个黑盒子,完全基于输入和输出数据来判定测试对象的正确性。测试使用测试对象的规格说明来设计输入和输出数据。早期的黑盒测试主要使用了等价类划分、边界值分析等。
等价类划分
等价类划分是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的、常用的黑盒测试用例设计方法。
在等价类划分中,等价类是指某个输入域的子集合。在该子集合种,各个输入数据对揭露程序中的错误都是等效的,并且合理的假定:测试某等价类的代表值就等于对这一个等价类中其他值的测试。因此,只需要把全部输入数据合理划分为若干个等价类,在每一个等价类中取一个数据作为测试输入条件,就可以用少量有代表性的测试数据取得较好的测试结果。
等价类划分有两种不同的情况:
- 有效等价类:是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可以验证程序是否实现了规格说明中所规定的功能和性能
- 无效等价类:与有效等价类的定义相反
在设计测试用例的时候,要同时考虑这两种等价类,因为软件不仅要能接收合理的数据,也要能够经受意外数据的考验(鲁棒性,异常情况合理反应),这样的测试才能确保软件具有更高的可靠性。
边界值分析
边界值分析方法是对等价类划分方法的补充,经验表明错误最容易发生在各等价类的边夹上,而不是发生在等价类的内部。因此针对边界情况设计测试用例,可以发现更多的缺陷。
决策表
决策表是为复杂逻辑判断设计测试用例的技术。决策表是由条件声明、行动声明、规则选项和行动选项四个象限组成的表格。如果一个测试对象的规格是复杂逻辑判断,那么就可以为其建立决策表,并依据决策表设计测试用例:每一列规则选项为一个测试用例的输入,相应的条件选项为测试用例的选型输出。
状态转换
- 使用状态转换测试技术时,通常要先为对象建立状态图,描述测试对象的状态集合、 输入集合和输入导致的状态转换集合。
- 以状态图基础,可建立测试对象的转换表。状态转换表每一行都应该被设计为测试用例。
白盒测试方法
语句覆盖
语句覆盖设计测试用例的标准是确保被测试对象的每一行程序代码都至少执行一次。相比于条件覆盖与路径覆盖,语句覆盖是一种比较弱的代码覆盖技术,不能覆盖所有的执行路径。
比如对于分支条件
if
(没有else
的情况),则语句覆盖仅仅要求覆盖到if
里面的内容即可,即对于false
的情况是没有覆盖到的(因为false
的时候不能够满足“每一行程序代码都至少执行一次”这个条件)
条件覆盖
条件覆盖测试用例的标准是确保程序中每个判断的每个结果都至少满足一次。条件覆盖的覆盖程度比语句覆盖强,但是仍然不能保证覆盖所有的执行路径。
比如对于有两个分支条件的程序,只需要测试条件满足
true
,true
和false
,false
就已经完成了条件覆盖“每个判断的没个结果都至少满足一次”的条件,但是仍然有true
,false
和false
,true
是没有被测试覆盖到的
路径覆盖
路径覆盖测试用例的标准就是确保程序中每条独立执行路径都至少执行一次。
相比条件覆盖,路径覆盖增加了条件覆盖所没有的另外两种情况
软件测试活动
软件测试的典型活动包括:
- 测试计划
- 测试设计
- 测试执行
- 测试评价
软件测试的度量
- 缺陷数据
- 测试覆盖率
- 需求覆盖率
- 模块覆盖率
- 代码覆盖率
Reference
- 南京大学软件学院2022春季学期《软件工程与计算二》