1、引言
随着软硬件技术的发展,嵌入式系统在生产、生活以及军工等各项领域中都有着越来越广泛的应用。嵌入式系统的功能越来越强大,相应地,其核心控制软件的规模也变得越来越庞大,复杂性也越来越高。如何开展有效的嵌入式软件测试,提高嵌入式系统的质量和可靠性,成为目前软件测试领域亟需解决的问题。另一方面,软件工程化是各个软件组织所追求的目标,按工程化的原则和方法组织嵌入式软件测试工作,探索出一个有效的嵌入式软件测试工程化方法,对提高嵌入式软件的质量和效率以及增强软件组织自身的软件测试能力具有极其重要的意义。
2、嵌入式软件的特点
与通用计算机软件相比,专用性是嵌人式软件固有的特点。嵌入式软件只能在需求所指定的硬件平台上执行,通常其开发平台与应用平台是分离的,并且执行状态受资源和时间的约束。
嵌入式软件往往作为一个嵌入式系统的组成部分,与其他组成部分之间通过各种方式进行交互。嵌入式软件通过传感器接收信号,给动作器发送输出信号,动作器控制着真实的物理环境。此外,嵌入式软件还可能通过各种类型的I/O接口或总线与其他系统交联,进行信息的交互。虽然不同的嵌入式系统其核心软件在功能和性能上千差万别,但总体上,嵌入式软件所实现的功能大致包括以下基本模块:系统初始化、任务调度、数据解算、时序控制、I/O通信、定时管理、中断管理、任务间的通信/同步/互斥管理及内存管理等。
嵌入式软件的这些特点决定了对其进行测试的复杂性和困难度,嵌入式软件的测试仍然是目前测试行业的难点之一。最近研究…表明,超过50%的嵌入式软件开发项目比计划延迟数月;仅44%的设计满足了既定功能和性能的20%;超过50%的开发精力花费在测试上。
3、嵌入式软件测试的重要性
在嵌入式系统设计中,软件正越来越多地取代某些硬件的功能,这样可以降低系统的成本,获得更大的灵活性。嵌人式系统的质量和可靠性越来越依赖于嵌入式软件的质量和安全性。
嵌人式系统中软件所占的比重越来越大,相应的由嵌入式软件失效而引起的故障比例也越来越大。根据美国国家宇航局NASA的统计,在2O世纪80年代初,软件与硬件引起的故障比率约为1.1:1.0,到了20世纪80年代末,这一比率已达到2.5:1.0。在我国的武器装备系统研制过程中,由于近年来广泛采用了比较先进的电子技术、计算机技术和信息技术,给我国武器装备的性能带来了革命性的变化_2J。但是在研制或者使用过程中,大量的故障都来源于软件的因素,不仅影响装备的研制进度,甚至造成设备损害和人员伤害。因此,提高嵌入式软件的质量成为目前迫切需要解决的问题。众所周知,软件测试是保证高质量、高可靠性软件的重要手段,对嵌人式软件来说更是如此。实践证明,在软件开发过程中,通过软件测试来发现其中的缺陷是提高软件质量和可靠性的一种非常有效的方法。目前,许多软件开发组织在嵌入式软件的研制过程中已深刻认识到软件测试的重要性,也或多或少地开展嵌入式软件的测试工作,但是缺乏一个行之有效的工程化方法指导。这样使得开发组织在着手开展嵌入式软件测试时常常无从下手,从而导致测试过程缺乏计划性、进度经费不可控、有效性无法保证等情况的发生,难以适应现代软件工程的需要。
4、嵌入式软件测试工程化
软件工程包括方法、工具和过程三方面的因素。软件测试是软件工程中的一个子过程,为使软件测试工作系统化、工程化,必须合理组织软件测试过程,制定测试计划、组织测试人员、建立测试环境、监控项目进展等。
4.1 软件测试过程模型
及其产生的输出包括如下方面。
1)制定测试计划:依据测试需求,确定测试范围、测试方法、测试环境、启动准则、评价准则、完成准则、工作步骤、人员、进度等。
2)制定测试说明:细化测试计划的有关内容,根据相关文档设计测试用例,制定测试规程,给出相关的说明,并建立测试环境。
3)执行测试:执行测试用例,记录测试结果,记录发现的缺陷。跟踪问题,必要时补充测试用例,进行回归测试,直至问题处理完毕。
4)评估测试:依照评价准则,评价测试工作,当发现测试工作不足时,应修订测试计划,重复步骤1),直到测试完备时止。
5)测试总结:总结测试执行情况,统计软件问题数量和
大体上来讲,嵌入式软件测试过程的框架、基本测试活动类型,生成测试报告。图1给出了嵌入式软件测试的过程模型,该模型已成功运用于嵌入式软件测试实践中。软件测试与软件开发一样,自动化程度还很低,在测试过程中人是决定性的因素,必须协调好相关人员之间的职责划分和关联关系。在测试活动中,不同的人员各自担负着一个或多个角色,每个角色承担着一定的职责。各个角色的工作内容之间存在着一定的关联,这就要求每个角色的工作必须按照计划有序地进行。同时,各种角色之间还必须建立及时有效的协同工作模式,以及交流和沟通的手段。与测试活动相关的人员角色主要有:测试负责人、测试人员、开发人员、配置管理人员、质量保证人员等,在测试过程中各角色及其职责。
此外,与通用计算机软件的测试过程相比,嵌入式软件测试过程中对测试环境有特殊的要求,针对不同类型的嵌入式软件以及在测试过程的不同阶段应建立良好的测试环境以满足测试的要求。良好的测试环境包括已加载到目标计算机的并在目标计算机环境的高逼真仿真中经过测试的软件。为了提高测试的可信度,应使用目标计算机仿真器或宿主机模拟器来完成测试,因为某些错误仅在这个环境中才能检测到。最后,为了保证软件测试项目按预定的计划进行,对测试过程进展要实施监控。监控是以计划为基础的。监控项目包括进度监控、人员监控、经费监控和质量监控。
4.2 嵌入式软件测试方法与技术
嵌入式软件由于自身的特点,决定了不同的嵌入式软件必须有不同的测试方法,但对它们的测试仍然还是存在着许多类似的需求和类似的解决方案。
首先,嵌入式软件测试按测试阶段可分为单元测试、集成测试、确认测试和系统测试。
1)单元测试:找出软件单元编写时产生的错误以及软件单元编写与软件设计的偏差,内容包括软件单元的功能测试、接口测试、重要执行路径测试、局部数据结构测试、语句覆盖和分支覆盖测试。单元测试主要采用白盒测试方法,且一般可以在宿主机环境中进行。
2)集成测试:检验软件单元和(或)软件部件间的接IZI关系,逐步将软件单元和(或)软件部件集成为一个新的符合设计要求的软件部件,最终形成软件配置项。测试内容包括软件单元之间的接口测试、软件部件的功能测试、全局数据结构测试。集成测试主要采用黑盒测试和白盒测试相结合的方法,可在宿主机或目标机环境中进行。
3)确认测试:对软件系统进行全面的测试,确保软件系统满足需求并且遵循设计。测试内容包括功能测试、性能测试、边界测试。确认测试主要采用黑盒测试方法,一般在目标机环境中进行。 4)系统测试:在真实系统工作环境下检验完整软件配置项是否能和系统正确连接,并满足软件研制任务书的功能和性能要求。系统测试采用黑盒测试技术,且要求与系统其余部件综合起来作为整体在目标机环境中进行。
其次,嵌人式软件测试可采用代码审查、静态分析和动态测试等技术。代码审查无须执行被测代码,而由同行专家根据软件需求和设计文档对源程序进行全面审查,借以及早发现程序的不足之处,减少后续出现错误的概率。静态分析也不必运行被测代码,而是借助专用的软件工具对源程序进行各种分析,如编码规则检查、变量定义分析、数据流分析、圈复杂度分析等。试图在软件设计早期就能发现程序尽可能多的潜在缺陷或错误。一段复杂的很难理解的代码虽然不一定是错的,但它是很难维护的,也是不可靠的,因为它隐含错误的可能性很大,且不易发现。通过静态分析,可有效提高软件开发的质量,减少在后续测试阶段出现错误的概率。动态测试是使被测代码在真实环境下有控制地运行,对代码在运行情况下能体现的功能、逻辑、行为、结构等多角度观察程序运行时的行为,以发现其中的错误。
再次,从测试方法上讲黑盒测试和白盒测试构成动态测试的基本内容。黑盒测试是把程序看成是一个内部不可见的黑盒,测试者无需顾及程序内部结构、语句、分支、路径等的情况,只需根据需求,设计相应的测试用例,根据输出结果判断程序功能以及性能的正确性。白盒测试是一种对程序内部的逻辑结构和编码结构进行测试的方法。这种测试方法主要考虑程序的控制流和数据流测试,如语句覆盖、分支覆盖、路径覆盖以及内存数据异常等的测试。在嵌入式软件的测试过程中,如果只进行黑盒测试,限于测试用例的有限性,总会有一部分代码分支的运行结果难以被检测到,即使将软件需求中的功能都检测到了,仍无法对测试进行充分性判别,因此,要确保嵌入式软件的测试质量,在开始黑盒测试之前必须进行足够的白盒测试。
4.3 嵌入式软件测试支撑工具
为提高软件测试效率,需要使用测试工具支持和辅助测试工作,其作用就是为测试的实施提供某种服务,以减轻测试人员的劳动工作量。嵌入式软件测试支撑工具主要包括:静态测试工具、动态测试工具、仿真测试环境、测试管理工具等。
当今软件领域中所涌现出来的软件测试支撑工具种类繁多、功能各异,在嵌入式软件测试过程中,要根据如下原则选择适用而有效的测试辅助工具。
1)根据嵌入式软件自身的特点选择测试工具。将工具与其目的、用途相匹配,适合于测试的需要,测试过程才有效。
2)根据测试过程不同测试阶段选择测试工具。比如,单元测试阶段不需要目标机环境,可以选择通用的单元测试工具对被测代码进行静态分析和动态覆盖率分析;而在系统测试阶段,利用嵌入式软件仿真测试环境对实时嵌入式软件进行自动的、实时的、非侵入式的系统测试是目前国内外测试实时嵌人式软件公认的、行之有效的方法。
3)考虑软件开发和测试人员技能水平,选择合适的且易于实施的测试工具,进行充分的培训。
4)考虑测试工具的价格因素,综合评估使用该工具的效费比。
5、嵌入式软件测试实例分析
下面结合一个具体的嵌入式软件单元测试过程来描述软件测试工程化方法在实际中的应用。某嵌入式软件是在软件开发环境CCS(CodeComposerC3x一C4x)中采用TMS320C31C语言编程实现的,主要包括主控制流程、功能应用、数据处理、底层驱动、中断服务等几个模块。该测试任务为期6周,处于单元测试阶段,与开发过程的编码阶段并行。
测试负责人根据需要制定软件测试计划,确定测试的范围、方法、进度安排。本次测试的目标是:完成代码的静态分析和桌面检查,设计测试用例,完成动态测试(语句覆盖率达100%、分支覆盖率达85%以上),同时兼顾部分单元级功能测试。测试环境为宿主机环境,测试工具选择LDRATestbed/Tbrun,测试管理工具选择MercuryQualityCenter,用于管理测试用例和缺陷。
测试人员根据测试计划的安排,首先依据设计文档编写测试用例,在对被测单元进行静态分析后执行测试用例,并将所发现的缺陷及时提交测试管理工具。开发人员对所发现缺陷进行确认和修改,将修改后的软件重新提交测试,测试人员执行回归测试,验证缺陷的修改情况。最后,测试人员对单元测试情况进行总结,编写单元测试报告。在测试周期内,测试人员通过静态分析,发现9类违反代码规则,编写测试用例75个,语句覆盖率和分支覆盖率均达到要求,发现软件缺陷54个,其中维护性问题5个,设计问题22个,逻辑问题l6个,其他问题11个,如图3所示。从测试结果来看,本次测试任务较好地完成了预期的目标,验证了该工程化方法的有效性。
6、结语
本文结合嵌入式软件的特点,阐述了一个有效的软件测试工程化方法,然后以一个测试实例验证了该方法能有效地发现软件问题,提高嵌入式软件的质量,进而保证嵌入式系统的安全性和可靠性。本文提出的软件测试工程化方法对软件组织开展有效的嵌入式软件测试提供指导,并且对实施软件工程化具有一定的参考价值。