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)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷
软件缺陷主要分为三种形式:“缺陷”、“故障”、“失效”
Def. 存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差。Bug是口语化的缺陷。
如少一个逗号、多一语句等。其结果是软件运行于某一特定条件时出现软件故障,这时称 软件缺陷被激活。
软件运行过程中出现的一种不希望或不可接受的内部状态
内部状态:由所有程序变量的当前值和程序指针构成
软件运行时产生的一种不希望或不可接受的外部行为结果。
如:系统崩溃,闪退,结果不正确
……
① 外部可见的软件失效是测试中推断软件中存在缺陷的基本方法
② 没有失效并不代表软件中不存在缺陷
软件失效—> 软件缺陷;
软件缺陷 --/–> 软件失效
缺陷具有隐蔽性
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)
满足逻辑覆盖准则 ≠ 高质量测试
满足判定不一定满足条件,满足条件不一定满足判定
判定-条件覆盖存在的问题
• 对于某些满足判定-条件覆盖的测试集合而言,其揭错能力并不高
• 短路运算符
期望构成每个判定的每个条件能独立地影响整个判定的结果。
在这里独立地影响整个判定的结果是指在其它条件取值不变的情况下,只改变当前条件的取值就能使得整个判定的结果发生变化。
A CFG models all executions of a method by describing control structures
Nodes : Statements or sequences of statements (basic blocks)
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
节点树
简单节点树
c-use (computation-use)
p-use (predicate-use)
上图的解释为:由于采用的是值传( 值传采用将实参值复制一份给形参的方式传递变量值,并没有将一个值放入与实参关联的内存(指的是右侧的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): 对于变量 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 的定义-使用路径。
every def reaches a use
every def reaches all possible uses
cover all the paths between defs and uses
MS(T) = |D|/(|L|+|D|)
Mutant
Def. 将通过单元测试的代码单元逐渐集成在一起直至整个软件系统,以验证单元之间的接口交互是否满足需求
定义单元之间的控制转移路径
节点:模块执行路径(Module Execution Path, MEP)
节点之间的关系:基于调用的控制转移
源节点
汇节点
模块执行路径(MEP):源节点开始,汇节点结束的语句序列,中间没有汇节点
。通常先找到每个源节点和汇节点,再写出MEP。
转移给另一个单元。MM-Path最低要求所有消息均被覆盖至少一次
MM-Path:
Coupling variable 耦合变量(x,y): 形参/实参,非局部变量/全局变量
Last def 最后定义节点:变量x满足-从该定义节点开始存在经过调用点(callsite/return)到达另一个代码单元的使用的定义清除路径。
Use clear 使用清除: 对于变量 v 而言,一条从节点 ni到 nj的路径 p是使用清除的如果满足路径 p 中不存在 v 的使用节点.
First use 首次使用节点:变量使用中–满足从调用点(entry/return)到达该使用节点的路径是一条定义清除和使用清除路径。
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 coupling du-path is a simple path from a last-def to a first-use which is consists of
耦合定义使用路径中,
1)对于从caller到callee方向而言,从callee的入口点(entry/callsite)到耦合变量第一次使用的路径要求是定义清除且使用清除的;
2)对于从callee返回caller的方向,在caller接收返回值点(return)到第一次使用的路径是定义清除且使用清除的综合起来,就是enty/return
系统测试是测试级别最高的一种测试活动,是将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起, 在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。
系统测试的对象不仅包括软件,还包括系统软件所依赖的硬件、外部设备和各类接口,其目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方以及系统各个部分是否可以协调工作。
系统测试分为两大类别
这里只对功能测试进行整理。
输入域:待测对象所有可能输入的集合,无限性,笛卡尔积,无法穷举。
Partition Domains: A partition must satisfy two properties
输入域建模: 划分输入参数的定义域。每个划分只取一个结果。
识别待测因素(不仅限于输入参数和输出结果)与待测特征(待测因素的进一步描述,如业务规则、是否为空、文件规模等)
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种情况)
输入域(划分块)组合策略:
组合待测特征、输入域划分结果。
划分块枚举。每个待测特征输入域划分结果的笛卡尔积。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6FENFWD-1641542515803)(D:\Grade3-1\非关系型数据库\Screenshots\QQ截图20220105092921.png)]
Q:待测特征个数 Bi: 第i个待测特征对应的输入域划分集合
每个待测特征的每个划分块被测试一次;每个划分块出现一次即可。各个待测特征输入域划分数量的最大值。
两两不同待测特征输入域元素之间的对关系。是最简单、高效的策略。
如何计算全对偶覆盖 & 设计用例?
==> 使每个对偶值在某个测试用例中至少出现一次
全对偶覆盖的拓展。需覆盖到t个待测特征之间的关系。
基本值:某个待测特征所有输入域划分取值中,使用频率最高的那个取值。(变量取最常用的正常值)
其余行分别对每个待测特征取非基本值(Bi-1)。 因此:
∑ i = 1 Q ( B i − 1 ) \sum_{i=1}^{Q}(B_i - 1) i=1∑Q(Bi−1)
如果待测特征有多个基本值(常用值),那么就要覆盖到所有基本值,其余仍然是对每个待测特征取非基本值。
测试用例设计的自动化是软件测试发展的必然方向,不管是单元测试、交互测试、系统测试层面,还是安全测试、性能测试层面,都需要测试用例设计的自动化,为了缩短测试周期、降低测试成本、提高测试质量。
W method:用于给定一个FSM作为输入,可以求出能揭错该FSM的所有输入序列.
W方法意图揭示的4种缺陷:
FSM: (X, Y, Q, q0, g, O)
Completely specified: 完备性,每个状态对每个输入都要对应的迁移
Strongly connected: 连通性,每一对状态(qi,qj)存在输入序列,使得qi —> qj
Minimal: 最小性
Estimate the maximum number of states (m) in the correct implementation of the given FSM M.
Construct the characterization set W for M. 建立缺陷的特征集合W.
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