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

article/2025/9/30 3:47:17

目录

5.0 前言

5.1 测试用例设计

5.2 增量测试

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

5.4 执行测试

5.5 小结


5.0 前言

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

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

选择模块测试的原因:

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


5.1 测试用例设计

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

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

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

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

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

5.2 增量测试

这里需要考虑的问题是:软件测试是否应先独立地测试每个模块,然后再将这些模块组装成完整的程序?还是先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试?第一种方法称为非增量测试或“崩溃”测试,而第二种方法称为增量测试或集成。

作为传统方法的非增量测试是按如下方式进行的:首先,对6个模块中的每一个模块进行单独的模块测试,将每个模块视为一个独立实体。根据环境和参与人数,这些模块可以同时或按次序进行测试。最后,将这些模块组装或集成为完整的程序。

 

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

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

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

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

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

5.3.1 自顶向下的测试
自顶向下的测试是从程序的顶部或初始模块开始。测试开始之后,挑选哪一个后续模块进行增量测试没有惟一正确的方法;唯一的原则是:要成为合乎条件的下一个模块,至少一个该模块的从属模块(调用它的模块)事先经过了测试。

在这里插入图片描述

 

第一步是测试模块A,测试要求必须编写出代表B、C和D的桩模块。
桩模块和驱动模块的概念见此。

另一个需要考虑的地方是采取什么样的形式将测试用例提交给程序。由于在典型的程序中,顶部模块既不接收输入参数,也不执行输入/输出操作,因此问题的答案并不显而易见:测试数据通过其一个或多个桩模块提交给模块 (此处为模块A)。

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

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

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

如果程序中存在关键部分,那么在设计模块序列时就应将这些关键模块尽可能早地添加进去。 所谓“关键部分”可能是某个复杂的模块、某个采用新算法的模块或某个被怀疑容易发生错误的模块。
在设计模块序列时,应将I/O模块尽可能早地添加进来。
5.3.2 自底向上的测试
自底向上的策略开始于程序中的终端模块。测试完这些模块之后,同样没有最佳的方法来挑选要进行增量测试的下一个模块;惟一正确的原则是:要成为合乎条件的下一个模块,该模块所有的从属模块(它调用的模块)都已经事先经过了测试。

第一步是测试模块E、J、G、K、L和I中的部分或全部模块,既可以串行进行,也可以并行进行。要做到这一点,每一个模块都需要一个特殊的驱动模块 :即包含着有效的测试输入、调用被测模块且将输出显示出来(或将实际输出与预测输出作比较)的模块。有别于桩模块,由于驱动模块可以交迭地调用被测模块,因此不需要为驱动模块提供多个版本。 在大多数情况下,开发驱动模块要比开发桩模块更容易些。

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

5.3.3 比较

在这里插入图片描述

5.4 执行测试

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


5.5 小结

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

单元测试是大规模的白盒测试。彻底的单元测试设计需要使用增量策略,如自顶向下以及自底向上的技术。
————————————————
原文链接:https://blog.csdn.net/qq_45580956/article/details/117781653


http://chatgpt.dhexx.cn/article/Yb0950ZJ.shtml

相关文章

软件测试的艺术_读书笔记(一)

软件测试的艺术是测试人员必看书,两年前看这本书给我很多理论和指导,现在重新看,按照个人的理解,整理一些学习笔记。 第一章 软件测试的心理学和经济学 最重要的一句话 : 测试人员的态度比实际测试过程本身更重要 1.…

【读书笔记】-《软件测试的艺术》

2018年10月13日23:24:26 自诩: 因为上一东家工作的原因而接触测试。原本本职是嵌入式软件,因为公司正在风口浪尖的阶段,就是一种小公司要发展成为大公司而经历的那种痛,全公司上下都忙得焦头烂额的这样的背景下,我从软…

《软件测试的艺术》第2章:软件测试的心理学和经济学

软件测试的心理学 书中此部分首先辨析了两个概念:软件测试的定义、成功的测试和不成功的测试。 软件测试的定义: 测试是为发现错误而执行程序的过程,我们应当假设程序是存在bug的;由于证明程序不存在错误的过程是一项看起来不…

《软件测试的艺术》读书笔记

1 一次自评价测试 所谓软件测试,就是一个过程或一系列过程,用来确认计算机代码完成了其应该完成的功能,不执行其不该执行的功能。 2 软件测试的心理学和经济学 2.1 软件测试的心理学 软件测试是为发现错误而执行程序的过程。 2.2 软…

精读-软件测试的艺术之模块测试及更高级别的测试

本文是关于精读书籍《软件测试的艺术》的一些学习笔记和分享 本书共有九章包括测试思想(心理,经济),代码检查,测试用例设计,模块测试,更高级别的测试,调试,极限测试和因…

软件测试,浅析这项黑色艺术的难与易

今天给各位同行们带来一本技术好书《软件测试的艺术》(原书第3版),让我们一起来赏析这本经典著作吧! 本书是国内很多软件测试书籍的首要参考书目,短小精悍的篇幅、深入浅出的内容很适合初学者作为入门首选。同时&…

软件测试执行的艺术

测试执行 测试执行过程 主要任务 确定测试用例的优先级开发测试规程并确定优先级,创建测试数据,同时也可以准备测试用例和设计自动化测试脚本根据测试规程创建测试套件,以提高测试执行的效率确认已经正确搭建的测试环境根据计划的执行顺序&…

《软件测试的艺术》万字笔记

软件测试的心理学和经济学 软件测试人员在测试过程中要有正确的态度(愿景) 心理学 软件测试的定义需要明确:软件测试的根本应该聚焦到为程序增加价值,让程序变得更加可靠,是找出问题并让问题得到解决的过程 测试是…

《软件测试的艺术》第3章:代码检查、走查与评审

《软件测试的艺术》: 软件开发人员通常不会考虑到的一种测试形式:人工测试。大多数人认为,因为程序是为了供机器执行而编写的,那么也应由机器来对程序进行测试。这种想法是有问题的。人工测试方法在暴露错误方面是很有成效的。实际…

Hash与HashCode

1.hash和hash表 首先看一张来自百度百科的解释 hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值…

深入理解 Java 中的 hashCode

深入理解 Java 中的 hashCode 一、hashCode 方法二、为什么重写 equals 方法的时候必须重写 hashCode 方法? 一、hashCode 方法 Java 是一门面向对象的编程语言,所有的类都会默认继承自 Object 类,Object 类中就包含了 hashCode() 方法&…

hashCode 和对象的内存地址

hashCode 文章目录 hashCodehashCode 的生成逻辑第 0 种算法第 1 种算法第 2 种算法第 3 种算法第 4 种算法第 5 种算法 根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值…

HashCode

HashCode 文章目录 HashCode前言Hash是什么?HashCodeHashCode关键点判断两个对象相等 前言 Hash是什么? 哈希函数 把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,是一种压缩映射。 hash是一个函数&#…

java中equals,hashcode和==的区别

2019独角兽企业重金招聘Python工程师标准>>> 1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 2.引用类型(类、接口、数组) 当…

hashcode讲解【最详细版本】

Object 基类 Object 含有的方法 hashCode 作用:用于查找的快捷性,常用于确定对象的存储地址 如 Hashtable,HashMap 默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。 如果两个对象相同, equals方法一…

hashcode详解

前言 HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时,它返回的是对象的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象。 在Java中,hashCode()方法是被Object类定义…

真正搞懂hashCode和hash算法

本人当初刚接触java的时候一说到hash算法或者hashCode也是蛋蛋疼,两只都疼 后来花了整整一天时间来研究hash,搞懂后发现其实也不难理解,时隔一年突然想起来,写篇博客记录下; 以前我莫得选择,现在我想搞懂…

腾讯_TEG一面

总结 不愧是腾讯内部技术含量较高的部门,上来怼基础。总体有套路可循,比较偏技术

腾讯技术解读|TEG—硬核拆解,腾讯产品的底层技术牛在哪里?

技术,是各个事业群的核心力量 然而,事业群的不同,核心力量也不同 你是否还在纠结事业群的选择? 担心对事业群不了解而选错事业群? 毫无疑问 技术也是事业群选择的重要衡量因素之一哦! 对此&#xff0c…

15 年腾讯老兵谈技术人成长之路

作者:alexguo,腾讯TEG技术总监&技术专家 每个职场人都会经历从职场新人到骨干、专家亦或是管理者的蜕变过程。作为技术职业人,大家常会碰到一些困惑,在不同职业发展阶段所需要具备的认知和专业能力差异在哪里?除了…