南京大学<软件测试>笔记

来源:互联网 发布:python自动化ios开发 编辑:程序博客网 时间:2024/05/01 23:50

软件测试

目的

通过在编写代码的整个过程中添加测试的检测流程,来减少设计失误、笔误、以及在程序中表现出来的失误。

基本概念

PIE模型

错误分类

  • Fault:程序中的错误代码
  • Error:错误代码导致的错误状态
  • Failure:错误状态表现出来后被感知

测试能够发现的错误只有Failure级别,即表现出来的错误。程序中处于Error和Fault级别的错误单靠测试是无法检测出来。所以这需要开发工程师自己做白盒测试尽量避免Fault的出现。

白盒测试方法

通过白盒测试,希望开发工程师在设计代码编写代码之后,能够自己证明代码是无误的。就像数学题算完之后的检验方法一样。

图覆盖

任何代码都可以用图的方式表示。在测试的时候,将图的每一部分跑一遍,看看能不能得到正确结果的方法就是图覆盖。

控制流生成

程序的控制流,由工作语句、if、while/for、switch组成。也相当与代码逻辑的流程图。

结构化覆盖

节点覆盖/边覆盖,控制流覆盖的一部分

主路径覆盖

简单路径:每个节点在路径中只出现一次。

主路径:最长的简单路径,不是任何简单路径的子集。

生成测试用例,覆盖所有主路径。主路径覆盖可以减少覆盖的工作量

基本路径覆盖

独立路径:路径中含有其他路径中不含有的节点或者边

线性独立路径个数:CC=E-V+2(圈复杂度)

基本路径测试步骤:

  1. 生成控制流图
  2. 计算圈复杂度
  3. 选择基本路径集
  4. 生成基本路径测试用例

数据流覆盖

程序控制流中,点上操作的正确性。变量操作包括:

  • 定义:分配内存,赋值、初始化
  • 使用:进行操作,判断等
  • 定义引用对:在前面定义,在后面引用
  • 定义清晰:前面定义,后面使用之间,没有被重新定义
  • 数据流可达:有一条定义清晰的路径从i到j
  • 定义引用路径(du-path):从定义到使用的简单路径,路径定义清晰

数据流覆盖准则

  • ADC:全定义覆盖,所有定义的地方都覆盖过
  • AUC: 全引用覆盖,所有引用的地方都覆盖过,包括所有的定义也都覆盖过
  • ADUPC:全部定义引用覆盖,所有的定义和引用之间的路径都覆盖过

逻辑测试

  • 判定:每一个条件组为一个判定,影响控制流
  • 条件:每一个布尔单元都是一个条件
  • 判定覆盖:判定为True和False各执行一遍的覆盖
  • 条件覆盖:每一个条件为True和False各执行一遍的覆盖
  • 条件判定覆盖:同时满足条件覆盖和判定覆盖
  • 完全条件覆盖:所有条件的组合覆盖,复杂度为2n
  • 修订条件/判定覆盖(MC/DC):每一个条件的独立影响都要执行一次

变异测试

在正常程序中注入Fault之后观察测试用例是否将Fault检测出来。用于评估测试用例集的充分性。

变异测试假设:

  • 程序员不可能大面积写错代码,只会不小心写错小部分代码
  • 如果单一错误可以测试到,那么组合的错误就可以被测试到

重要的变异类型:

类型 描述 集合描述 数量 ABS 绝对值 {(e,abs(e)),(e,abs(e))} 2 AOR 算数运算符 {(x,y)x,y{+,,,/,%}xy} 20 LCR 逻辑连接符 {(x,y)x,y{&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;,}xy} 2 ROR 关系运算符 {(x,y)x,y{>,,<,,=,}xy} 30 UOI 一元运算符 {(v,v)(v,v),(v,++v),(v,v++)} 4

等价变异:两个语法不一样的程序,语义完全一致。代码不一样,但是产生的输出输出映射完全一致。

// example 1for(int i = 0; i != 5; i++){    nop();}// example 2for(int i = 0; i < 5; i++){    nop();}

故障假设测试

评估测试用例集合的能力。变异测试是故障假设测试的一部分

故障类型:E=(a|b)&c

  • 运算符误用
    • ORF:误用操作数,E’=(a&b)&c
    • ENF:误用表达式,E’=!(a|b)&c
    • VNF:误用否定,E’=(a|b)&!c
    • ASF :优先级误用,E’=a|b&c
  • 操作数误用
    • MVF:操作数丢失,E’=(a|b)
    • VRF:误用变量,E’=(a|b)&a
    • CCF:E’=(a|b)&(c&a)
    • CDF:E’=(a|b)&(c|a)
    • SA0:永久为0,E’=(0|b)&c
    • SA1:永久为1,E’=(1|b)&c

测试条件:异或

黑盒测试方法

希望通过开发工程师自己编写黑盒测试用例,来增加逻辑思维的严谨性。在最开始编写测试,来让工程师更好地理解代码的逻辑。

随机测试

随机选取测试用例的测试

等价类划分

按照一定标准将输入域划分成几个子集,然后在子集中随机选取测试用例

划分原则:

  • 完备性:所有分类都要被覆盖
  • 无冗余:两个等价类中不应该有交集

划分方法:

  • 数据的取值范围
  • 不同数据的控制流和数据流
  • 数据合法/非法
    • 合法:检测功能
    • 非法:检测错误处理

边界值分析

添加不同等价类之间的边界

边界值相关代码

  • 判断
  • 循环
  • 数据最大值/最小值

边界值分析方法

min < min+ < norm < max- < max

  1. 选择正常值norm
  2. 选取min,min+,max,max-
  3. 考虑非法输入:min-,max+

决策表

反映程序输入与输出关系的表格。用于检测输 入与输出的关系.

步骤:

  1. 计算规则数量,rules=2conditions
  2. 列出动作和条件
  3. 插入动作行
  4. 插入条件列
  5. 化简,相似规则导致相同结果的条件可以合并

例子:从String中提取浮点数

"Duration: 1000.0000\n""Loation: 50.0000"

1000.0000

负号 整数部分 小数点 小数部分 合法性 T F F F F T F F T T T F T F F T F T T T T T F F T T T F T T T T T F T F T T T T

java代码

public static float peekFloat(String content) {    if (content == null || content.length() == 0){        return 0;    }    Pattern p = Pattern.compile("-?(\\d+\\.?\\d*|\\.\\d+)");    Matcher m = p.matcher(content);    if (m.find()) {        return Float.valueOf(m.group(0));    } else {        return 0;    }}

组合测试

考虑不同变量取值之间的组合

方法:

  • 两维组合:所有变量等价类的两两组合都出现在测试用例中
  • 三维组合:任意变量三个组合都出现在测试用例中
  • 完全组合:任意变量的所有组合都在测试用例中
  • 可变粒度组合:相关组合被覆盖

缺省项

输入变量的默认值进行测试,保证绝大部分用户的配置可以正确工作

合并输入变量

将受到约束的变量放在一起考虑

测试进展

测试用例集约简

测试预言

故障定位

功能测试

探索式测试

性能测试

自动化测试方法

希望利用自动化测试工具,来降低测试的人工成本。另一方面,从测试工具的角度来观察发现软件中存在的问题。

GUITAR

Android Instrumentation

Android BDD-Calabash

0 0
原创粉丝点击