使用**💡**标记的是期末考点!

软件测试基础

软件测试概念

什么是软件测试

软件测试是软件开发过程中的最后的一个阶段,它是在软件开发过程中保证软件质量、提高软件可靠性的最重要的手段之一,它是软件系统在正式交付用户使用前,对系统分析、设计、代码等开发工作的最后检查和复审

重要概念的定义

  • 失败:当程序不能运行时称为失败。失败是系统执行过程中出现的一种情况,它源于编码错误
  • 错误:程序运行而得不到正确结果。
  • 缺陷:缺陷是错误的表现。如叙述的不完整、数据流图的不平衡、程序流程图的非结构化设计、源代码编写错误等。
  • 测试用例:测试用例是为了某种特定目标而设计的一组输入数据或执行条件以及预期结果的集合。它是测试执行时最小的实体。

    注意:测试用例 = 输入 + 预期结果

总结

软件测试是在一定软件环境下,以最小的成本来验证系统能否按照需求正确运行,并尽可能多的发现存在的错误。

测试只能证明程序有错,而不能保证程序无错。

软件测试过程模型

V模型

V模型的过程如下:
image.png
一般来讲:

  • 单元测试对应详细设计。也就是说,单元测试的测试用例是和详细设计一起出现的,在研发人员做详细设计的时候,相应的测试人员也就把测试用例写了出来;
  • 集成测试对应概要设计。在做模块功能分析及模块接口,数据传输方法的时候,就把集成测试用例根据概要设计中模块功能及接口等实现方法编写出来,以备以后作集成测试的时候可以直接引用;
  • 确认测试对应需求分析,在系统分析人员作系统分析,编写需求说明书的时候测试人员就根据客户需求说明书,把最后能实现系统功能的各种测试用例写出来,为做最后系统测试作准备。

也就是说V模型在软件周期的各阶段同步进行一些相应测试的编写,等到软件开发完毕,就直接进行测试,无需再编写测试代码。

V模型的重要价值在于,它定义了软件测试如何与软件工程各阶段相融合,它清楚地描述了各级别软件测试与软件开发各阶段的对应关系。

W模型

W模型的过程如图所示:
image.png

  1. W模型的重要贡献在于,**明确软件开发各阶段都要进行测试**,而不仅仅是在编码结束后才开始。这样,测试的对象不仅是代码,还可以是文档(需求规格说明、设计规格说明等)。

也就是说,W模型在每个开发的阶段结束后就立刻开始测试,而不是等到所有开发统一结束之后才开始进行测试。

H模型

H模型是对W模型更高层次上的线性抽象。
image.png

它明确表示,在任何一个开发流程,只要有必要,并且测试配置已准备就绪,就能进行测试活动。

软件测试原则

  1. 应尽早地和不断地进行软件测试
  2. 开发人员应尽量避免进行软件测试
  3. 注重测试用例的设计和选择
  4. 增量式测试
  5. 充分注意测试中的群集现象
  6. 合理安排测试计划,严格执行测试计划
  7. 全面统计和分析测试结果
  8. 保存测试文档,并及时更新

    💡软件测试信息流

    软件测试信息流说明了从测试、结果分析、调试到排错的连续过程,反映了测试过程中所需的各类文档、数据及信息的转换过程
    测试过程需要输入三类信息:

  9. **软件配置说明**:包括软件需求规格说明,软件设计规格说明、源代码等。

  10. **测试配置**:包括测试计划、测试用例、预期结果、驱动程序。
  11. **测试工具**:测试工具提高了测试效率,支持测试数据自动生成、动态分析代码、测试结果对比与分析等测试信息流中的相关活动。

image.png

💡软件测试分类

不同的角度,对于软件测试的分类就不同。

静态测试和动态测试

形式分类 测试对象 说明
静态测试 源程序 不运行程序就找出程序中存在的错误
文档 技术审查和管理复审
数据
动态测试 源程序 运行程序而发现存在的错误和问题。

黑盒测试和白盒测试

观点分类 测试对象 说明
白盒测试 内部逻辑结构 语句覆盖
条件覆盖
条件组合覆盖
……
循环等控制结构
黑盒测试 模块外部输入输出的对应 测试的是模块功能是否符合设计,运行时是否能(被)正确调用。

简单来说,白盒测试是对程序细节的测试,黑盒测试是对程序整体的测试

测试策略和过程划分

过程分类 测试对象 说明
单元测试 函数、过程、类、软部件 软件“大厦”的基石测试
集成测试 各单元的组装 涉及软件结构的设计
确认测试 系统的功能和性能 参照用户需求,又分为α测试和β测试,后者类似于验收测试
系统测试 软件系统
用户环境
硬件系统
通信系统
系统部署
外部系统的适应性测试

α是第一阶段,一般只供内部测试使用;alpha测试 (由用户、测试人员、开发人员共同参与的内部测试)
β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;beta测试 (内测后的公测,交给最终用户测试 公司外部展开的测试,可以由非专业的测试人员执行的测试)

可以简单理解为α测试就是对内部的测试,β测试就是对外的测试。


白盒测试

白盒测试的设计原则

前面我们知道,白盒测试主要是对于程序内部细节的测试,其设计原则是:

  • 保证所有的判断分支至少执行一次
  • 保证所有的循环体至少执行一次
  • 保证判断和循环的所有边界值都执行一次
  • 保证每条独立路径都执行一次

在上述原则的基础上,白盒测试技术又分为逻辑覆盖、循环测试和路径测试。

逻辑覆盖

逻辑覆盖准则:

  1. 语句覆盖
  2. 判定覆盖
  3. 条件覆盖
  4. 判定/条件覆盖
  5. 条件组合覆盖
  6. 路径覆盖

详细参见:
(二)逻辑覆盖cb414的博客-CSDN博客逻辑覆盖

由于考纲里面没有这个知识点,就不细讲了。

循环测试

白盒测试——循环测试2418728171的博客-CSDN博客循环测试

同理于上。

路径测试

详解软件测试中基本路径测试法萌面超人me的博客-CSDN博客基本路径测试

同理于上


黑盒测试

黑盒测试又叫做功能测试或者行为测试,主要根据设计说明中的功能设计来测试程序是否能按照预期进行实现。

黑盒测试的目的发现系统中的功能性错误

  • 功能不完整或者不正确
  • 界面或者接口错误
  • 数据结构错误
  • 访问外部数据库错误
  • 性能不满足需求
  • 初始化或者中止系统时的错误

    💡等价类划分

    什么是等价类划分

    等价类划分是指把所有可能的输入数据,按照程序接口定义划分为若干的自己,并从每个子集当中选取具有代表性的有限数据作为测试用例。
    举个例子,我设定了一个函数:

    1. public int function(int number){
    2. if(number >= 0) return 1;
    3. else return 0;
    4. }

    这里的number就是一个输入,number的输入范围可以大致的看为所有的整数,根据函数的定义,其实可以划分为两个子集:

  • 大于等于0的整数

  • 小于0的整数

这两个子集就是number等价类划分

有效等价类和无效等价类

  • 有效等价类:对于被测试程序来说有意义的合理的数据
  • 无效等价类:对于被测试程序来说没有意义的,不合理的数据(例如在上面的程序当中输入一个字符串)

    划分等价的辅助原则

    对于常见的数据分析,如特殊数值、区间值、布尔值等,结合各类经验,有以下原则辅助确定等价类:
  1. 如果定义了输入数据的取值范围(如[a,b]),则可划分一个有效等价类([a,b]间的数据集)和两个无效等价类(-∞, a)以及(b, +∞)
  2. 如果规定了输入数据的个数(如N个),则可以划分出一个有效等价类(1~N之间)和两个无效等价类(0个)或(N+M个数据)
  3. 如果规定输入数据是特殊值,则特殊值集合是有效等价类,其余取值构成一个无效等价类
  4. 如果定义了输入数据的规则,则可划分出一个符合规则的有效等价类和一个违反规则的无效等价类
  5. 如果输入数据是布尔量,则可划分出一个有效等价类和一个无效等价类
  6. 如果输入的数据是整型,则可划分负数、零和正数三个有效等价类
  7. 对于上述各自划分的有效等价类和无效等价类,可以根据不同角度、规则、程序处理方式等各方面入手,再细分为若干有效或无效的等价子类。

    划分等价类的步骤

    第一步:根据输入数据,划分待测问题的等价类,并对每个等价类进行编号
    第二步:优化等价类(合并或拆分),并对每个等价类设计对应的测试用例。

    例题

    书上例6.4,

    不过书上的题我看着至少有两个问题,建议看下面的文档:

等价类划分例题lljjdd567的博客-CSDN博客等价类划分例题

边界值分析

什么是边界值分析

边界值分析法是对等价分类技术的补充,即在一个等价类中不是任选一个元素作为此等价类的代表进行测试,而是选择此等价类边界上的值。
image.png

边界值法原则

  1. 如果输入数据给定了范围,则对于范围的边界,定义比边界值少1、边界值、比边界值多1的数值设计测试用例。例如[a, b]区域,则取a-1、a、a+1,b-1, b, b+1作为测试用例
  2. 如果规定了输入数据的个数N,则设计0个数据、1个数据、2个数据、N-1个数据、N个数据和N+1个数据等的测试用例
  3. 如果没有指定值区域,则应取计算机所能表达的最大值最小值作为测试用例
  4. 对于浮点数,应该取最大精度和最小精度的浮点数作为测试用例
  5. 如果输入数据是有序集,则取该集中第一、第二,倒数第二和最后一个元素作为测试用例。

    错误推测法

    错误推测法是根据测试人员的经验和直觉来推测程序中可能存在的各类错误,从而有针对性地设计测试用例。由于错误推测法在很大程度上凭借直觉和经验,因此难以有确定的步骤去发现错误和问题。

黑白盒测试比较

应用角度的不同

  1. 测试技术不同:白盒测试更加关注详细的逻辑结构,黑盒测试更加关注整体
  2. 测试人员不同:白盒测试需要程序员和测试人员,黑盒测试可以让用户非技术人员参与
  3. 文档配置不同:白盒测试需要详细的设计文档,黑盒测试只需要概要设计

    优缺点比较

    |
    | 优点 | 缺点 | | —- | —- | —- | | 黑盒测试 |
    1. 测试人员不需要了解细节,容易上手
    2. 容易生成测试数据
    3. 测试系统功能,效率高
    4. 非技术人员也可以参与
    5. 适用于测试的各个阶段
    6. 能发现系统结构问题
    |
    1. 部分代码没有被测试
    2. 隐藏了未被测试代码的错误
    3. 不易进行充分性测试
    4. 有各类人员参与测试,容易造成测试的重复性
    | | 白盒测试 |
    1. 帮助软件测试人员增大代码的覆盖率
    2. 提高代码的质量
    3. 发现代码中大部分问题和隐藏的问题
    4. 有较多工具支持测试过程
    5. 部分测试用例能自动生成
    |
    1. 程序运行会有很多不同的路径,不可能测试所有的运行路径
    2. 测试基于代码,只能测试开发人员做的对不对,而不能知道设计的正确与否,可能会漏掉一些功能需求
    3. 系统庞大时,测试开销 会非常大,容易出错。
    4. 仅仅适用于单元测试
    |

软件测试策略

单元测试

什么是单元

单元是软件测试过程最小的测试单位,有两个基本属性:

  1. 可以独立编译的最小组件
  2. 个人开发的软件组件

一般来说,单元和模块两个概念不加以区分。所以单元测试和模块测试就是相同的。

单元测试的内容

  1. 模块接口
  2. 局部数据结构
  3. 程序执行的路径
  4. 边界条件
  5. 异常处理

    单元测试策略

    单元一般都是软件系统中的一个部分,一般来说都不能单独的运行,所以在测试单元的时候,需要设置辅助模块才能让他进行运行。
    辅助模块分为两类:
  • 驱动模块:用于模拟主调模块,也就是被测试模块的上级模块
  • 桩模块:也就是被测试模块的下级模块,可以向被测试模块提供相应的数据

他们之间的关系如下:
image.png
一般来说,驱动模块比较好模拟,而桩模块的编写相对比较复杂。

集成测试

什么是集成测试

  1. 集成测试是指在完成单元测试后,将各单元模块依据设计的软件系统结构,按照一定的集成测试策略进行组装的过程。

集成测试的内容

集成测试在组装各模块时,应该注意下列因素:

  • 各模块间的数据传递是否会丢失
  • 各模块间的数据传递是否按照期望进行传递
  • 各模块组装后,是否能实现所期望的更复杂的功能
  • 各模块组装后,是否出现对全局数据结构、公共数据操作的混乱,资源的竞争
  • 各模块组装后,集成的误差是否会被快速放大,直到难以接受为止。

    💡集成测试策略

    集成测试策略解决的是如何吧各个模块快速和准确的组装在一起进行测试。
    非渐增式集成
    这种方式是一种一次性集成的过程,也就是按照各个模块在系统结构中的位置,设计驱动模块或者桩模块进行辅助测试.
    例如,一个软件系统的结构如下:
    第六章:软件测试 - 图7
    可以看出上图中总共有五个模块,接下来就是对这五个模块分别进行单元测试:
    第六章:软件测试 - 图8
    A模块是顶层驱动模块,无需驱动模块,所以只需要对应设计其桩模块即可。
    第六章:软件测试 - 图9
    模块B和C既有上级模块,又有下级模块,所以分别编写其驱动模块和桩模块。
    第六章:软件测试 - 图10
    模块D和E只有夏姐模块,所以只需要编写其桩模块即可。
    优点:
  1. 测试方法简单,易于实施
  2. 测试过程快速,同时集成,也利于并行调试各个模块
  3. 辅助测试模块数目少,工作量小

不足:

  1. 各个模块单独编写辅助模块缺乏共同执行,对全局数据结构和公共数据测试不足
  2. 一次性的继承对于后续的调试带来困难,难以发现错误
    渐增式集成
    这种集成的方式不是一次性组装,而是按照系统结构逐渐讲模块依次集成到系统当中
    一般分为:自底向上的集成自顶向下的集成
    自底向上的集成:
    第六章:软件测试 - 图11
    自顶向下的集成:
    第六章:软件测试 - 图12
    上面的步骤里面可以看出来,自顶向下采用的是深度优先集成,也就是优先形成一个完整的子系统(图中就是一条完整的分支),然后再去形成其他的子系统(其他的分支)