type
status
date
slug
summary
tags
category
icon
password
😀
文章前言:本文主要讲述集成测试。
 

一、概述

什么是集成测试?

  • 集成测试亦称组装测试。
  • 集成测试将经过单元测试的模块逐步进行组装和测试。
  • 集成测试验证程序和概要设计说明的一致性。
  • 集成测试在模块组装后查找模块间接口的错误。
 

集成测试的必要性

良好的软件测试充分性准则应具有的基本性质:
  • 非复合性:即使一个测试数据集对于软件所有的成分是充分的,也不能保证它对于整个软件是充分的。
  • 非分解性:即使一个测试数据集对于整个软件是充分的,也不能保证它对于软件所有的成分是充分的。
一个模块可能对另一个模块产生不利的影响。
可能会发现单元测试中未发现的接口方面的错误。
将子功能合成时不一定产生所期望的主功能。
独立可接受的误差,在组装后可能会超过可接受的误差限度。
在单元测试中无法发现时序问题(实时系统)。
在单元测试中无法发现资源竞争问题。
 

二、集成测试的方法

结构化分析方法基于三种互补的模型:
  • 功能模型:使用数据流图
  • 数据模型:使用E/R模型
  • 控制模型:有限状态机
 

1 示例

ASTM系统
notion image
屏幕显示
notion image
语境图
notion image
第一层数据流图
notion image
E-R图
notion image
上层SATM有限状态机
notion image
PIN输入有限状态机
notion image
功能分解树:根据数据流图转变而来。
notion image
单元调用图
notion image
主程序(会话管理)
过程ValidatePIN(三次密码输入检验)
过程GetPIN
 

2 基于分解的集成

相依性:相依性是模块以各种方式相互依赖的关系。
  • 关联(association)和聚集(aggregation)
  • 继承
  • 全局变量
  • 调用API
  • 服务器对象
  • 被用作消息参数的对象
 
模块组装的策略:
(1)非渐增式集成测试
又叫大爆炸集成测试(big-bang testing):一下子把几十个甚至上百个模块莽撞地联接在一起。“big bang”描述了这种联接的声音效果“咣”。
目的:通过少数测试运行检测整个系统来论证系统的稳定性。
  • 优点
    • 迅速完成集成测试
    • 测试用例较少
  • 缺点
    • 错误难以定位
    • 即使通过测试,许多接口错误也会隐藏
  • 应用
    • 小的、良构的系统,其模块已接受了充分的测试
    • 一个已经存在的系统,只是做了少量的修改
    • 通过复用可信赖的模块构造系统
notion image
(2)渐增式集成测试
  • 从一个模块开始,测一次添加一个模块,边组装边测试,以发现与接口相联系的问题。
渐增式集成策略是先进行模块测试,然后将这些模块逐步组装成较大的系统,每连接一个模块进行一次测试。按组装次序,渐增式又常有多种方案:自顶而下增值策略、自底向上增值策略、混合增值策略。
无论采用哪种方案,都需要设计驱动模块或桩模块,对每一个新组装的子系统进行测试主要采用黑盒法,对发现问题较多的子系统或模块应该用白盒法作回归测试。
功能分解树
(1)自顶向下:从树根结点开始向下
(2)自底向上:从树叶结点开始向上
(3)三明治:自顶向下与自底向上相结合
 
两个概念
  • 驱动模块(driver):用以模拟被测模块的上级模块的一次性代码。
  • 桩模块(stub):也称存根程序,模拟被调用模块的一次性代码。
 
自顶向下集成测试
按照系统层次结构图,以主程序模块为中心,自上而下按照深度优先或者广度优先策略,对各个模块一边组装一边进行测试。
notion image
优点:
  • 测试和集成可以较早的开始
  • 减少了驱动(driver)的开发
  • 如果底层接口未定义或可能修改,则可以避免提交不稳定的接口
缺点:
  • 桩的开发代价较大
  • 在底层模块中一个无法预料的需求可能迫使顶层模块的修改
  • 要充分测试底层模块可能比较困难
应用:
  • 增量式开发
  • 并行软件开发
  • 框架开发
 
自底向上集成
目的:从具有最少的相依性模块开始,按照相依性的次序将模块加入,以证实稳定性。 策略:
  • 从功能分解树的叶结点开始,向根的方向移动
  • 编写叶结点的驱动器
  • 为上一级模块编码
  • 整个系统使用根一级的模块测试
notion image
优点
  • 自底向上方式虽然需要构造驱动模块,但是它不需要构造桩模块,而构造驱动模块比构造桩模块更容易,因为驱动模块具有某种统一性,而桩模块千差万别
  • 涉及复杂算法和真正输入、输出的模块一般在底层,它们是最容易出现问题的模块,而这些模块在自顶向下的组装测试的后期才遇到,如果此时才发现错误,那么改正它所需要花费的代价就更大
  • 采用自底向上的组装方式,随着测试层次的提高,剩下的被测模块越来越少,为测试一个模块只需为该模块构造唯一的一个驱动模块,而采用自顶向下方式,则可能要构造若干个桩模块,这无疑也增加了费用
  • 叶结点的测试和集成可以并行
缺点
  • 驱动器的开发耗费量大
  • 高层模块的可操作性和互操作性测试得不充分
适用范围
  • 重要需求的模块在底层
 
自顶向下和自底向上比较
notion image
 
三明治集成测试
  • 三明治集成是一种混合增值式测试策略,是自顶向下和自底向上集成的结合。
  • 系统可看作是分三层
    • 中间一层为目标层
    • 测试的时候对目标层上面的一层采用自顶向下策略
    • 对下面的一层采用自底向上的策略
    • 最后测试在目标层会合
  • How do you select the target layer if there are more than 3 layers?
    • Heuristic: Try to minimize the number of stubs and drivers
notion image
优点:兼有自顶向下和自底向上两者的优点。
缺点:中间层在被集成前测试不充分。
 

3 基于调用图的集成

基于分解集成的缺点之一,是以功能分解树为基础。如果改用调用图,则可以减缓这种缺陷,并且也向结构性测试方向发展。由于调用图是一种有向图,可以利用前面介绍过的图论知识,像使用程序图那样地使用调用图。
基于调用图的集成测试方法
  • 成对集成测试(Pair-wise Integration Testing)
  • 相邻集成测试(Neighborhood Integration Testing)
优点
  • 减少了驱动器/桩的开发工作
  • 接口关系测试充分
  • 测试集中于衔接的功能性
  • 测试和集成可以并行开始
缺点
  • 调用或协作的关系可能是错综复杂的
  • 参与者没有被单独测试,要充分测试底层模块较困难
  • 缺陷隔离问题,尤其是对有大量邻居的情况
适用范围
  • 尽快论证一个可运行的调用或协作
  • 被测系统已清楚定义了模块的调用和协作关系
 
成对集成测试
成对集成测试背后的思想,是希望使我们可以减少开发桩/驱动器的工作量,能采用实际代码替换桩/驱动器。
成对集成的方法就是对应调用图的每一个边建立并执行一个集成测试会话。
对于之前示例中的SATM调用图,有40个集成测试过程。
notion image
 
 
 
相邻集成测试
借用拓扑学中的邻接概念,在有向图中,一个结点的邻居(neighborhood)包括该结点的所有直接前驱结点和所有直接后继结点。这对应结点的桩和驱动器集合。
notion image
每个内部结点有一个邻居(neighborhood);如果有叶结点直接连接到根结点,则还要加上一个邻居。
内部结点=结点-(源结点+汇结点)
邻居=内部结点+源结点
邻居 = 结点 - 汇结点
相邻集成测试可大大降低集成测试过程数量(本例中从40降至11),且减少了桩和驱动器的开发工作量。
 

4 基于路径的集成

(1)MM-路径
Paul C.Jorgensen提出,MM-路径(Message Method)是穿插出现模块执行路径和消息的序列。
给定一组单元,其MM-路径图是一种有向图,其中节点表示模块执行路径,边表示消息和单元之间的返回。
注意:MM-路径不是可执行路径,描述单元之间的控制转移。
对于传统软件来说,MM-路径永远是从主程序开始,在主程序中结束。
 
(2)新概念与概念扩展
允许语句片段作为完整语句处理,语句片段是程序图中的结点
  • 源结点:程序中的源结点是程序开始执行或恢复执行处的语句片段。
    • 单元中的第一个可执行语句显然是源结点
    • 源结点还会出现在紧接转移控制到其他单元的结点之后
  • 汇结点:程序执行结束处的语句片段。
    • 程序中的最后一个可执行语句显然是汇结点
    • 转移控制到其他单元的结点也是汇结点
  • 模块执行路径:模块执行路径是以源结点开始、以汇结点结束的一系列语句,中间没有插汇结点。
  • 消息:一种程序设计语言机制,通过这种机制一个单元将控制转移给另一个单元。
  • 子程序调用、过程调用、函数引用
    • 我们约定接收消息的单元(消息的目的地)总是最终将控制返回给消息源。消息可以向其他单元传递数据。
  • MM-路径:穿插出现模块执行路径和消息的序列。
    • MM-路径的基本思想:用来描述包含在不同单元之间转移控制的模块执行路径序列,这种转移是通过消息完成的。
    • MM-路径总是代表了可行的执行路径,并且这些路径要跨越单元边界
    • 在经过扩展的程序图中可以发现MM-路径,其中的结点表示模块执行路径,边表示消息。
 
(3)MM-路径复杂度
V(G)= e – n + 2p
V(G)= e – n + 2
(对于结构化过程代码,p=1)
notion image
在图中有七条模块执行路径:
MEP(A,1)=〈1,2,3,6〉
MEP(A,2)=〈1,2,4〉
MEP(A,3)=〈5,6〉
MEP(B,1)=〈1,2〉
MEP(B,2)=〈3,4〉
MEP(C,1)=〈1,2,4,5〉
MEP(C,1)=〈1,3,4,5〉
notion image
 
(4)总结
优点
  • MM-路径是功能性和结构性的一种混合
    • 表达上:功能性
    • 标识方式上:结构性
  • 它与实际系统行为密切匹配,而不是靠基于分解和调用图集成的结构性路径。因此这种基于路径的集成测试能与系统测试无缝连接
缺点
  • 标识MM-路径的工作量很大
 

三、案例研究

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
请写出次日问题中输入是“2010-12-31”的MM路径。
notion image
💡
有关问题,欢迎您在底部评论区留言,一起交流~
 
小熊派HarmonyOS快速入门小熊派BearPi-HM Nano烧录
Loading...
Koreyoshi
Koreyoshi
一个无可救药的乐观主义者
Latest posts
软件测试:集成测试
2025-3-25
软件测试:控制流测试
2025-3-25
软件测试:系统测试
2025-3-25
软件测试:数据流测试
2025-3-25
软件测试:测试驱动开发
2025-3-25
软件工程:面向对象的概念和记号
2025-3-24
Announcement
🎉写给自己的2025心愿🎉
保研
国奖
完善博客
学一门乐器
发表一篇论文
拍摄人生照片
去3个城市旅游
专业课知识视频
拍摄毕业季视频
----- 2025 ------
👏希望我们一起变好👏