软件测试之单元测试入门
功能性测试(黑盒测试)
测试依据:需求规格说明书
边界值测试
-
边界值属于等价类方法特定的输入域,包含在有效等价类和无效等价类中,边界值方法产生的效果与等价类方法相同,边界值方法选择数据更有针对性。等价类划分是边界值的前置过程,边界值是等价类的补充。
-
边界值测试概念:在最小值、略高于最小值、正常值、略低于最大值、最大值(5个)处取输入变量的值。(单缺陷)
-
健壮性测试概念:在略小于最小值、最小值、略高于最小值、正常值、略低于最大值、最大值、略大于最大值(7个)处取输入变量的值。(单缺陷)
等价类测试
-
等价类测试方法是把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。使用等价类划分方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。
-
相关概念:
弱
:基于单缺陷
假设强
:基于多缺陷
假设一般
:不考虑无效值健壮
:考虑无效值
-
弱一般等价类测试:单缺陷,不考虑无效值,通过变量的每个等价类中选择一个值。
-
强一般等价类测试:多缺陷,不考虑无效值,笛卡尔积每个元素都选择一个值。
-
弱健壮等价类测试 :单缺陷 ,考虑无效值,对于有效输入,使用每个有效类的一个值;对于无效输入,测试用例取一个无效值,其余的值都是有效的。
-
强健壮等价类测试 :多缺陷 ,考虑无效值,有效类+无效类的笛卡尔乘积,从每个元素中获得测试用例。
基于决策表的测试
-
等价类方法详细的考虑了需求输入域,但对于输入域与输入域存在关联时无法覆盖,(比如等价类划分设计测试用例时,设计一条新的测试用例,使其仅覆盖一个无效等价类,直至所有的无效等价类完全被覆盖,没有考虑无效等价类与无效等价类的组合情况)。所以需要一种能考虑输入域间的互相关系设计方法来考虑业务描述性的测试需求。
-
判断表是分析表达式若干输入条件下,被测对象根据输入作出不同响应的工具,适用于业务逻辑关系和多种条件组合情况。
-
决策表的组成:由条件桩、条件条目、行动桩,行动条目4部分组成
-
为了使用决策表标识测试用例,把条件解释为输入,把行动解释为输出
- 规则3、4:在条件c1=True,c2=False,c3不关心(T/F均可)的情况下,采取行动a4.
功能性测试总结
边界值测试 | 等价类测试 | 基于决策表的测试 | |
---|---|---|---|
测试依据 | 错误常出现在边界处 | 集合的划分 | 真值表 |
测试工作量 | 边界值测试4n+1,健壮性测试6n+1 | 按照输出或性质划分 | 2^n |
设计测试工作量 | 少 | 适中 | 多 |
测试有效性 | 测试用例太多具有冗余性,无完备性 | 划分是互不相交子集保证了无冗余性,并集是全集保证了完备性;但是没有考虑到输入变量存在关联时的冗余 | 解决了等价类因输入条件之间存在关联而引入独立性原则导致的冗余性,决策表可以程式化保持完备性。 |
适用范围 | 有输入参数,且输入类型或范围长度有边界时 | 只要存在输入的功能,如用户登录,注册,新建,查询 | 输入之间存在逻辑关系 |
优点 | 边界上的数据更容易发现缺陷 | 简单,高效;快速评估测试用例的数量,最少用例数=功能数(输入数+1) | 条件之间进行全组和;可以发现需求中的漏洞 |
缺点 | 存在边界时才能适用 | 只考虑了独立输入的有效和无效,没有考虑输入之间的组合 | 条件过多时,组合情况多 |
结构性测试(白盒测试)
测试依据:程序的内部结构
路径测试
路径覆盖(Path coverage)
- 概念:每条路径至少执行一次
-
测试用例
A B X 路径 1 0 1 abd 1 0 2 abe 3 0 1 acd 2 0 3 ace -
优点:可以对程序进行彻底的测试
-
缺点:测试用例数随判定节点数指数级增长,不见得能把所有的条件组合都覆盖
基本路径覆盖(Basic Path coverage)
-
引入:因为测试中做到完全的路径覆盖是无法实现的,为解决这一难题只得把覆盖的路径数压缩到一定限度内,从而引入了基本路径覆盖。
-
独立路径:每次至少要经历一条从未走过的弧
-
概念:从程序的环路复杂度导出程序基本路径集合中的独立路径条数。
计算圈复杂度的三种公式 说明 V(G) = e - n + 2 e为边数,n为节点个数 V(G)=P+1 P为判定节点的个数 V(G)=区域数 闭合区域+开放区域
-
测试用例
V(G) = 6条边-5个节点+2 = 3 V(G) = 2个判断节点+1 = 3 V(G) = 2个闭合区域+1个开放区域 = 3 无论使用哪种方法计算,都可确定3条独立的路径,即基本路径覆盖的用例数。
A B X 路径 1 0 1 abd 3 0 1 acd 1 0 2 ade
多重条件覆盖/组合覆盖(Combinatory coverage)
-
判定:每个判定节点,形如if(x>3 and z<10)
-
条件:每个判定节点内的每个子句,形如if(x>3 and z<10)里的x>3或z<10
-
概念:每一个判定中的每一个条件的组合都要覆盖
-
测试用例
第一个判断:A>1 and B=0 内条件的组合
A>1 B=0 T T T F F T F F 第二个判断:A=2 or X>1 内条件的组合
A=2 X>1 T T T F F T F F 一组满足全部的上面8个情况的测试样例
A B X 2 0 4 2 1 1 1 0 2 1 1 1
条件/判断覆盖(Clause/Branch coverage)
-
概念:一个判定中的每个条件的所有可能结果至少执行一次,并且每个判断本身的所有可能结果至少执行一次。
-
即既满足条件覆盖,又满足判断覆盖
-
测试用例:
A B X 2 0 4 1 1 1
条件覆盖(Clause coverage)
- 概念:每一个条件(判断中的每一个子句)的所有可能结果( true / false )至少执行一次
-
测试样例:
每一个条件的 true / false 至少执行一次
A>1 B=0 A=2 X>1 T T T T F F F F 一组满足上面的全部的情况至少出现一次的测试样例
A B X 1 0 3 2 1 1
判断覆盖/分支覆盖(Branch coverage)
- 概念:每个判定的所有可能结果至少出现一次。
-
测试样例:
每一个判断的所有可能取值
A>1 and B=0 A=2 or X>1 T T F F 一组满足上面的全部的情况至少出现一次的测试样例
A B X 2 0 2 3 1 1
语句覆盖(Statement coverage)
- 概念:每条语句至少执行一次。
-
测试用例:
A B X 2 0 4
覆盖程度比较
- 覆盖程度:路径覆盖 > 多重条件覆盖 > 判定/条件覆盖 > 条件覆盖 > 判定覆盖 > 语句覆盖
- 路径覆盖是覆盖率最高的。语句覆盖最弱。
- 满足多重条件覆盖准则的测试用例集,同样满足判定覆盖准则、条件覆盖准则和判定/条件覆盖准则。
- 任何一种覆盖方法都无法实现完全的测试。所以,在实际的测试用例设计过程中,根据需要将不同的覆盖方法组合起来使用,以实现最佳的测试用例设计 。