《软件测试基础》读书报告:第四章 输入空间划分

《软件测试基础》读书报告

第四章 输入空间划分

为了更直接地使相同测试需求的值集合是恰好合适,划分输入空间的方式直接的根据输入值的参数来定义输入域。输入参数可能是方法的参数和全局变量,也可能是系统当前的表现状态,或者干脆是用户级给定的一个输入,这都要根据实际情况来划分。总输入域中划分出若干个区域,从这些区域中选出一些值来进行测试。

从参数的域开始,把每个域可能的值划到块里,从块中选取适当的值来组成测试用例的过程就是输入域建模的过程。对于输入与的划分,一般是基于程序相应的某周特性,程序的输入,程序的环境等。

对于某个特性划分域时,一般要求满足两个条件:

  1. 完整性,划分必须覆盖整个域
  2. 分离性,块之间不能有重叠

以"输入F的次序"为例,一个看起来有效实际无效的划分可能是这样:

  • 按F的排序划分

    B1 = 升序排列

    B2 = 降序排列

    B3 = 任意顺序

这样做既不满足完整性也不满足分离性,升序或者降序都可以算是任意顺序的子块,而且,当F长度为0或者1的时候,F能同时满足三个块。出现这个问题的原因是把升序和降序两个概念放在相同的特性里面,应该将其分离。结果就是下面这个有效的划分:

  • 文件F升序

        B1 = True

      B2 = False

  • 文件F降序

        B1 = True

    B2 = False

  当F长度为0或者1的时候,对两个特性都为真。

  完整性和分离性的划分是为了使块的划分更加合适,为从块中选择合适的值来组合奠定基础。

输入域建模

输入域建模分三步。

  1. 识别可以测试的函数。对于一个系统中的函数来说,公共的函数是可以被独立测试的;对几个方法来说,可能他们具有同样的特性,这样就可以对于一个类设计一组共同的特性,再对每个独立的函数具体开发有针对性的测试用;对于一个大的系统来说,可能在设计UML中用例的时候就可以提取出测试来了。
  2. 识别所有参数。前面说过,参数可以是显式的函数参数或者是全局的变量,或者是当前系统的状态等,关键是看给定的参数是否对与函数行为有影响。被测函数的所有参数构成了输入域。
  3. 将前面的步骤建模。根据定义,测试输入严格属于每个特性的每一个块,这说明如果分为n个特性,每个特性划分成了B(n)个块,那么要全部覆盖的话,至少有B(1) *…*B(n)个测试,每增加一个特性i, 就会有成B(i) 倍数增长。特征多了,测试数量就会爆炸,所以必须得控制组合的数量。另外,不可避免的,有的值是无效的,那就需要识别、移除无效的字组合。

在建模时,有基于接口和基于功能的两种建模方法。

基于接口的建模测试

孤立地看待每个参数,这种机械的方式的到的结果确实很好,也容易识别,抽象的工作也很简单。但是,并不是所有的可用信息都反映在接口域模型里面,这就意味着这样建立的IDM是不完整的;另外一个问题是对每个参数孤立的分析,会导致一些重要的子组合被遗漏。

基于功能的建模测试

基于功能的建模的想法是通过识别被测系统的功能,将相应的领域知识应用到IDM上。这样的话,从规格说明书语义到IDM的转换,更可能为测试用例产生预期的结果。并且,因为IDM的建立不依赖于具体实现的参数列表,需要的只是规格说明书和领域知识,所以在开发的早期就能着手设计测试。

当然,基于功能的分方法里,识别特征和取值是比较困难的,当系统比较大的时候,这一点体现的更加明显。并且,功能需求严重依赖于规格说明书,如果规格说明书不完整或者不完善,那设计合理的特性就更加困难了。

组合策略标准

  • 完全组合覆盖:来自所有特征的所有块都必须被用到

    如果直接这样的话,测试数量会爆炸。可以肯定,每个块中有的选择是等价的,这样就存在一些组合策略使得测试减少

  • 每个选择覆盖:对每个特征,每个块中一个值至少在一个测试用例中被使用

    满足这样标准的测试灵活性很大,这样有的中药组合可能会遗漏

  • 成对覆盖:来自每个特征每个快的一个值,必须与来自针对其他特征的每个块的一个值相对结合
  • T-Wise覆盖:来自t个特征每个快的一个值必须被组合
  • 基本选择覆盖
  • 多个基本选择标准

          |--->T-Wise覆盖 -----> Pair-Wise覆盖------ ---|

完全组合覆盖 ------|                                           |------>    每个选择覆盖

         |--->多个基本选择覆盖 ---> 基本选择覆盖--------|

时间: 2024-10-24 17:09:43

《软件测试基础》读书报告:第四章 输入空间划分的相关文章

软件工程基础图式(第四章 系统设计-面向过程的系统设计)

软件工程基础图式(第四章 系统设计-面向过程的系统设计) 1.结构化设计方法 2.在系统结构图中的模块 3.变换型系统结构图 4.事务型系统结构图 5.变换分析 例子1:将下图的DFD/数据流图转换为软件/控制结构图(有误,看模式) 例子2:将下列数据流图转换为控制结构图 变换分析注意事项 ① 在选择模块设计的次序时,必须对一个模块的 全部直接下 属模块都设 计完成之后, 才能转向另 一个模块的 下层模块的 设计. ② 在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量. ③

软件工程基础图式(第四章 系统设计)

软件工程基础图式(第四章 系统设计) 学习目标 1)软件设计过程 2)软件设计的概念和原则 3)设计技术 4)面向过程的系统设计 5)面向对象的系统设计 系统设计目标:将需求分析转化为软件内部结构 1.好的设计的三个特点 (1)包含所有明确要求(要实现什么,不要实现什么)满足客户所期望的所有隐含要求 (2)编码测试.维护人员可读可理解 (3)完整视图(概要图) 2.设计指导原则 1)模块化 2)含数据.体系结构.接口.组件 3)可重复使用 4)正确清楚 3.设计质量属性 1)功能性 2)易用性

《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

第四章 Numpy基础:数组和矢量计算 实话说,用numpy的主要目的在于应用矢量化运算.Numpy并没有多么高级的数据分析功能,理解Numpy和面向数组的计算能有助于理解后面的pandas.按照课本的说法,作者关心的功能主要集中于: 用于数据整理和清理.子集构造和过滤.转换等快速的矢量化运算 常用的数组解法,如排序.唯一化.集合运算等 高效的描述统计和数据聚合/摘要运算 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支

《Linux内核设计与实现》读书笔记 第四章 进程调度

第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的效果. 最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么总会有进程在执行. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统.多任务能使多个进程处于堵塞或者睡眠状态.就是任务位于内存内但是不被执行,直到某一事件发生. 分类: l  非抢占式:除非进程自己主动停止运行

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst

《软件测试基础》读书报告:第一章 概述1.1

1.1概览 概述中主要介绍了测试工程师的工作内容,并介绍了两种测试级别. 概述 ????书中将测试模型分为四大类:图(graph).逻辑表达式(logical expression).输入域特征(input domain characterization)和句法描述(syntactic description).书中将测试标准分为以上四类来简化测试. 测试工程师的工作 ????测试工程师的工作主要分为三个部分,分别贯穿了测试过程的始终. 设计测试,创建测试需求 实现测试,将创建的测试需求转换为实

《linux内核设计与实现》读书笔记第四章

第4章 进程调度 4.1 多任务 多任务系统可以划分为:非抢占式多任务和抢占式多任务. Linux 提供了抢占式的多任务模式. 在抢占式多任务模式下,由调度程序来决定什么时候停止一个进程的运行.这个强制的挂起动作就叫做抢占. 在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行.进程主动挂起自己的操作称为让步 . 4.2 Linux 的进程调度 1.O(1)调度器调度算法对于调度那些响应时间敏感的程序有先天不足. 响应时间敏感的程序称其为交互进程. 2.O(1)调度程序性能比较:

读书笔记 第四章

本章的学习,我了解到由于Android源码是一个开源的系统,然要匹配很多设备产品,也就是说一个版本的Android源码,可以编译出针对不同产品的系统.通过选择一个目标编译项,来决定编译出针对哪个产品的系统,通过lunch命令可知,让用户输入目标编译项,我们可以选择编译项前的数字,也可以直接输入编译项的名字.Android使用Linux内核,在源码级开发过程中,有时要修改内核代码,通常内核代码是和目标设备相关的,我们使用的是模拟器的内核,即使没有硬件设备也可以完成实验.编译Android的内核,需

C primer plus 读书笔记第四章

本章的标题是字符串的格式化输入/输出,重点介绍输入和输出. 本章的第一段示例代码和上一张示例代码很相近,代码就不贴了,新出现的特性是使用了一个数组来存放字符串,C预处理命令和strlen()函数. 下面具体介绍这些概念. 1.字符串 C语言没有为字符串定义专门的变量类型,而是存储在char数组中. 注意: 1.scanf()读取字符串时,会在遇到第一个空白字符串,制表符或者换行符处停止读取.所以使用%s的scanf()只会读取一个单词而非整个句子(C语言一般用gets()来处理一般的字符串).