《软件测试的艺术》第五章 模块(单元)测试

2023-11-20

参考资料

5.0 前言

大型的软件程序需要特别的测试对策。在本章中我们会探讨构建大型程序测试的第一个步骤:模块测试(单元测试),而剩余的步骤将在第六章和第七章中介绍。

模块测试是对程序中的单个子程序、子程序或过程进行测试的过程, 也就是说,一开始并不是对整个程序进行测试,而是先将注意力集中在对构成程序的较小的模块的测试上面。

选择模块测试的原因:

  1. 由于模块测试的注意力集中在程序的较小单元上,因此它是一种管理组合的测试元素的手段。
  2. 模块测试减轻了调试的难度,这是因为一旦某个错误被发现出来,我们就知道它在哪个具体的模块中。
  3. 模块测试为同时测试多个模块提供了可能,这将并行工程引入软件测试中。

5.1 测试用例设计

在为模块测试设计的测试用例时,需要使用两种类型的信息:模块的规格说明和模块的源代码。规格说明一般都规定了模块的输入和输出参数以及模块的功能。

模块测试的测试用例的设计过程如下:

使用一种或多种白盒测试方法分析模块的逻辑结构,然后使用黑盒测试方法对照模块的规格说明以补充测试用例。

白盒测试和黑盒测试测试用例的设计见第四章

(此处建议静下心来看书上所给的例子)

5.2 增量测试

这里需要考虑的问题是:软件测试是否应先独立地测试每个模块,然后再将这些模块组装成完整的程序?还是先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试?第一种方法称为非增量测试或“崩溃”测试,而第二种方法称为增量测试或集成。
在这里插入图片描述
作为传统方法的非增量测试是按如下方式进行的:首先,对6个模块中的每一个模块进行单独的模块测试,将每个模块视为一个独立实体。根据环境和参与人数,这些模块可以同时或按次序进行测试。最后,将这些模块组装或集成为完整的程序。

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

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

下面是几个显而易见的结论:

  1. 非增量测试所需的工作量要多一些,增量测试所需的工作量要少一些,因为使用了前面测试过的模块来取代非增量测试中所需要的驱动模块(如果从顶部开始)或桩模块(如果从底部开始测试)。
  2. 如果是使用了增量测试,可以较早地发现模块中与不匹配接口、不正确假设相关的编程错误。这是由于尽早地对模块组合进行了集成测试。
  3. 如果使用了增量测试,调试会进行得容易一些。假设存在着与模块间接口或假设相关的编程错误,如果使用增量测试,这种类型的错误就很容易发现,因为该错误很可能与最近添加的模块有关。
  4. 增量测试会将测试进行得更彻底。因为增量测试使用先前测试过的模块,取代了非增量测试中使用的驱动模块或桩模块,因此,到最后一个模块测试完成时,实际的模块经受到了更多的检验。
  5. 非增量测试所占用的机器时间显得少一些。
  6. 模块测试阶段开始时,如果使用的是非增量测试,就会有更多的机会进行并行操作。对于大型的软件项目,这可能非常重要,因为在模块开始测试之时,项目的人员数量往往处于最高峰。

由上我们可以得出结论:增量测试要更好一些。

5.3 自顶向下测试和自底向上测试

5.3.1 自顶向下的测试

自顶向下的测试是从程序的顶部或初始模块开始。测试开始之后,挑选哪一个后续模块进行增量测试没有惟一正确的方法;唯一的原则是:要成为合乎条件的下一个模块,至少一个该模块的从属模块(调用它的模块)事先经过了测试。
在这里插入图片描述
第一步是测试模块A,测试要求必须编写出代表B、C和D的桩模块。
桩模块和驱动模块的概念见此。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一个需要考虑的地方是采取什么样的形式将测试用例提交给程序。由于在典型的程序中,顶部模块既不接收输入参数,也不执行输入/输出操作,因此问题的答案并不显而易见:测试数据通过其一个或多个桩模块提交给模块 (此处为模块A)。

在本程序中还有另一个问题:由于假定模块A仅调用模块B一次,问题是如何将多个测试用例提交给模块A。一个解决办法是编写出桩模块B的多个版本,每一个版本都将一个各不相同的有效测试数据集返回给模块A。 为了执行这些测试用例,程序需要执行多次,每次都使用桩模块B的不同版本。另一种可选择的方法是将测试数据放置在外部文件中,由桩模块B读取并返回给模块A。

模块A测试完之后,就用一个实际的模块代替其中的一个桩模块,而该模块需要的桩模块也被添加进来。

在设计模块序列时应该考虑的因素:

  1. 如果程序中存在关键部分,那么在设计模块序列时就应将这些关键模块尽可能早地添加进去。 所谓“关键部分”可能是某个复杂的模块、某个采用新算法的模块或某个被怀疑容易发生错误的模块。
  2. 在设计模块序列时,应将I/O模块尽可能早地添加进来。

5.3.2 自底向上的测试

自底向上的策略开始于程序中的终端模块。测试完这些模块之后,同样没有最佳的方法来挑选要进行增量测试的下一个模块;惟一正确的原则是:要成为合乎条件的下一个模块,该模块所有的从属模块(它调用的模块)都已经事先经过了测试。
在这里插入图片描述
第一步是测试模块E、J、G、K、L和I中的部分或全部模块,既可以串行进行,也可以并行进行。要做到这一点,每一个模块都需要一个特殊的驱动模块 :即包含着有效的测试输入、调用被测模块且将输出显示出来(或将实际输出与预测输出作比较)的模块。有别于桩模块,由于驱动模块可以交迭地调用被测模块,因此不需要为驱动模块提供多个版本。 在大多数情况下,开发驱动模块要比开发桩模块更容易些。

自顶向下方法中无法建立所有测试环境的问题,在这里都不复存在。如果将驱动模块看作是一个测试探针的话,那么该探针是直接放入被测试模块中去的,不会受到中间模块的困扰。

5.3.3 比较

在这里插入图片描述

5.4 执行测试

  • 当测试用例造成模块输出的实际结果与预期结果不匹配的情况时,存在两个可能的解释:要么该模块存在错误,要么预期的结果不正确(测试用例不正确)。为了将这种混乱降到最小程度,应在测试执行之前对测试用例集进行审查或检查(也就是说,应对测试用例进行测试)。
  • 使用自动化测试工具可以使测试过程中的枯燥劳动减至最小。
  • 在准备模块测试时,重温一下心理学和经济学原则会有所裨益。如同本章前面所做的那样,记住对预期输出进行定义是测试用例必不可少的部分。在执行测试时,应该查找程序的副作用。一般情况下,这些情况都是很难发现的,但如果在测试用例执行完之后,检查那些不应有变动的模块输入,可能会发现一些错误实例。
  • 因个人试图测试自己编写的程序所带来的心理学问题,也适用于模块测试。编写调用模块的程序员始终是测试被调用模块的最佳候选人。注意,这仅仅适用于测试。
  • 应避免随意丢弃测试用例,应将它们按某种格式记录下来,以便将来可以重新使用它们。如果发现某一部分模块存在大量错误,那么很有可能这些模块甚至包含着更多的错误,只是尚未检查出来而已。这样的模块应该进行更进一步的测试,可能还需要进行额外的代码走查或检查。
  • 最后,记住模块测试的目的不是证明模块能够正确地运行,而是证明模块中存在着错误。

5.5 小结

本章讨论的单元测试技术对大型程序尤其有用。通过这种技术来测试程序的组件如子程序、子函数、类以及过程。单元测试用来检测软件的功能是否满足了规格说明书的要求。单元测试是开发者编写可靠程序的重要技术,尤其是那些使用面向对象语言的开发者。除了需要阅读程序规格说明书,单元测试还需要了解模块(单元)的源代码。

单元测试是大规模的白盒测试。彻底的单元测试设计需要使用增量策略,如自顶向下以及自底向上的技术。

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

《软件测试的艺术》第五章 模块(单元)测试 的相关文章

  • 等价类划分法

    专注于分享软件测试干货内容 欢迎点赞 收藏 留言 如有错误敬请指正 软件测试面试题分享 1000道软件测试面试题及答案 软件测试实战项目分享 纯接口项目 完整接口文档 软件测试实战项目分享 WEB 测试自动化项目实战 软件测试学习教程推荐
  • 软件测试开发/全日制/测试管理丨性能测试

    性能测试是软件测试中的一项重要活动 旨在评估系统在不同条件下的性能 稳定性和可伸缩性 通过模拟实际用户负载 性能测试有助于发现潜在的性能瓶颈和优化空间 确保系统能够在各种情况下高效运行 性能测试的主要类型 负载测试 通过逐渐增加用户负载 测
  • jenkins+selenium+python实现web自动化测试

    jenkins selenium可以做到对web自动化的持续集成 Jenkins的基本操作 一 新建视图及job 新建视图 新建job 可以选择构建一个自由风格的软件项目或者复制已有的item 二 准备工作 安装Jenkins插件 SSH
  • 软件测试|好用的pycharm插件推荐(五)——Translation

    前言 在我们的日常工作中 经常会遇到需要查看各个第三方库源码的问题 在很多情况下 我们的英语能力不能够满足我们完全读懂源码 所以我们就需要借助翻译工具来帮助我们理解第三方库的源码 如果我们将源码复制再使用其他工具翻译 会显得比较繁琐 如果有
  • JMeter 批量接口测试

    一 背景 最近在进行某中台的接口测试准备 发现接口数量非常多 有6 70个 而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值 想了几种方案后 决定尝试使用JMeter的csv读取来实现批量的接口测试 二 脚
  • 【Mysql】InnoDB 引擎中的页目录

    一 页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表 那么我使用主键查询的时候 最顺其自然的办法肯定是从第一条记录 也就是 Infrimum 记录开始 一直向后找 只要存在总会找到 这种在数据量少的时候还好说 一旦数据多了 遍历耗
  • #私密朋友圈被吐槽有bug?官方致歉!网友:尴尬了......

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • Locust负载测试工具实操

    本中介绍如何使用Locust为开发的服务 网站执行负载测试 Locust 是一个开源负载测试工具 可以通过 Python 代码构造来定义用户行为 避免混乱的 UI 和臃肿的 XML 配置 步骤 设置Locust 在简单的 HTTP 服务上模
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 微信小程序的自动化测试框架

    微信发布了小程序的自动化测试框架Minium 提供了多种运行验证方式 其特点 支持一套脚本 iOS Android 模拟器 三端运行 提供丰富的页面跳转方式 看不到也能去得到 可以获取和设置小程序页面数据 让测试不止点点点 可以直接触发小程
  • 新入职一个00后卷王,每天加班到2点,太让人崩溃了····

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 软件测试|Python中如何提取列表中索引为奇数的元素

    简介 在Python中 我们经常需要从列表中提取特定位置的元素 如果我们想要提取列表中索引为奇数的元素 可以使用一些简单的方法来实现这一目标 本文将介绍如何在Python中提取列表中索引为奇数的元素 并提供示例代码来帮助大家更好地理解这个过
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 跨平台UI自动化框架:Airtest,游戏开发和应用测试的利器

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 一篇文章带你了解Python常用自动化测试框架——Pytest

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 程序员找工作难!拿到外包公司的 offer 我应该去么?

    引言 前一阵子有一个帖子引起了非常广泛的讨论 描述的就是一个公司的外包工作人员 加班的时候因为吃了公司给员工准备的零食 被公司的HR当场批评 这个帖子一发出来 让现在测试行业日益新增的外包公司备受关注 那么外包公司和非外包公司有什么样的不一
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用

随机推荐

  • QT编译环境配置,以及开发板移植的问题

    一 QT编译环境的设置 编译环境的配置 这个是真个系统构建的时候配置的问题 比较麻烦 后面在补这部分的知识 韦东山的开发板和乌班图的编译工具链里面是具有qt的编译工具链的 自己看的是正点原子的视频 所以按照正点正点原子的编译工具进行配置的
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • Webpack构建多页应用Mpa(一):阐述设计概要

    应用场景 如果现在要做一个前后端分离的项目 可能第一反应就是使用市面上很火的三大MVVM框架 Vue React Angular 但如果团队没有专职前端 并且项目预留时间也很紧张 没足够时间去系统学习工程化Vue项目 但是却也想让html
  • 代码段中存放数据

    1 前面我们写的程序中 只有一个代码段 我们先来在代码段中使用数据 看看和单独一个数据段存放数据有什么差别 考虑这样一个问题 编程计算以下8个数据的和 结果存放在ax寄存器中 0123H 0456H 0789H 0abcH 0defH 0f
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • python3.7在centos下安装pygame

    python编程从入门到实践 一书的第二部分开始 需要安装pygame 我用的是centos7 里面有内置的python2 我自己装了python3 7 pip安装pip3 安装过程网上教程很多 但是一般安装的不完全 需要注意的是安装ssl
  • 关于Yarn的一些个人总结

    文章目录 前言 一 Yarn是什么 二 Yarn由什么组成 三 Yarn用来做什么 四 Yarn的优势是什么 五 Yarn解决了什么问题 总结 前言 在前面我们可以得出Yarn是Hadoop生态圈中一个重要得组成部分 主管资源管理 但是具体
  • 2021赣网杯网络安全大赛_部分Writeup

    目录 Web 1 checkin 2 gwb web easypop 3 gwb web2 挖洞大师 misc 1 decodemaster 2 gwb misc lovemath 3 gwb misc3 testcat Web 1 che
  • C++11智能指针之std::shared_ptr

    std shared ptr是在c 11中引入的一种智能指针 其特点是它所指向的资源具有共享性 即多个shared ptr可以指向同一份资源 在c 中使用shared ptr需要包含
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • 有些变压器的中性点为何要装避雷器?

    有些变压器的中性点为何要装避雷器 答 当变压器的中性点接地运行时 是不需要装避雷器的 但是 由于运行方式的需要 为了防止单相接地事故时短路电流过大 220kV及以下系统中有部分变压器的中性点是断开运行的 在这种情况下 对于中性点绝缘不是按照
  • 6.js--布尔值和null

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 1 布尔数据 boolean 2 null 3 null和undefined的意义 1 布尔数据 boolean var a true var b false
  • CSDN创作说明

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 计算机丢失MSVCR120.dll是什么意思,电脑找不到MSVCR120.dll如何修复?

    我们在玩游戏或者运行一些软件的时候 系统提示无法启动此程序 因为计算机中丢失MSVCR120 dll 尝试重新安装该程序以解决此问题 这个需要怎么修复呢 详细困扰着不少小伙伴 小编今天就把教程分享给大家 方法如下 首先是打开电脑浏览器后在顶
  • Java判断时间是否超过30天,java 字符串时间 判断是否在30天内

    时间是字符串类型时 比较大小的时候 先要 转化成 时间格式 然后在进行比较 字符串比较大小的规则 首先取出两个字符串的长度 比较较小的长度内 两者是否相等 若不相等 则直接返回该位置字符的ASCII码相减后的值 若各位置都相等 则将两个字符
  • 问题 A: 天天向上

    题目描述 假设某同学初始能力值为1 现在该同学学习10天 休息1天 学习一天 能力提升0 001 休息一天 能力下降0 001 问一年 365天 后该同学的能力是多少 输出 365天后该同学的能力是 保留小数点6位 分析 书上76页有类似的
  • STM32 串行FLASH文件系统FatFs

    目录 一 Windows系统为例 二 文件系统的结构与特性 为什么要应用文件分配表 三 FatFs文件系统 1 FatFs 文件系统源码介绍 2 FatFs在程序中的关系网 四 配置FatFs移植程序 1 配置diskio c文件 2 配置
  • MobaXterm x11-forwarding

    Linux系统也是有图像界面的 它的方式和Windows不一样 叫做 X Window 采用的是X11协议 X11 中的 X 指的就是 X 协议 11 指的是采用 X 协议的第 11 个版本 客户端是X server 用MobaXterm登
  • CocosCretor解决premultipliedAlpha黑边问题

    在官方文档中的说明 premultipliedAlpha 对于是否启动贴图预乘 当图片的透明区域出现色块时 需要关闭该选项 当图片的半透明区域颜色变黑时 需要启用该选项 之前在项目中导出的spine有黑边问题 也就是半透明区域颜色变黑 然后
  • 《软件测试的艺术》第五章 模块(单元)测试

    软件测试的艺术 第五章 模块 单元 测试 5 0 前言 5 1 测试用例设计 5 2 增量测试 5 3 自顶向下测试和自底向上测试 5 3 1 自顶向下的测试 5 3 2 自底向上的测试 5 3 3 比较 5 4 执行测试 5 5 小结 参