测试用例设计(增量测试)

2023-11-08

增量测试
在执行模块测试过程中,我们主要有两点考虑:第一,如何设计一个有效的测试用例集。第二,将模块组装成工作程序的方式。第二点考虑很重要,因为它涉及模块测试用例编写的形式、可能用到的测试工具类型、模块编码和测试的顺序、生成测试用例的成本以及调试(定位并修复检查出的错误)的 成本等。简而言之,它具有实际重要性。

在这一节中,我们将讨论两类方法,增量 测试和非增量测试。在下一节中,我们将探讨两种增量方法:自顶向下的和自底向 上的开发或测试过程。 这里需要考虑的问题是:软件测试是否应先独立地测试每个模块,然后再将这 些模块组装成完整的程序?还是先将下一步要测试的模块组装到测试完成的模块 集合中,然后再进行测试?第一种方法称为非增量测试或“崩溃(big-bang ) ”测 试,而第二种方法称为增量测试或集成。

图 5-7 所示的程序可作为一个例子。矩形框代表程序的 6 个模块(子程序或过 程),连接模块间的线条代表程序的控制层次,也就是说,模块 A 调用模块 B、C 和 D,模块 B 调用模块 E 等等。作为传统方法的作增量测试是按如下方式进行的: 首先,对 6 个模块中的每一个模块进行单独的模块测试,将每个模块视为一个独立 实体。根据环境(例如,是人机交互式的,还是使用批处理计算工具)和参与人数, 这些模块可以同时或按次序进行测试。最后,将这些模块组装或集成(例如“连接 编辑”)为完整的程序。 

测试单独的模块需要一个特殊的驱动模块(drive module)和一个或多个桩模块 (stub module)。举例来说,测试模块 B,首先要设计测试用例,然后将测试用例作为输入参数由驱动模块传递给模块 B。驱动模块是人们编写的一个小模块,用来将测试用例驱动或传输到被测模块中(也可以用测试工具替代)。驱动模块还必须向 测试人员显示模块 B 的结果。此外,由于模块 B 调用了模块 E,所以还必须使用一 个额外的组件,该组件在模块 B 调用模块 E 时接受模块 B 的控制指令。这就由桩 模块来完成它是一个被命名为“E”的特殊模块,用来模拟模块 E 的功能。当所有 6 个模块的模块测试都完成之后,就将这些模块组装成完整的程序。


 

另一种可选择的方法是增量测试。不同于独立地测试每个模块,增量测试首先 将下一个要测试的模块组装到前面已经测试过的模块集合中去。

现在要给出对图 5-7 所示的程序进行增量测试的步骤还为时太早,因为还有大 量可能的增量方法。一个关键问题是我们究竟是从程序的顶部开始、还是从底部开 始进行测试。由于这个问题将在下一节中讨论,我们暂且假设从底部开始测试。

第 二步先测试模块 E、C 和 F,可以并行测试(由三个人进行),也可串行进行。请注意,我们必须要为每个模块准备一个驱动模块,但不是桩模块。下一步是测试模块 B 和 D,但不是单独地测试它们,而是分别将其与模块 E 和 F 组装在一起。换言之, 要测试模块 B,应编写驱动模块和集成测试用例,将模块 B 和 E 组合起来测试.

将下一个要测试的模块组装到前面已经测试过的模块集合或子集中去,这个增长的过 程会一直进行到测试完最后一个模块(本例中是模块 A)为止,请注意,这个过程也可以自顶向下进行。下面是几个显而易见的结论:

1. 非增量测试所需的工作量要多一些。对于图 5-7 所示的程序,需要准备 5 个驱动模块和 5 个桩模块(假设顶部的模块不需要驱动模块)。自底向上的 增量测试需要 5 个驱动模块,但不需要桩模块。自顶向下的增量测试需要 5个桩模块,但不需要驱动模块。增量测试所需的工作量要少一些,因为 使用了前面测试过的模块来取代非增量测试中所需要的驱动模块(如果从顶部开始测试)或桩模块(如果从底部开始测试)。

2. 如果使用了增量测试,可以较早地发现模块中与不匹配接口、不正确假设相关的编程错误。这是由于尽早地对模块组合进行了集成测试。然而,如 果采用非增量测试,只有到了测试过程的最后阶段,模块之间才能“互相 看到”。

3. 因此如果使用了增量测试,调试会进行得容易一些,我们假定存在着与模块间接口或假设相关的编程错误(根据经验而来的合理假设),那么,如果使用非增量测试,直到整个程序组装之后,这些错误才会浮现出来。到了 这个时候,我们就难以定位错误。因为它可能存在于程序内部的任何位置, 相反,如果使用增量测试,这种类型的错误就很容易发现,因为该错误很 可能与最近添加的模块有关。

4. 增量测试会将测试进行得更彻底。如果当前正在测试模块 B,要么是模块 E,要么是模块 A(取决于测试是从底部还是从顶部开始的)被当作结果而 执行。虽然模块 E 或模块 A 先前已经进行了完全的测试,但将其作为 B 的 模块测试结果而执行,则会诱发出一个新的情况,可能会暴露出先前测试 过的模块 E 或模块 A 中存在的一个新缺陷。另一方面,如果使用的是非增 量测试,对模块 B 的测试仅影响到其本身。换言之,增量测试使用先前测 试过的模块,取代了非增量测试中使用的桩模块或驱动模块。因此,到最后一个模块测试完成时,实际的模块经受到了更多的检验。

5. 非增量测试所占用的机器时间显得少一些。如果使用自底向上的方法测试 图 5-7 中的模块 A,在执行 A 的过程中,模块 B、C、D、E 和 F 也会执行 到。而在对模块 A 的非增量测试中,仅会执行模块 B、C 和 E 的桩模块。 自顶向下的增量测试的情况也是如此。如果测试的是模块 F,那么在执行 模块 F 时还会执行模块 A、B、C、D 和 E;而在对模块 F 的非增量测试中, 仅有模块 F 的驱动模块与其一起执行。因此,完成一次增量测试所需执行 的机器指令,显然多于采用非增量测试方法所需的指令。但此消彼长的是, 非增量测试要比增量测试需要更多的驱动模块和桩模块,开发这些驱动模 块和桩模块是要占用机器时间的。

6. 模块测试阶段开始时,如果使用的是非增量测试,就会有更多的机会进行 并行操作(也就是说,所有的模块可以同时测试)。对于大型的软件项目〔模 块和人员都很多),这可能十分重要,因为在模块测试开始之时,项目的人 员数量常常处于最高峰。 

总的来说,第 1 条~第 4 条结论是增量测试的优点,而第 5、6 条结论是其不 利之处。考虑到计算机行业当前的趋势(硬件成本已经降低而且势必会持续下去, 硬件的功能不断增加,而人力劳动成本和软件错误的代价在不断增长),再考虑到错误发现得越早,改正它的成本也越低,我们会看到第 1 条至第 4 条结论的重要性 日益突出,而第 5 条结论越来越显得不那么重要。

如果有一个缺点的话,第 6 条结 论似乎确是一个薄弱的缺点。从而我们可以得出结论,增量测试要更好一些。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试用例设计(增量测试) 的相关文章

随机推荐

  • linux日志查看命令

    1 查看日志常用命令 tail n 是显示行号 相当于nl命令 例子如下 tail 100f test log 实时监控100行日志 tail n 10 test log 查询日志尾部最后10行的日志 tail n 10 test log
  • gravatar配置和使用【让你的网站使用全球通用头像】

    前言 我们在很多博客或者网站留言 评论的时候会看到有的人头像很酷很个性化 但是这个博客和网站本身并没有提供设置头像的功能 感觉有点神奇 那么是怎么做到的呢 其实这是使用了Gravatar Gravatar是Globally Recogniz
  • hibernate无法找到实体类

    找不到持久化类 第一次编写博客 我的博客是用来记录编程出现过的错误 org hibernate UnknownEntityTypeException Unable to locate persister 翻译 未知实体类型异常 找不到持久化
  • TortoiseSVN设置忽略文件和目录文件夹

    参看 https blog csdn net bbj12345678 article details 80949556
  • sql server 查询表是否被哪些存储过程和视图引用

    select name from sysobjects as s inner join syscomments as o on s id o id where text like N 表名
  • GFS 阅读笔记

    这篇博客是我阅读著名的 GFS 论文 The Google File System 所总结的笔记以及自己一些的思考 这篇论文是一篇非常经典的论文 尤其对于想要了解分布式或者刚刚开始研究分布式的人来说 是一篇非常好的读物 它里面提到了许多分布
  • 使用python代码绘制一个会动的爱心

    你可以使用 matplotlib 库来绘制一个会动的爱心 下面是一个简单的代码示例 import matplotlib pyplot as plt import numpy asnp x np linspace np pi np pi 25
  • Apache Beam中的有状态计算

    Beam帮助我们处理流式 乱序 大规模的数据 并且提供了高度的抽象机制Pipeline 统一了流式和批量数据处理 从功能上流处理可以分为无状态 stateless 的和有状态 stateful 两种 在流处理的框架里引入状态管理大大提升了系
  • mysql怎么打开表ddl_MySQL数据表操作(DDL)

    一 创建数据表 语法 create table 表名称 字段 字段类型 约束 字段 字段类型 约束 表选项 约束 primary key not null auto increment等 表选项 数据表的属性 一般包括engine char
  • linux常用命令及解释大全(三)

    目录 前言 一 字符设置和文件格式转换 二 文件系统分析 三 初始化一个文件系统 四 备份 五 光盘 六 网络 总结 前言 本篇文章继续介绍了一部分linux常用命令 包括字符设置和文件格式转换 文件系统分析 初始化一个文件系统 备份 光盘
  • 模板类,模板类函数特例化,模板类特例化

    今天在看某c 框架源码时 发现模板类里的部分函数可以特例化 感觉很神奇便尝试了下 发现很多平时不会注意的c 细节及知识 写下来分享给大家 以便大家遇到相似问题时可以少踩点坑 模板类会出现链接问题 编译不通过 如果模板类 h文件和 cpp文件
  • matlab_一组数据元素随机排列

    如何生成一组数据元素随机排列 随机打乱顺序 产生新的排列 1 使用的matlab函数 randperm 1 语法格式 R randperm n 2 函数功能 将数字1 n进行随机排列 排列结果存储在行向量内 3 EX 输入 randperm
  • 网页端扫码通过公众号实现微信授权登录

    1 参考开发文档 https developers weixin qq com doc offiaccount OA Web Apps Wechat webpage authorization html 0 2 先调起微信授权页面 获取co
  • Java学习心得2——构造函数

    1 什么是构造函数 构造函数顾名思义 就是对象被构造的时候就会被调用的函数 例如当你new一个Cat对象的时候 Cat对象的构造函数就会被调用 public static void main String args Cat c new Ca
  • (如何读写文件)流-------输入流

    流 流是一组有序的数据序列 通过流来读写文件 流从方向分输入 输出流 流从单位份字节 字符流 字节输入流 InputStream 抽象父类 基类 常用方法 read 几个重载方法作用不同 int read 输入流一个字节一个字节的读 返回的
  • U3D中对象的自动销毁

    很多游戏中都会重用同一个游戏对象 比如说Dota 一波兵一波兵的被对方消灭 如果尸体不会自动销毁 恐怕地图中的尸体堆积如山不说 配置再厉害的电脑也架不住 这样游戏的性能太低了 需要自动销毁的情形有 游戏对象已经并且永远消失在视野中了 天空中
  • Java基础篇——集合

    活动地址 CSDN21天学习挑战赛 1 为什么使用集合 集合与数组类似 都是容器 我们为什么不用数组而还要使用集合呢 数组的特点 数组定义完成并启动后 类型确定 长度固定 不适合元素的个数和类型不确定的业务场景 更不适合做需要增删的操作 数
  • 如何在手机上运行c语言,各位前辈这两个程序怎么在手机上运行

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 made by ebhrz include include include include include include include global define int cfd 文件描述符
  • Python mailmerge库

    Python mailmerge库 本文使用环境 win10 python3 7 office2016 第0步 按装mailmerge pip install mailmerge 第1步 引用库 from mailmerge import
  • 测试用例设计(增量测试)

    增量测试 在执行模块测试过程中 我们主要有两点考虑 第一 如何设计一个有效的测试用例集 第二 将模块组装成工作程序的方式 第二点考虑很重要 因为它涉及模块测试用例编写的形式 可能用到的测试工具类型 模块编码和测试的顺序 生成测试用例的成本以