文章目录
软件测试基础
Not only detect bugs, but also prevent bugs.
软件测试是贯穿整个软件开发生命周期,对软件产品进验证和确认的活动过程,也是对软件产品质量持续的评估过程,其目的是尽快尽早地发现软件产品中存在的各种缺 陷,尽最大可能揭示软件开发过程中所存在的产品质量风险,实现缺陷预防。
静态测试:不执行被测对象
动态测试:执行被测对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LM8dnRej-1641542515798)(D:\Grade3-1\Software Test\QQ截图20220106192920.png)]
软件缺陷定义
软件缺陷,通常又被叫做bug或者defect,即为软件或程序中存在的某种破坏正常运行能力的问题、错误,其存在会导致软件产品在某种程度上不能满足用户的需求。
软件缺陷是指存在于软件(程序、数据、文档中的)那些不符合用户需求的问题。
1)软件未实现产品说明书要求的功能
2)软件出现了产品说明书指明不应该出现的错误
3)软件实现了产品说明书未提到的功能
4)软件未实现产品说明书虽未明确提及但应该实现的目标
5)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷
软件缺陷主要分为三种形式:“缺陷”、“故障”、“失效”
Defect, Fault and Failure
软件缺陷(Software Defect)
Def. 存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差。Bug是口语化的缺陷。
如少一个逗号、多一语句等。其结果是软件运行于某一特定条件时出现软件故障,这时称 软件缺陷被激活。
软件故障 Fault
软件运行过程中出现的一种不希望或不可接受的内部状态
内部状态:由所有程序变量的当前值和程序指针构成
软件失效 Failure
软件运行时产生的一种不希望或不可接受的外部行为结果。
如:系统崩溃,闪退,结果不正确
……
① 外部可见的软件失效是测试中推断软件中存在缺陷的基本方法
② 没有失效并不代表软件中不存在缺陷
软件失效—> 软件缺陷;
软件缺陷 --/–> 软件失效
缺陷具有隐蔽性
- 软件中一定存在缺陷
- 有缺陷并不一定产生故障;但失效一定能说明有缺陷
- 有故障也并不一定会失效
软件错误 Error
- 在软件生存期内的不希望或者不可接受的人为错误
- 软件缺陷本质上是研发人员在软件研发过程中所犯错误在软件中的可视化结果
RIP Model ——缺陷被发现的3个必要条件
-
Reachability可达性
The location or locations in the program that contain the defect must be reached. 执行到包含缺陷的代码
-
Infection感染性
After executing the location, the state of the program must be incorrect. 在正确和错误代码下运行的内部状态不同
-
Propagation传播性
The infected state must propagate to cause some output of the program to be incorrect. 输出结果不同
代码单元测试
逻辑测试
以代码中逻辑表达式结构为对象的测试,以期发现代码逻辑结构缺陷(不是所有的缺陷类型都可以发现)
逻辑结构缺陷
- 写代码时所犯错误在逻辑表达式上的可视化体现
- 逻辑表达式写错了,程序行为不正确
逻辑覆盖准则
-
逻辑表达式
是实现代码特性的核心成份 -
逻辑测试技术:基于逻辑覆盖准则的测试(Logical Coverage Criteria)
-
满足
逻辑覆盖准则 ≠ 高质量测试
语句覆盖(Statement Coverage)
- 衡量被测代码中的语句得到执行的程度。
- 如果测试集合能够使得被测代码中的每条语句至少被执行一次,那么则说该测试集合满足了语句覆盖。
- 语句覆盖度 = (得到执行的语句数)/语句
判定覆盖(Decision Coverage)
- 衡量代码中的判定得到执行的程度,期望发现逻辑运算符相关缺陷
- 如果测试集合能够使得被测代码中的每个判定至少被执行一次,那么则说该测试集合满足了判定覆盖。
- 注意,每个判定被执行一次的含义是指每个判定的所有可能结果都至少出现一次。
- 例 if((num1 >1)&& (num2==0))的真假结果都得到执行,才认为该判定被执行。
- 判定覆盖度 =得到执行的判定数/判定总数 ∗ 100%
条件覆盖(Condition Coverage)
- 衡量代码中构成判定的各个条件得到执行的程度,期望发现算术运算符相关缺陷
- 如果测试集合能够使得被测代码中的每个条件至少被执行一次, 那么则说该测试集合满足了条件覆盖。
- 每个条件被执行一次的含义:每个条件的所有可能结果都至少出现一次
- 注意条件覆盖中会出现 运算符短路问题!!!,使得条件覆盖无法达到100% ==> MC/DC准则的产生)
满足判定不一定满足条件,满足条件不一定满足判定
修正的判定-条件覆盖(Modified Decision-Condition Coverage)
判定-条件覆盖存在的问题
• 对于某些满足判定-条件覆盖的测试集合而言,其揭错能力并不高
• 短路运算符
-
期望构成每个判定的每个条件能独立地影响整个判定的结果。
-
在这里独立地影响整个判定的结果是指在其它条件取值不变的情况下,只改变当前条件的取值就能使得整个判定的结果发生变化。
基于控制流的测试
Prime Path Testing
- Constructing Control Flow Graph (CFG)
- Calculating Prime Path set
- Deriving Test Case
Control Flow Graph
A CFG models all executions of a method by describing control structures
-
Nodes : Statements or sequences of statements (basic blocks)
- Basic Block : A sequence of statements such that if the first statement is executed, all statements will be
-
Edges : Transfers of control
Paths in Graph: Path is a sequence of nodes(n1, n2, …, nm). A subpath of a path p is a subsequence of p.
Simple path: A path from node ni to nj is simple if no node appears more than once, except possibly the first and last nodes are the same. (除起始节点和结束节点可以相同外,路径中每个节点的出现次数有且仅有 1 次。)
Prime Path: A simple path that does not appear as a proper subpath of any other simple path. (不是其他简单路径的子路径的简单路径)
Complete Path: A path that starts at an initial node and ends at a final node
Calculating Prime Path Set – Node Tree Method
节点树
- 以G中的节点为根节点建立的树,且满足树中除根节点和叶节点可以相同外,从根节点到每个树中节点的路径中,每个节点的出现次数有且仅有 1 次。
- 在节点树中,每条从根节点到叶节点的路径即为一条简单路径。
简单节点树
- 若节点树T不是任何其它节点树的子树,则称节点树T为简单节点树。
- 所有简单节点树的从根节点到叶节点的路径集合为备选的基路径集合。
基于数据流的测试
Def & Use
c-use (computation-use)
- 使用节点USE(v,n)是一个计算使用(记做C-use),当且仅当语句n是计算语句 (对于计算使用的节点永远有外度=1)
p-use (predicate-use)
- 使用节点是一个谓词使用(记做p-use),当且仅当语句n是谓词语句(对于谓词使用的节点永远有外度≥2)
上图的解释为:由于采用的是值传( 值传采用将实参值复制一份给形参的方式传递变量值,并没有将一个值放入与实参关联的内存(指的是右侧的str不是左侧的str))的函数调用形式,因此,有下面的结论:str的定义节点为:12,13;str的使用节点为:13,14,15;p的定义节点为:6,7;使用节点:8 ,其中,对于节点6而言, p是形参,p的存储单元内容是一个地址值,代码会将str(str也是一个指针)的值复制到p的存储单元,因此,是p的定义。
上图的解释为:由于采用的是传指针的调用形式,因此,有下面的结论:str的定义节点为:11,12(虽然没有显示的赋值, 对于传递指针认为实参既有定义又有使用
,且是先使用后定义);str的使用节点为:12,13,14;p的定义节点为:6;使用节点:7;
注:指针传参是先使用再定义
Du-pair & Du path
定义-使用对(du pair): 对于变量 v 而言,若 li是 v 的定义节点,lj是 v 的使用节点,那么由位置 li 和 lj构成的二元组(li, lj),称为 v 的定义-使用对。
定义清除(def-clear): 对于 v 的定义-使用对(li, lj)
而言(注意一定是定义-使用对,即起始节点一定是定义节点,终点一定是使用节点),如果以 li为起始点,以 li为终止点
的路径(li, lk1, lk2 ,lk3,……, lkn,lj)中,不包含 v 的定义节点,则称路径(li, lk1, lk2 ,lk3,……, lkn,lj)是定义清除的。(只有起始点为变量v的定义节点)
定义-使用路径(du-path):对于变量 v 而言,从 v 的定义节点到 v 的使用节点的定义清除的简单路径称为 v 的定义-使用路径。
- du(ni, nj, v) – 变量v的以ni为开始节点,以nj为结束节点的定义使用对路径集合。
- du (ni, v) 表示变量 v 的以ni为定义节点(以ni为起始节点)的所有定义使用路径集合
Data Flow Test Criteria
- 全定义覆盖(All-defs coverage, ADC): 对于每个变量 v 而言,测试路径需要访问 v 的每一个定义使用路径集合 du (ni, v),的某条定义使用路径
every def reaches a use
- 全使用覆盖(All-uses coverage, AUC):对于每个变量 v 而言,测试路径需要访问 v 的每一个定义使用对路径集合 du (ni, nj, v)的某条定义使用路径
every def reaches all possible uses
- 全定义-使用覆盖 (All-du-paths coverage, ADUPC):对于每个变量 v 而言,测试路径需要访问 v 的每一个定义使用对路径集合 du (ni, nj, v)的每一条定义使用路径
cover all the paths between defs and uses
变异测试
变异得分
MS(T) = |D|/(|L|+|D|)
- |D|: the number of killed mutants
- |L| : the number of lived mutants
Mutant
- Live mutant: The mutant that has the same results as that of P against all test cases of T, denoted as L 在给定的用例下,变异体与源程序有一样的结果
- Killed mutant : The mutant that has different result to P against at least one test case of T, denoted as D 有一个用例使得变异体与源程序的结果不同
- Equivalent mutant: The mutant that has the same results as that of P against all input domain, denoted as E 特别注意的是等价变异体,在所有输入域下结果都与源程序一样,与源程序等价
基于变异测试的覆盖
- 变异覆盖:所设计的用例能够杀死变异体
- Strongly Killing Mutants: 满足RIP三条原则。
- Weakly Killing Mutants: 满足可达性和可感染性。
代码接口测试 – 集成测试
Def. 将通过单元测试的代码单元逐渐集成在一起直至整个软件系统,以验证单元之间的接口交互是否满足需求
集成测试用例生成
MM-Path(CFG Based)
定义单元之间的控制转移路径
节点:模块执行路径(Module Execution Path, MEP)
节点之间的关系:基于调用的控制转移
源节点
- 程序执行开始时或重新开始处的语句片断。
- 可能是单元中的第一个可执行语句或者是紧接着转移控制到其它单元节点之后的节点。
汇节点
- 程序执结束处的语句片断。
- 可能是单元中的最后一个可执行语句或者转移控制到其它单元的节点。
模块执行路径(MEP):源节点开始,汇节点结束的语句序列,中间没有汇节点
。通常先找到每个源节点和汇节点,再写出MEP。
消息:一种程序设计语言机制,通过这种机制一个单元将控制
转移给另一个单元。MM-Path最低要求所有消息均被覆盖至少一次
MM-Path:
- 模块执行路径和消息的序列
- 描述包含在单独单元之间控制转移的模块执行路径序列
Coupling du-path(DFG Based)
Coupling variable 耦合变量(x,y): 形参/实参,非局部变量/全局变量
Last def 最后定义节点:变量x满足-从该定义节点开始存在经过调用点(callsite/return)到达另一个代码单元的使用的定义清除路径。
Use clear 使用清除: 对于变量 v 而言,一条从节点 ni到 nj的路径 p是使用清除的如果满足路径 p 中不存在 v 的使用节点.
First use 首次使用节点:变量使用中–满足从调用点(entry/return)到达该使用节点的路径是一条定义清除和使用清除路径。
Coupling du Pair 耦合定义使用对
For coupling variable (x, y), its coupling du pair is denoted as (A, x, li)-(B, y, lj)
,where li the last definition location for variable x in unit A
and lj is the first use location in the unit B
.
计算A & B的耦合定义使用对:
- 首先找到A & B的耦合变量(对)
- 根据DFG找到耦合变量的最后定义 和 首次使用(可以是点、也可以是边)
- 耦合的定义使用对
Coupling Du Coverage Criteria
A coupling du-path is a simple path from a last-def to a first-use which is consists of
- The def-clear simple path from last-def to callsite/return
- The def-clear and use-clear simple path from entry/ return from to the first-use
耦合定义使用路径中,
1)对于从caller到callee方向而言,从callee的入口点(entry/callsite)到耦合变量第一次使用的路径要求是定义清除且使用清除的;
2)对于从callee返回caller的方向,在caller接收返回值点(return)到第一次使用的路径是定义清除且使用清除的综合起来,就是enty/return
- All-Coupling-Def coverage: every last def to at least one first use 全耦合定义覆盖:对于每个变量 v 而言,测试路径需要访问 v 的每一个最后定义和某个该定义的首次使用构成的路径。
- All-Coupling-use Coverage: every last def to every first use ** 全耦合使用覆盖:对于每个变量 v 而言,测试路径需要访问 v 的每一个最后定义和所有该定义的首次使用**构成的路径。
- All-Coupling-du-Paths Coverage: every simple path from every last def to every first use 全耦合定义使用覆盖:对于每个变量 v 而言,测试路径需要访问 v 的每一个最后定义和所有该定义的首次使用构成的所有简单路径。
系统测试是测试级别最高的一种测试活动,是将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起, 在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。
系统测试的对象不仅包括软件,还包括系统软件所依赖的硬件、外部设备和各类接口,其目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方以及系统各个部分是否可以协调工作。
系统测试分为两大类别
- 功能测试
- 非功能测试
这里只对功能测试进行整理。
系统功能测试
系统测试用例设计方法
输入域划分 – 基于等价类思想
输入域:待测对象所有可能输入的集合,无限性,笛卡尔积,无法穷举。
Partition Domains: A partition must satisfy two properties
- Cover the entire domain (completeness,完备性) 划分块并集为定义域
- The blocks must not overlap (disjoint,独特性) 划分块不相交
输入域建模: 划分输入参数的定义域。每个划分只取一个结果。
- Identify parameters(待测因素) under test: inputs, semantic descriptions
- Find characteristics (待测特征)in the parameters under test : Example Characteristics
- Input X is null 是否为空
- Order of the input file F (sorted, inverse sorted,arbitrary, …) 文件顺序
- Min separation of two aircraft
- Input device (DVD, CD, VCR, computer, …)
- Partition each characteristic (Each partition is usually based on some characteristic C)
识别待测因素(不仅限于输入参数和输出结果)与待测特征(待测因素的进一步描述,如业务规则、是否为空、文件规模等)
Strategies for identifying values :
-
valid, invalid and special values 有效值、无效值、特殊值
-
Sub-partition some blocks
-
Explore boundaries of domains 边界值
若输入域是数值区间(a,b): 需要包含介于a, b之间的正常情况,a,b,比a稍微小,比a稍微大一点,比b稍微小一点,比b稍微大一点(7种情况)
输入域(划分块)组合策略:
组合待测特征、输入域划分结果。
全组合覆盖 All Combination Coverage(ACoC):
划分块枚举。每个待测特征输入域划分结果的笛卡尔积。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6FENFWD-1641542515803)(D:\Grade3-1\非关系型数据库\Screenshots\QQ截图20220105092921.png)]
Q:待测特征个数 Bi: 第i个待测特征对应的输入域划分集合
单值覆盖 Each Choice Coverage(ECC)
每个待测特征的每个划分块被测试一次;每个划分块出现一次即可。各个待测特征输入域划分数量的最大值。
全对偶覆盖 Pair-Wise Coverage(PWC)
两两不同待测特征输入域元素之间的对关系。是最简单、高效的策略。
测试用例数至少为:输入域数量最多的那两个待测特征
如何计算全对偶覆盖 & 设计用例?
==> 使每个对偶值在某个测试用例中至少出现一次
- 列数是被测特征个数。在列上标出特征名称,按可能取值的数量降序排列变量。
- 行数计算方法如下:如果第一列的可能取值个数是V1,第二列的可能取值个数是V2,表中的行数至少为 V1*V2(也就是说至少有V1 * V2个测试用例)。
- 第一列的填写规则:每次重复第一列特征的各个取值V2次。约定第一个特征的相同取值构成一个段。(最好在各个段空出一行,再重复给出下一个取值)
- 第二列的填写规则:对于第一个特征的每个段列出第二个特征的所有取值
- 增加第三列,使得每个段要包含第三列特征的所有取值并且这些取值的顺序要使第三列特征和第二列特征也构成全对偶
- 依次增加第四列、第五列方法同步骤3,检查各特征之间是否构成全对偶,直至所有特征列完为止
全T值覆盖 T-Wise Coverage(TWC)
全对偶覆盖的拓展。需覆盖到t个待测特征之间的关系。
基本值覆盖 Base Choice Coverage(BCC)
基本值:某个待测特征所有输入域划分取值中,使用频率最高的那个取值。(变量取最常用的正常值)
第一行:所有待测特征取基本值。
其余行分别对每个待测特征取非基本值(Bi-1)。 因此:
∑
i
=
1
Q
(
B
i
−
1
)
\sum_{i=1}^{Q}(B_i - 1)
i=1∑Q(Bi−1)
多基本值覆盖 Multiple-Base Choice Coverage(MBCC)
如果待测特征有多个基本值(常用值),那么就要覆盖到所有基本值,其余仍然是对每个待测特征取非基本值。
系统测试用例生成
测试用例设计的自动化是软件测试发展的必然方向,不管是单元测试、交互测试、系统测试层面,还是安全测试、性能测试层面,都需要测试用例设计的自动化,为了缩短测试周期、降低测试成本、提高测试质量。
用自动机建模系统的行为 —— 有限状态自动机 FSM
W method:用于给定一个FSM作为输入,可以求出能揭错该FSM的所有输入序列.
W方法意图揭示的4种缺陷:
- Operation error 执行缺陷
- Transfer error 控制错误
- Extra state Error 额外状态错误
- Missing state Error缺失状态错误
FSM Definition
FSM: (X, Y, Q, q0, g, O)
- The FSM of the specification is denoted as M
- M is completely specified, minimal, connected and deterministic
- M starts in a fixed initial state
- M can be reset accurately to the initial state
- M and IUT (Implementation Under Test 待测代码的输入)have the same input alphabet
FSM Properties
Completely specified: 完备性,每个状态对每个输入都要对应的迁移
Strongly connected: 连通性,每一对状态(qi,qj)存在输入序列,使得qi —> qj
Minimal: 最小性
- k-equivalence: 对长度为k的输入,状态qi(Q1)和状态qj的输出相同
- Machine equivalence: 对M1中任意的状态,在M2中能找到状态与之等价。对M2中任意的状态,在M1中能找到状态与之等价。
- Minimal machine:状态机M的状态数是与之等价的状态机中最小的
Chow’s W Method
-
Estimate the maximum number of states (m) in the correct implementation of the given FSM M.
- This is based on a knowledge of the implementation. In the absence of any such knowledge, let m=|Q|.
-
Construct the characterization set W for M. 建立缺陷的特征集合W.
- 将状态集合Q进行k等价划分(P0–>Pk)
- 对Q中每个状态,根据k等价逆序计算能够区分各个状态的特征输入(直至到0等价划分算法终止)
- 区分每对状态的输入序列 的 并集
-
Construct the testing tree for M. 构造M的测试树(保证可达性和感染性)
-
Generate the transition cover set P from the testing tree. 计算迁移覆盖集合P
A patial path is a path starting from the root of the testing tree and terminating in any node of the tree
Concatenation of the labels along the edges of a sub-path is a string that belongs to P. The empty string () also belongs to P
注:记得加空串
-
Construct set Z from W and m. 计算输入集合Z
6. Desired test set T=P.Z 最后计算测试输入 = P.Z(迁移覆盖集合P&输入集合Z笛卡尔积)