Something Basic About Software Testing
一些常识性的问题
- 软件测试者的目标是什么?
- 找bug,并且尽快的找到和修复
- 在一个已经完成的产品上修复一个bug比在一开始就找到要难更多倍
- 为什么完全测试一个软件是不可能的?
- 因为太多输入输出
- 太多路径组合
- 测试人员最重要的技能是编程
Failure, Fault and Error
- Failure
- 一个系统的状态出现不正确的行为
- Fault
- 也叫“bug”和“defect”
- 导致failure的原因
- Error
- 由于人类的错误导致的fault
- test oracle
- 一个用来判断测试是否通过的机制
bug
- 编程错误比bug要多得多
- 不是所有的软件在发布之前都会被修复
Software Quarlity
- 要写出没有bug的程序是不可能的
- 有三个要素能够导致程序中的bug
- 程序的复杂性
- 程序的需求可变性
- 程序的需求不变性
QA和QC
- QA面向过程,QC面向产品
- QA是制定方案确保系统能够达到目标
- QC是指定方案来评估一个系统
- validation
- 我们建立的系统是否是正确的
- verification
- 我们是否使用正确的方法的研发了系统
- validation
test stub 和 test driven(单元测试)
- test stub
- 自顶向下, stub out
- test driver
- 自下而上
PMOD
- 探索性测试方法
- 黑盒测试
- 忽略内部实现的测试
- 白盒测试
- 基于分析代码逻辑的测试
- 基于模型的测试
test oracle
- 用来检测待测系统在一个特定执行中的行为是否正确的方法
白盒测试
- 重点
- 动态白盒测试和调试的相似性
- 单元测试,集成测试,系统测试的等级划分和概念
- 测试驱动的概念(test driver)
- 测试的柱和桩的概念和区别
- 考点
- 动态白盒测试
- 控制流:代码行,分支,条件,基本路径覆盖。循环至少走0次和1次。
- 数据流: 定义使用对,DCU,DPU,选择合适的测试用例进行覆盖
- x的du-path
- 起点一定要是def(x)
- 终点一定要是p-use(x)或者c-use(x)
- def
- 用来定义变量
- x = 0; def(x)
- y = 1; def(y)
- scanf(“%d %d”. &x, &y); def(x), def(y)
- int x[10]; def(x). def(x[0]), def(x[9])
- 用来定义变量
- undef
- 不可使用的变量
- free(p); undef(*p)
- 不可使用的变量
- 定义使用对
- Cuse, puse, 选择测试用例覆盖
- c-use(x): x直接影响计算或者就是输出的一部分
- y = x + 1;
- printf(“%d”, x);
- p-use(x): x间接影响或者会影响一个控制流
- if(x == 0) y = 1;
- switch(x) case 1: … default:…
- if(A[i + 1] > 0) return ; p-use(A), p-use(i), p-use(A[i+1])
- c-use(x): x直接影响计算或者就是输出的一部分
- x的du-path
- 循环覆盖测试:循环要循环执行0次1次多次。 多次,如果没规定,尽量大。
- 如果有循环,用例必须包含0次和1次和多次,多次如果没有说明,随便选个数,如10)
- 动态白盒测试
控制流
- 基本快
- 分支
- 循环
- 基本路径
- 控制流图
- 用处是使得我们准备覆盖的路径是足够的
- 有三种
- 条件if (菱形)
- 合并merge(圆形)
- 执行computation(长方形)
- 覆盖
- 基本块覆盖
- 基本块:单入口,单出口,顺序执行
- 其实就是每一行代码(除了括号和do),然后如果有while和do,则do为一个汇集点指向下一句语句
- 循环覆盖
- 有两个基本要点
- 一个是循环体
- 一个是控制条件(if)
- 其实就是改变循环次数来达到覆盖循环的目的
- 一般是0,1,多次
- 有两个基本要点
- 基本路径覆盖
- 基本路径集
- 可以用来组成其他路径的最小集合
- 基本路径集
- 基本块覆盖
数据流
- 只关心数据的变化而不关心是否有判断条件或者循环
- 逻辑
- 交互
- 突变
黑盒测试
- 三种级别
- 等级一
- 一个输入 –> 一个输出
- 等价类划分(划分输入区域成为等价类)
- e.g 例如学号为07000-07100
- 求学号的等价类
- 首先是5位数
- ‘07050’
- 小于07000的五位数
- ‘00000’
- 大于07100的五位数
- ‘99999’
- 小于五位数非空的数字
- ‘1’
- 大于五位数非空的数字
- ‘99999999’
- 有非数字的
- ‘aa1’
- 有三种(大于,小于和等于5位数的)
- 空串
- “ ”
- 空
- “”
- 超长的
- “999999999999999999999999999999999999”
- 首先是5位数
- 求学号的等价类
- e.g 例如学号为07000-07100
- 边界值分析(对每个等价类进行边界值分析)
- 其实就是找边界值
- e.g
- 有几个类
- c1:(0,2) c2:[2,5) c3:[5, 10000)
- 则c1的边界为0.001,1.999, 2
- c2为2.001, 5
- c3为5.001
- 规律为(x,x), [x,x]
- 左边圆括号:x + 0.001
- 右边圆括号:x – 0.001(不是很清楚) 和 x
- 左边方括号:x + 0.001
- 因果图和决策表(通过把输入输出以边的形式来分析关联)
- 把起因和结果关联起来的图
- 等级二
- 多个输入 –> 一个输出
- 组合覆盖
- 覆盖每个t路交互至少一次
- 带约束的组合覆盖
- 覆盖符合约束的所有参数组合
- 删除不可能的参数组合
- 删除冗余组合
- 等级三
- 多步多个输入 –> 一个输出
- 基于事件的覆盖
- e.g 例如GUI程序 == 一系列事件
- 基于状态的覆盖
- e.g 例如GUI程序 == 一系列状态特征
- 等级一
自动测试工具
- 回归测试
- 接受测试
- beta测试
- alpha测试
测试文档
- 测试计划与测试方案的区别?
- 测试计划
- 组织管理层面
- 对测试全过程的组织、资源、原则等进行规定和约束,并制定测试全过程各个阶段的任务及时间进度安排,提出对各项任务的评估、风险分析和需求管理。
- 也就是行动纲要
- 测试方案
- 技术层面
- 描述需要测试的特性、测试的方法、测试环境的规划、测试工具的设计和选择、测试用例的设计方法、测试代码的设计方案。
- 也就是具体措施
- 测试计划