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
      • 我们是否使用正确的方法的研发了系统

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])
      • 循环覆盖测试:循环要循环执行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”
      • 边界值分析(对每个等价类进行边界值分析)
        • 其实就是找边界值
        • 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测试

测试文档

  • 测试计划与测试方案的区别?
    • 测试计划
      • 组织管理层面
      • 对测试全过程的组织、资源、原则等进行规定和约束,并制定测试全过程各个阶段的任务及时间进度安排,提出对各项任务的评估、风险分析和需求管理。
      • 也就是行动纲要
    • 测试方案
      • 技术层面
      • 描述需要测试的特性、测试的方法、测试环境的规划、测试工具的设计和选择、测试用例的设计方法、测试代码的设计方案。
      • 也就是具体措施
Comments

Comments