一、测试基础知识
1、测试原则和方法
- 核心定义:系统测试是为发现错误而执行程序的过程,成功的测试是发现至今未发现错误的测试(注意:测试不能保证软件100%无错)
- 关键原则:
- 尽早持续:应贯穿整个生命周期,如V模型可在无代码时设计概念测试用例
- 回避原则:避免由原开发人员执行测试(常识性原则)
- 双要素设计:测试方案需同时包含输入数据和预期输出结果(测试用例表格需含编号/输入/预期/实际结果比对)
- 用例覆盖:必须包含有效用例(验证功能正确性)和无效用例(验证程序健壮性)
- 功能边界:需验证程序"做该做的事"和"未做不该做的事"(类似需求跟踪概念)
- 可复用性:测试用例应可重复使用或追加测试(需妥善保存测试资产)
2、测试方法
分类标准:以程序是否运行为界,分为静态测试(不运行)和动态测试(运行)
2.1 静态测试
- 实施手段:
- 人工检测:通过人工阅读分析代码
- 工具辅助:使用Coverity等静态分析工具
- 具体方法:
- 桌前检查:对照文档直接分析代码逻辑
- 代码审查:组织技术专家会议审查代码
- 代码走查:程序员模拟计算机执行流程(需提供测试用例,人工跟踪变量状态变化)
- 检测效果:能发现30%-70%的逻辑设计和编码错误
2.2 动态测试
- 基本形式:实际运行程序进行测试(常见于测试人员执行可执行文件)
- 方法谱系:包含黑盒、白盒、灰盒(黑白盒结合,非考点)
1)黑盒测试
- 测试视角:将软件视为"黑盒子"(看不见内部代码结构)
- 测试依据:完全依赖功能需求规格说明书
- 典型特征:
- 测试人员无需了解代码实现
- 主要验证功能是否符合预期(功能性测试)
- 测试用例设计基于输入输出关系
2)白盒测试
- 测试视角:将软件视为"白盒子"(可查看代码内部结构)
- 测试依据:需要阅读和理解程序代码
- 典型特征:
- 需根据代码逻辑设计测试用例
- 强调路径覆盖(每个判断分支生成两个用例)
- 能遍历所有代码路径(结构性测试)
- 对比记忆:
- 黑盒:功能验证,测试人员视角
- 白盒:结构验证,开发人员视角
3、测试阶段
1)单元测试
- 测试对象: 可独立编译的程序模块、软件构件或面向对象软件中的类(统称为模块)
- 测试依据: 软件详细设计说明书
- 执行者: 理论上不应由程序员完成,但实际开发中常由程序员执行
- 特点: 针对单个功能模块进行测试,是测试的最小单位
2)集成测试
- 测试目的: 检查模块之间及模块与已集成软件间的接口关系,验证是否符合设计要求
- 测试依据: 软件概要设计文档
- 测试过程: 逐步将单元测试通过的模块集成为完整系统
- 与单元测试关系: 单元测试是集成测试的前提条件
3)确认测试
- 核心目的: 验证软件功能、性能及其他特性是否与用户需求一致
- 测试依据: 需求规格说明书(SRS)
- 分类:
- 内部确认测试: 开发组织内部按SRS进行的测试
- Alpha测试: 用户在开发环境下进行的测试
- Beta测试: 用户在实际使用环境下进行的测试(通过后才能交付)
- 验收测试: 交付前以用户为主进行的最终测试
- 测试对象: 完整的、集成的计算机系统
- 注意事项: 验收测试前必须确认系统已通过系统测试
4)系统测试
- 测试对象: 完整的、集成的计算机系统
- 测试目的: 在真实系统环境下验证软件配置项能否正确连接系统
- 测试依据: 用户需求或开发合同
- 主要内容:
- 功能测试(主要采用黑盒测试方法)
- 性能测试(关注响应时间、吞吐量等指标)
- 健壮性测试
- 用户界面测试
- 安全性测试
- 安装与反安装测试
- 与确认测试关系: 系统测试应在确认测试之前进行
5)配置项测试
- 测试对象: 软件配置项
- 测试目的: 检验软件配置项与SRS的一致性
- 前提条件: 被测软件配置项已通过单元测试和集成测试
6)回归测试
- 测试目的:
- 验证变更部分的正确性
- 确保变更不影响原有功能
- 重要性: 防止修改一个bug时引入新的问题
- 测试重点: 不仅要验证bug是否修复,更要检查是否影响其他功能
4、测试策略
- 自底向上:
- 从底层模块开始测试,需要驱动程序
- 优点:较早验证底层模块
- 自顶向下:
- 先测试整个系统,需要桩程序
- 优点:较早验证系统主要控制点
- 三明治:
- 结合自底向上和自顶向下
- 优点:兼具两者优势
- 缺点:测试工作量大
真题练习:
答案:C C A C
二、测试用例的设计
1、 黑盒测试用例
- 黑盒测试定义:不关注内部结构,基于输入输出设计测试用例
- 主要测试方法:边界值划分、等价类划分、错误推测、因果图
- 重点考核方法:边界值划分和等价类划分(规范化可考核)
- 错误推测特点:基于测试人员经验,无固定方法
- 因果图原理:通过结果反推可能原因
- 非考核方法:错误推测和因果图(纯定义难以设计具体用例)
- 等价类划分🌟🌟🌟
- 等价类定义:将数据按照某种特性进行归类,同一类数据具有相同处理方式。
- 等价类划分目的:通过选取代表性数据减少测试用例数量,提高测试效率。
- 有效等价类:符合输入要求的正确数据集合(如成绩0-100分)。
- 无效等价类:不符合输入要求的错误数据集合(如成绩负分或>100分)。
- 测试用例设计原则1:新用例应尽可能覆盖多个未被覆盖的有效等价类。
- 测试用例设计原则2:无效等价类用例每次只能覆盖一个无效类(便于定位错误原因)。
- 实例说明:成绩等级划分(优≥90,良80-89,及格60-79,不及格<60)形成4个有效等价类。
- 应用场景:适用于输入条件存在明确分类边界的情况(如学生录取条件验证)。
- 边界值划分
- 边界值定义:将每类边界值作为测试用例的方法。
- 边界值范围:通常包括范围的两端值及范围外间隔最小的两个值。
- 边界值示例:年龄范围
0≤age≤1500 \leq age \leq 1500≤age≤150的边界值为
0,150,−1,1510,150,-1,1510,150,−1,151。
- 边界值数量:每个范围通常需要设计4个边界测试用例。
- 边界值条件:测试值必须严格在边界外(如
−1-1−1和151151151)。
-
整数假设:示例基于输入值为整数的前提(无小数)。
2、白盒测试用例
- 白盒测试用例定义:基于代码结构分析的测试用例设计方法
- 覆盖概念:白盒测试的核心是通过不同级别的代码路径覆盖
- 测试目标:确保代码的所有执行路径都被测试用例覆盖
- 覆盖级别:从低到高分为多种级别,影响测试的完备性
- 考试重点:课堂讲解五种主要的覆盖方法
- 实际分类:白盒测试共有七八种覆盖方法,课堂简化讲解
- 覆盖级别差异:覆盖级别越高,测试正确率和覆盖率越好
- 语句覆盖
- 语句覆盖定义:指逻辑代码中所有语句都被执行一遍的测试方法。
- 覆盖层级特征:语句覆盖是覆盖层级中最低的一种。
- 语句类型:包括赋值语句和判断语句等代码结构。
- 测试用例数量:完成语句覆盖通常只需要一个测试用例。
- 执行路径方法:通过顺着代码流程图箭头方向画路径即可完成覆盖。
- 覆盖确认条件:当所有语句框(包括赋值和判断)都被执行时即完成语句覆盖。
- 覆盖局限性:执行所有语句不代表执行了所有判断条件。
- 判定覆盖
- 判定覆盖定义:指代码中所有判断语句的真假分支都要覆盖一次。
- 覆盖必要性:即使判断分支没有语句,也需要覆盖以避免潜在异常。
- 判定覆盖目标:确保每个判断条件的真分支和假分支都被执行。
- 测试用例数量:完成判定覆盖至少需要两个测试用例。
- 用例设计原则:一个用例覆盖真分支和假分支,另一个用例覆盖假分支和真分支。
- 用例非唯一性:测试用例的具体路径可以灵活设计,只要满足覆盖要求即可。
- 判定覆盖与语句覆盖区别:判定覆盖关注判断分支,语句覆盖关注代码行执行。
- 条件覆盖🌟🌟
- 条件覆盖定义:针对判定语句中的每个独立条件,要求其真分支和假分支都至少执行一次
- 判定与条件区别:判定覆盖针对整个判断语句,条件覆盖针对判断语句中的每个独立子条件
- 条件覆盖示例:if(y>1 && z=0)包含两个独立条件,需分别测试y>1和z=0的真假情况
- 测试用例设计:通过x=1/y=2/z=0和x=2/y=1/z=1两组输入可覆盖四个条件的真假组合
- 路径覆盖情况:条件覆盖可能不包含所有判定路径,如示例中第二个判定的假分支未被覆盖
- 覆盖层级关系:条件覆盖比判定覆盖更细致,但满足条件覆盖不一定满足判定覆盖
- 验证方法:检查每个独立条件的真假分支是否都被执行,而非仅关注整体判定结果
- 条件判定组合覆盖
- 条件判定组合覆盖定义:同时满足判定覆盖和条件覆盖的测试标准
- 判定覆盖要求:测试用例需覆盖所有判定的真和假分支
- 条件覆盖要求:测试用例需覆盖所有条件的真和假取值
- 验证方法示例:通过变量x、y、z的真假取值组合验证覆盖情况
- 判定路径确认:需画出执行路径确认所有判定分支被覆盖
- 路径覆盖
- 路径覆盖定义:覆盖层级最高的测试覆盖方法,关注代码中所有可能的执行路径。
- 路径与语句区别:路径指代码执行流中的完整线路(从开始到结束的走法),语句指具体代码块(带框部分)。
- 路径覆盖特征:需覆盖所有不同线路组合(如四条独立路径),而非仅遍历所有线段。
- 常见混淆点:路径覆盖常与语句覆盖、判定覆盖/条件覆盖组合考查。
- 路径确认方法:通过分析从开始到结束的所有可能走法(如直通、分支组合等)确定路径数量。
- 关键注意事项:路径覆盖不等于简单遍历所有线段,需考虑不同执行序列的组合情况。
考试真题分析:
答案:C D
说明:在有效测试时应该尽可能多的覆盖所有有效条件
无效测试只能覆盖一个无效等价类,以免无法区别是哪个造成的
1) 例题:测试用例判断
- 等价类测试定义:将输入数据划分为有效等价类和无效等价类进行测试的方法
- 有效测试用例特征:应尽量覆盖多个有效等价类
- 无效测试用例原则:每次只能覆盖一个无效等价类以便定位错误
- 测试用例判断标准:无效用例覆盖多个无效类会导致错误定位困难
- 例题解析方法:通过分析年龄、学历、专业三个条件的满足情况判断用例优劣
- 错误用例示例:同时违反年龄和学历要求的用例属于不良测试用例
2) 例题:测试说法判断
- 穷举测试局限性:无法发现软件中所有错误
- 错误修改效果:错误多的程序段修改后错误不一定减少
- 测试证明能力:测试只能证明错误存在,不能证明无错误
- 白盒测试覆盖度:路径覆盖法比语句覆盖法发现更多错误
- 回归测试必要性:修改错误可能引入新错误
答案:
3) 例题:白盒测试覆盖情况
- 白盒测试覆盖类型:语句覆盖、判定覆盖、条件覆盖、路径覆盖
- 覆盖优先级原则:取最高覆盖级别(如路径覆盖已包含语句覆盖)
- 测试用例分析方法:通过执行路径判断覆盖级别
- 语句覆盖确认条件:所有可执行语句至少执行一次
- 判定覆盖确认条件:每个判断的真假分支至少执行一次
- 条件覆盖确认条件:每个条件的真假值至少执行一次
- 路径覆盖确认条件:程序所有可能路径至少执行一次
- 短路计算特性:逻辑运算中遇到确定结果即终止计算
- 流程图规范要求:比较运算符应使用
======
而非===
- 测试用例选择策略:组合用例以满足更高覆盖级别
三、调试
- 调试定义:发现并修正代码错误的过程
- 调试目的:确定错误位置、分析原因、改正代码
- 回归测试:修正错误后重新测试验证
- 蛮力法:整体检查代码寻找问题
- 回溯法:从错误点逆向追踪原因
- 原因排除法:列举可能原因逐一排除
- 演绎法:从一般原理推导特殊情况
- 归纳法:从特殊现象总结一般规律
- 二分法:将问题范围对半分割排查
四、软件度量
- 软件属性分类:分为外部属性(面向管理者和用户,可直接测量,如性能指标)和内部属性(软件本身质量属性,如可靠性,需间接测量)。
- McCabe度量法:用于计算有向图的环路复杂度,适用于程序流程图。
- 有向图与无向图区别:有向图有箭头,方向固定(如a→b);无向图无箭头,可双向移动(如a↔b)。
- 环路复杂度公式:
边数−顶点数+2边数 - 顶点数 + 2边数−顶点数+2
,注意顺序为边数减顶点数。 - 节点定义:流程图中所有类型的方框均视为节点。
案例考题:
- 路径覆盖定义:测试用例数量等于程序图中的路径数量
- 环路复杂度公式:
V(G)=E−N+2V(G)=E-N+2V(G)=E−N+2,其中E为边数,N为顶点数
- 路径查找方法:从开始节点到结束节点顺着箭头方向遍历所有可能路径
- 流程图规则:必须严格遵循箭头方向,不能逆向或跨节点连接
- 顶点计数技巧:按顺序标记每个节点并划掉已计数节点避免遗漏
- 边计数要点:完整统计节点间的有向连接线,注意合并路径的计数方式
- 常见考题变形:路径数量问题可转化为"满足路径覆盖所需测试用例数"
- 环路复杂度计算步骤:先准确统计边数和顶点数,再代入公式计算
- 自底向上:
- 从底层模块开始测试,需要驱动程序
- 优点:较早验证底层模块
- 自顶向下:
- 先测试整个系统,需要桩程序
- 优点:较早验证系统主要控制点
- 三明治:
- 结合自底向上和自顶向下
- 优点:兼具两者优势
- 缺点:测试工作量大