文/樊茜 何雨昂 宋茜
伺服控制设备嵌入式软件特别注重软件测试工作。原因在于对传统软件开发的研究表明,大约65%的软件缺陷是使用白盒测试方法发现的,其中集成测试中由于只包含了模块的软件代码,代码量较少,所以软件缺陷容易被隔离出来,且集成测试发现的问题多为模块内部功能缺失、单元测试未发现接口问题、时序问题、资源竞争问题等致命缺陷,因此集成测试是最有效的一类测试。
图1:某项目嵌入式软件子功能调用关系图
集成测试是把经过单元测试的函数按照软件的结构组合在一起,作为一个系统或一个子系统来进行的测试。与单元测试不同,集成测试中的所有的调用或被调用的函数均为真实函数。虽然经过单元测试后的单元函数满足详细设计要求,但是并不能保证这些函数集成后能正常工作。因为程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。集成测试的目的是验证单元函数组装成模块后,模块内部函数以及模块与其他模块之间的关系的正确性,并且发现其缺陷。
集成测试的测试过程为:将各单元函数连接起来,检查模块内的函数相互调用时,数据经过接口是否丢失;将各个子系统或子功能组合起来,检查能否达到预期要求的各项功能;各模块之间是否会存在功能互斥或者产生不利的影响;在模块内使用的全局数据是否存在读写冲突,会不会被异常修改;多个模块的计算误差是否会积累起来,从而被放大到不可接受的程度。
生成集成测试集成序列的方式,称为集成策略。按照集成策略的方式,一般可分为非增量集成和增量式集成。非增量集成指将所有已通过单元测试的函数一次性集成为整体软件,不需要设计任何驱动模块和桩模块,但是由于一次性集成后的函数调用关系多,数据关联耦合度高,测试用例设计难度大且易出错,针对函数调用层数较多的软件不建议使用该策略。
增量集成指的是程序以小增量的方式逐步进行构造和测试,可以较早的发现模块间接口不匹配、不正确假设等编程错误。这样错误易于分离和纠正,更易于对接口进行彻底测试。
增量集成中分为如下三种:
(1)自顶向下集成。以功能分解树为基础,从树的顶端出发,依次将大功能分解为小功能,从下方节点中选择单元函数集成为新的模块,需要开发桩模块来模拟父节点的向下调用关系。
(2)自底向上集成。自底向上集成是自顶向下顺序的“镜像”。在自底向上集成中,首先从分解树的叶子开始,需要特殊编写驱动模块进行集成测试。驱动模块包含有效的测试输入、调用被测试块且将输出显示出来的模块。大多数情况下,驱动模块比桩模块开发难度小。
(3)三明治集成。三明治集成测试是将自顶向下测试与自底向上测试两种模式有机结合起来,采用并行的自顶向下、自底向上集成方式,形成的方法。三明治集成测试更重要的是采取持续集成的策略。桩和驱动的开发工作都比较小,不过代价是在大量集成函数的后,在一定程度上增加了定位缺陷的难度。
以功能分解树为基础的函数集成方法能很好的验证模块功能,能尽早的在子功能模块中发现设计缺陷,但是由于功能分解树的构造易出错,非常依赖被测文档的正确性和测试人员的业务能力,如果功能分解树构造有偏差则严重影响了集成测试的有效性。
伺服控制设备嵌入式软件是运行在伺服控制器的一种强实时高可靠软件,实现软硬件资源协同处理,从而完成伺服系统控制功能。每个功能的实现是由函数间的逐级调用的过程完成,直至最底层的代码。因此函数之间相互调用关系正确合理,是保证整个嵌入式软件功能完备的基础。
根据以上特点,同时解决集成测试集成策略依赖功能分解树的问题,本文研究了一种快速生成嵌入式软件集成测试集成序列的方法:基于调用图的自底向上的生成集成序列。该方法不仅能覆盖了嵌入式软件所有函数的调用关系,自底向上的集成策略还便于测试人员快速分析测试结果和定位软件问题,提高了集成测试的测试效率。
表1:定时中断闭环控制功能集成序列
软件函数调用图能清晰的反应整个软件函数之间的实际关系,并且容易通过测试工具获得,是进行集成测试的基础。通过调用关系图生成集成序列有以下原则:
(1)从调用关系图的叶子节点出发,将已完成测试的单元或模块,按照调用关系添加到新模块;
(2)如果程序中存在关键部分,那么在设计集成序列时应将关键模块尽可能早地添加进去。所谓的关键模块可能是某个复杂的模块、某个采用新算法的模块或某个被怀疑容易发生错误的模块;
(3)在设计集成序列时,应将I/O模块尽可能早地添加进来。
本文用某项目中的嵌入式软件为示例,来说明该项目集成序列的生成过程。如图1所示。
根据该软件的概要设计说明要求,该软件包含各芯片初始化功能、1553B总线消息处理功能和定时中断闭环控制功能等。其中序号1为定时中断闭环控制功能入口。依照上述集成序列生成原则,先确定该软件的关键功能为定时中断闭环控制功能,该功能再细分为本地时钟管理(序号2)、数字量采集(序号3)、闭环控制运算(序号4)、监控寄存器(序号5)等子功能。其中涉及外设I/O的子功能为AD采集测量数据,且该子功能的输出值为闭环控制运算的输入值,以上几点均符合集成序列的选择原则,那么该子功能的集成序列为:
a:{27,17}
b:{27,17,16,7}
c:{27,17,16,7,2}
以此类推可以生成该软件定时中断闭环控制功能的集成序列如表1。表1中一共列举了16个集成序列,覆盖了定时中断闭环控制功能的所有函数调用,是后续设计测试用例的基础。
基于调用图的自底向上序列集成方法,无需人工构造功能分解图,减轻了测试人员的工作量。该方法能够很快的发现处于底层模块的问题,且由于被调用的函数均为真实函数,更容易观测到模块输出值,更便于测试人员判断测试结果是否满足设计要求,从而提高了集成测试的测试效率。