周韶园 郑荐中
摘要:嵌入式计算机技术的飞速发展加速了电器行业嵌入式系统的应用,嵌入式系统中软件系统的比重越来越大,软件架构也越发复杂,软件运行的可靠性逐渐成为业界关注的焦点问题。本文由嵌入式软件测试的基本概念入手,基于嵌入式软件测试特点,综合分析嵌入式软件的关键技术和测试方法,旨在改善嵌入式软件的质量,提高其应用性能。
关键词:嵌入式软件 软件测试 测试方法
0 引言
当前,嵌入式软件已广泛运用于工业控制系统、信息家电、通讯设备、医疗仪器、智能仪器仪表等众多领域,软件的质量和应用性能备受业界关注。以往业界仅仅将功能的软件开发-测试模式作为重点研究课题,但当前所取得研究成果已无法满足日益增长的软件测试需求,其对软件行业的发展也产生了一些负面影响。嵌入式软件测试的工作内容主要是软件质量的监测,这对于嵌入式软件的开发及应用十分关键。
本文在软件测试基本技术的基础上,进一步探究嵌入式软件测试技术与监测方法,试图形成一种较为规范化的嵌入式软件测试解决方法。
1 软件测试基础
1.1 软件测试概念 软件是可以用来设计、制造、运行并且能有效维护的高质量、高可靠性的技术解决方案的一系列计算机程序和相关的组件。对软件进行测试是软件能否正常运行的重要保证,软件测试是以发现错误和缺陷为目的的一系列处理分析的程序或过程。
根据IEEE(1983)对测试定义是选择合适的测试用例,执行被测试程序的过程,其目的在于发现程序错误。在IEEEStd829-1998对IEEE(1983)修订版中,将测试定义为:测试(A)一个或多个的测试用例集,或(B)一个或多个的测试过程集,或(C)一个或多个的测试用例和测试过程集,是软件的分析过程,其目的在于发现软件功能特性等实现和要求不一致的地方(也即软件错误)及对软件的评估[1]。
从以上对软件测试的定义我们可以了解到,软件测试是以发现软件缺陷为目的,进而测试软件功能,最终评估软件质量为目的的试验过程。另外,为了确保测试结果客观、准确,必须按照设计要求选用合理的施测软件。
1.2 软件测试步骤 软件测试工作分五步完成,即单元测试、集成测试、确认测试、系统测试和验收测试(详见图1-1)。
■
单元测试完成对最小的软件设计单元的检验工作,筛查程序最小单位(模块)中的缺陷,编码后也需要作进一步验证。单元测试主要包括模块接口、局部数据结构、边界条件、独立路径及错误处理五项内容。
集成测试是将经过单元测试的模块按照软件结构组合在一起作为系统或子系统来进行的测试,验证模块间接口的正确性和各部分工作是否达到或实现相应技术指标及要求。集成测试一般在宿主机环境中进行。
确认测试是把软件系统作为单一的执行实体而进行的需求有效性测试。其目的是验证软件是否满足所有功能、性能、行为和执行要求。主要验证两个方面:一是确认软件正确实现了需求中所要求的功能,二是确认软件实现的功能是需求中所需要的。
系统测试实际是通过比较系统的需求定义,筛查软件中与需求定义不相符或相互矛盾的功能架构。系统测试须综合验证软件及其所含的信息、硬件程序是否与需求定义相一致,并检验程序的运行状态能否达到应用要求。
确认测试主要通过用户的参与,检验软件的性能、功能能否满足用户的使用需求,即验证软件的有效性,因此确认测试亦可称作有效性测试。
2 嵌入式软件测试的特点
性能和功能的测试是嵌入式软件测试的主要内容,但相对于一般性的软件测试而言,嵌入式软件测试仍有其特殊性。
①嵌入式软件运行时对硬件环境有一定的要求,嵌入式软件测试的重要目的是测试软件在特定的硬件环境下能否可靠运行,故对嵌入式软件的测试就需要在相应的硬件环境下进行。
②嵌入式软件测试还要保证嵌入式软件的实时性。测试还需在特定的外部环境下对嵌入式软件进行测试,例如强磁场、高温等环境中保证软件运行的可靠性。
③嵌入式软件产品除了满足设计的外部性能要求,还需要在特定的平台上运用相应的测试工具对软件进行内存测试、GUI测试、覆盖率分析。
嵌入式软件的质量以及程序的稳定性须通过软件测试来维护,这也是软件从开发阶段到应用阶段所必经的环节。图2-1即为嵌入式软件测试模型。
■
测试用例是详细描述测试如何执行的正式文档。选用相应的测试用例,配以测试平台的操作系统以及驱动程序,使得被测软件在正确的环境中运行。根据测试用例的执行结果与预期的测试结果相比较,找出被测程序的缺陷,并加以改进。
3 嵌入式软件测试技术
科学合理的软件测试技术是嵌入式软件测试项目顺利实施的基本前提。根据软件测试程序的应用情况我们可以对软件测试技术进行分类探讨。从测试对象在施测阶段是否被执行角度来看,软件测试涵盖了动态测试与静态测试两部分内容。
静态测试即静态分析,是对被测软件进行特性分析的一些方法的总称。静态测试无需执行程序代码,即可通过其他途径筛查程序内部的缺陷或对程序代码目的进行综合评估。静态测试的测试主要包括代码审查、代码走查、桌面检查、技术评查,这些内容全部须手动完成,另外还包括软件自动完成的静态分析[3]。
和静态测试相对应,动态测试是使被测代码在真实环境或仿真环境下有控制地运行,通过输入测试用例,对代码在运行时体现出的功能、逻辑、行为、结构等多角度观察,检查运行结果与预期结果的差异以发现其中的缺陷,并分析运行效率和健壮性等性能。动态测试的关键在于如何选择测试用例。
按软件测试技术分类有两种,即白盒测试与黑盒测试。
白盒测试主要涉及程序的内部设计和结构的测试。它将施测对象视为一可视化软件,施测人员须全面掌握程序的内部逻辑构造和功能特性,然后选择及设计测试用例,根据程序的逻辑路径施测。在各施测点对程序运行状态进行监测,确定实际的状态是否与预期的状态一致。
黑盒测试在某些情况下也称功能测试。这类测试方法根据软件的用途和外部特征查找软件缺陷,无须了解程序内部的结构,黑盒测试的最大优势在于不依赖代码,只需根据需求,设计相应的测试用例,根据输出结果判断程序功能以及性能正确性。
4 嵌入式软件系统测试方法
理论上讲,将所有可能的输入均作为测试情况考虑,软件测试只有采用穷举输入测试,才能将程序内所有的错误检测出来。而现实中测试情况可有无穷多个,所有可能的输入包含着合法输入和非法输入,要将所有的可能性输入一一检测仍有一定难度,因而须针对测试对象采取适当的测试手段,并参考测试对象的基本条件制定科学的测试用例,为测试工作提供参考依据,以确保有序地落实软件测试各个步骤。笔者结合实践经验,对当前常用的等价分类、边界值分析、McCabe循环复杂度度量和因果图法进行了具体分析。
4.1 等价分类 等价类划分就是把输入划分为若干部分,从每个部分中选取少量代表性数据,来对被测应用进行测试的方法。等价类应为互不相交的一组子集,而子集的并应该是整个集合[4]。
因为软件不仅要接收合理的数据信息,同时须经受意外的考验,因此等价类可细分为有效和无效两种情况。有效等价类,即对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。通过有效等价类,可对程序所达到的性能和功能是否符合规格说明进行验证。而无效等价类与有效等价类恰好是两个相反的概念。另外,对等价类进行划分后须根据设计要求全面测试用例的有效性。
4.2 边界值分析 边界值分析是一种黑盒测试方法,它是对等价类划分方法的补充,通过选择等价类边界的测试用例。通过这种测试方法设计测试用例,须对边界情况有大致的了解。一般来讲,输入与输出等价类的边界即应着重测试的边界情况[5]。
从某种意义上讲,边界值分析法也是一种测试输入或输出的边界值的有效途径。这里所有的边界值涵盖了边界值两边的值。边界值测试的基本原理:输入变量的极值附近极有可能是缺陷点;基本思想:在最小值、略高于最小值、正常值、略低于最大值和最大值处取输入变量的值。
4.3 McCabe循环复杂度度量 要全面测试某一软件或某一功能模块的有效性,先确保被测对象具有可测试性。顾名思义,可测试性即被测对象所具有的内在属性,它与测试工具或测试方法无关。可测试性能够反映出软件质量优劣,只有高内聚、低耦合、接口明确、意图清晰的软件才具有可测试性。相反,高耦合、内部逻辑混乱的软件即为不可测试性软件。
4.4 因果图法 等价划分和边界值分析没有对输入条件进行分析。组合分析有时是一件困难的事情,因为组合的数量可能达到天文数字。因果图有助于找出高效的测试用例,甚至可以找到规格说明欠缺的地方。
因果图法的步骤如下:①分析规格说明中的原因、结果,并赋予标示符。②找出因果之间的对应关系,画出因果图。③在因果图上标明约束条件。④把因果图转化为判定表。⑤根据判定表每一列表示的情况生成测试用例。
5 结束语
伴随着嵌入式软件事业的持续拓展,软件测试作为保证软件质量的一项关键性的工作,已越来越受到重视。正确的嵌入式测试方法是软件测试工作的工作重点。本文除了对有关软件测试的基本概念作了简要阐述,还对它们之间的内在架构进行了重点分析,并介绍了几种常用的嵌入式软件测试技术及嵌入式软件测试方法。这些技术与方法的运用对软件测质量和稳定性起到非常关键的作用。
参考文献:
[1]IEEE,IEEE Standard for Software Test Documentation.IEEEStd829-1998.
[2]梁合庆.当今嵌入式系统综述与新的投资机遇[J].测控技术,2000(4).
[3]康一梅,张永革.嵌入式软件测试[M].北京:机械工业出版社,2007.
[4]古乐,史九林.软件测试技术概论[M].北京:清华大学出版社,2004.
[5]蔡建平.嵌入式软件测试实用技术[M].北京:清华大学出版社,2010.
基金项目:
浙江省大学生科研创新团队资助项目(编号:2012R409046);
2011国家公益性质检行业科研专项资助项目(编号:20110059)。