目录
前言
软件工程生命周期分为八个阶段:
问题定义--->可行性研究--->需求分析--->概要设计--->详细设计--->编码与单元测试--->综合测试--->软件维护
这节我们讲的是软件开发流程中的一个阶段,测试阶段。
软件测试的目标
- 测试是为了发现程序中的错误而执行的过程
- 好的测试方案是尽可能发现迄今为止尚未发现的错误的测试方案;
- 成功的测试是发现了至今为止尚未发现的错误的测试。
测试准则
- 所有测试都应该能追溯到用户需求;(测试用例设计依据)
- 应该远在测试开始之前就制定出测试计划;
- 80%的错误很可能是由20%的模块造成。
- 应该从"小规模"测试开始,并逐步进行"大规模"测试;
- 穷举测试是不可能的;
- 为了达到最佳的测试效果,可以找独立的第三方公司进行测试工作。
测试方法
软件测试方法分为两种
- 静态测试
不实际运行程序,而是通过检查和阅读等手段来发现错误并评估代码质量质量的软件测试技术。也称为静态分析技术。 - 动态测试
实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术。
动态测试有三种- 黑盒测试
在不知道程序内部结构,只知道程序规格的情况下采用的测试技术或策略。 - 白盒测试
在知道程序内部结构的情况下采用的测试技术或策略。 - 灰盒测试
黑盒测试方法和白盒测试方法综合的策略。
- 黑盒测试
测试方案(重点)
- 所谓测试方案包括:
- 具体的测试目的(例如,预定要测试的具体功能)
- 应该输入的测试数据
- 预期的结果
- 通常又把测试数据和预期的输出结果称为测试用例。(记忆)
白盒测试(重点)
白盒测试适用于:对单一模块测试内部结构是否和详细设计相同。
常见白盒测试法:逻辑覆盖法、基本路径覆盖法
逻辑覆盖测试
语句覆盖
选择足够的测试用例,使得程序中每一条可执行语句至少被执行一次。
分析:
执行语句sacbed
测试用例:
A=2,B=0,X=任意实数
覆盖sacbed
语句覆盖特点:
语句覆盖对程序的逻辑覆盖很少。
语句覆盖不能走过所有支路。(没有语句的分支不执行不走)
语句覆盖是很弱的逻辑覆盖标准。
判定覆盖(分支覆盖)
不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次。
分析:
所有判定分支:
(1) a点判定为T
(2) a点判定为F
(3) b点判定为T
(4) b点判定为F
覆盖上面四种需要两个用例
Ⅰ. 满足(aTbF)
A=3,B=0,X=3
覆盖sacbd 结果: x=1
Ⅱ. 满足(aFbT)
A=2,B=1,X=1
覆盖sabed 结果: x=2
条件覆盖
不仅每个语句至少执行一次,判定表达式中的每个条件都取到各种可能的结果。
分析:
所有条件:
(1)A>1 (2)A≤1
(3)B=0 (4)B≠0
(5)A=2 (6)A≠2
(7)X>1 (8)X≤1
测试用例:
Ⅰ. 满足(1)(3)(5)(7)
A=2,B=0,X=4
覆盖sacbed
Ⅱ. 满足(2)(4)(6)(8)
A=1,B=1,X=1
覆盖sabd
判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖。
判定/条件覆盖
选择足够的测试用例,使得同时满足判定覆盖和条件覆盖。
分析:
所有判定
aT aF bT bF
所有条件:
(1)A>1 (2)A≤1
(3)B=0 (4)B≠0
(5)A=2 (6)A≠2
(7)X>1 (8)X≤1
测试用例:
Ⅰ. 满足条件(1)(3)(5)(7)
和判定(a真,b真)
A=2,B=0,X=4
结果:A=2,B=0,X=3
Ⅱ. 满足条件(2)(4)(6)(8)
和判定(a假,b假)
A=1,B=1,X=1
结果: A=1,B=1,X=1
条件组合覆盖
选择足够的测试用例,使得每个判定表达式中条件 中的各种可能组合都至少出现一次。
特点:
- 条件组合覆盖是前述几种覆盖标准中最强的。
- 满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。
- 但是,条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。(测试数据都没有测试到sacbd )
总结
- 语句覆盖发现错误能力最弱。
- 判定覆盖包含了语句覆盖,但它可能会使一些条件得不到测试。
- 条件覆盖对每一条件进行单独检查,一般情况它的检错能力较判定覆盖强,但有时达不到判定覆盖的要求。
- 判定/条件覆盖包含了判定覆盖和条件覆盖的要求,但实际上不一定达到条件覆盖的标准。
- 条件组合覆盖发现错误能力较强, 凡满足其标准的测试用例,也必然满足前 4 种覆盖标准。
- 以上五种覆盖方法,基本上是依次增强的(除少数如:条件覆盖和判定覆盖) 。随覆盖级别的提高,所需设计的测试用例数量也急剧增加,开销数量级的加大。
基本路径覆盖法
设计足够的测试用例,使得程序中的所有可能路径都至少被执行一次。
路径覆盖标准最高,但是测试用例数量级以幂次方增加测试用例数量。
分析路径:
(1)Sacbed (2)Sacbd
(3)Sabed (4)Sabd
(1)A=2,B=0,X=1
预期结果: x=3
(2)A=3 B=0 X=3
预期结果:x=1
(3)A=3,B=0, X=4
预期结果:x=5
(4)A=3,B=1,X=1
预期结果: x=1
黑盒测试
常用黑盒测试方法:
- 等价类法
- 边界值分析
等价类法
等价类有:有效的等价类,无效的等价类。
- 设计测试用例时两个步骤:
- 设计一个新的测试用例以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;
- 设计一个新的测试用例,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。
边界值分析法
边界值:指输入等价类和输出等价类边界上的数据
- 思想:设计边界值测试方案进行分析
- 边界值分析法步骤
- (1)划分等价类
(2) 找等价类的边界
- (1)划分等价类
- 一个用例尽量覆盖多的有效边界
- 一个用例只能覆盖一个无效边界
软件测试
单元测试
1、目的
保证每个模块作为一个单元能正确运行;
发现的往往是编码和详细设计的错误。
2、基于的文档和测试方法:
详细设计说明书、
主要使用白盒测试技术
单元测试基本测试方法
- 模块本身不是一个程序,不能直接运行,需要靠其它模块来驱动和调用,因此需要为其设计驱动程序(模拟其功能)。
- 同时,一个模块运行中又调用到它的下属模块,则需为其设计多个存根程序(支持模块)。
集成测试
-
在单元测试的基础上,将所有模块按照设计要求组装成为子系统或系统,进行集成测试。
1)功能性测试。使用黑盒测试技术针对被测模块的接口规格说明进行测试。
2)非功能性测试。对模块的性能或可靠性进行测试。
-
基于文档及使用方法:
概要设计说明书
黑盒测试法
-
由模块组装成程序时有两种方法:
-
非渐增式测试方法
-
渐增式测试方法
-
回归测试
在软件生命周期的任何一个阶段,只要软件发生了改变,就可能给软件带来问题。
(1)可能源于发现了错误并做了修改。
(2)也可能是因为在集成或维护阶段加入了新的模块。
回归测试:重新执行已经做过的测试的某个子集。以保证上述这些变化没有带来非预期的副作用。(已测过的一部分黑盒和白盒)