军用嵌入式软件测试技术研究
2021-07-10周平平罗海鹰
周平平,张 俊,罗海鹰,李 翔
(航空工业洪都,江西 南昌,330024)
0 引言
军用软件具有高可靠性、高安全性、规模大、结构复杂和实时性强等特点,因此软件开发时的质量问题显然至关重要。质量不高、可靠性不强的军用软件在使用过程中会带来各种各样的问题,甚至造成灾难性的后果,无法承担国家安全和军事斗争的重任。其中,嵌入式软件因与硬件结合紧密,其可靠性指标具有很大的随机性,如外界环境变化、系统输入出错、使用不当以及软硬件设计的固有缺陷等原因都会导致软件可靠性指标降低,但是不能因为这些因素,使得嵌入式软件可靠性的保证成为空谈。特别是在武器系统中起着至关重要作用的嵌入式软件,必须保证武器装备的精确性和可靠性。
软件可靠性是可以通过软件工程化的实践来提高,在系统开发过程中进行全面的质量控制,包括系统分析、系统设计、软件实现、软件测试和评估、开发人员培训和用户培训等的质量控制。
本文简要介绍了软件测试的基本概念和分类,从单元测试、部件测试、配置项测试和系统测试的角度介绍了不同测试级别的测试内容和测试方法,并据此从软件工程化视角分析了军用软件的测试现状、存在的问题和原因,然后分别从软件管理层面和软件技术层面对军用嵌入式软件的测试提出了一些应对措施,为整体推进软件测试工作提供了可行的解决方案。
1 软件测试技术分析
1.1 软件测试概念及意义
所谓软件测试,是通过对源程序及其实际执行所产生的结果进行检查分析,以找出程序中可能隐藏的错误的过程,即为了发现程序错误而执行程序的过程[1]。它是软件开发过程中一个非常关键的环节,在软件的生存周期中占有重要的位置,通过测试可以确认软件产品是否达到了指标和可靠性要求,并了解软件的实际水平。
根据统计,软件故障在不同阶段发生的比例及在不同阶段发生时修复的费用比例如图1所示[2]。
图1 软件故障在不同阶段发生及修复费用的比例示意图
通过统计数据可看出,软件故障多出现在软件开发过程的早期,同时软件故障越早发现,故障修复付出的费用越少。因此,软件测试在软件开发过程中是一个非常关键的环节,且软件测试工作越早介入越好。
1.2 软件测试级别
如图2所示,软件测试根据测试对象的不同可分为4个测试级别,分别是单元测试、部件测试、配置项测试和系统测试。
图2 软件测试级别与测试对象
其中,单元测试是针对《软件详细设计说明》对应的独立软件单元或相关单元组的测试,确保软件模块的代码覆盖率达到100%;部件测试是针对《软件概要设计说明》对应的独立软件部件或相关部件组的测试;配置项测试是针对《需求规格说明》对单个软件的测试,部件测试和配置项测试都是对应的软件功能性能测试,确保软件功能、性能、外部和内部接口等符合要求;系统测试是在完整的、集成的系统上的测试行为,针对《软件研制任务书》对应的软件需求测试,确保软硬件各项指标符合用户的验收要求。如图3所示。
图3 软件开发V模型
在每个测试阶段中,根据具体的测试方法又可分为静态测试和动态测试,其中动态测试方法根据测试用例设计方法的不同,又分为黑盒测试和白盒测试两类。通常,白盒测试多用于单元测试阶段,黑盒测试多用于系统测试阶段。
1.3 软件测试流程
软件测试流程和软件开发流程是可以并行执行的,如图4所示,图中左边第1列为软件开发流程,第2列到第5列为各级测试流程。所有级别的软件测试工作都无需等到代码全部实现后再开展。
图4 软件测试过程与开发过程并行关系
一般来说,单元测试和部件测试是属于软件开发组的工作,配置项测试和系统测试则属于软件测试组的工作,且软件测试组独立于软件开发组。因此,各级别的软件测试均可并行开展。
2 军用嵌入式软件测试现状及问题
2.1 军用软件测试的管理问题
1)软件开发过程不规范
现阶段,军用软件的开发大多集中于军队直属单位或国家科研院所,这些单位中有相当一部分未建立起相对完善的软件质量保证体系。质量体系的不完善导致软件开发过程缺乏行之有效的管理和监督,软件的质量保证工作基本上是由软件开发者自身完成的。实践证明,采用这种方式开发软件是无法保证软件测试的相对独立性和测试质量的。
此外,软件测试是一个贯穿于整个软件开发过程的系统工程,测试工作的进入点应前置到需求分析和系统设计阶段开始,而我军的软件测试工作,一般是在编码完成之后和软件产品交付运行之前进行,如果需求理解不充分或设计中有错误,测试的质量就难以保证而且返回修改的代价相当巨大。
2)软件测试组织不健全
当前,我国多数的军用软件承制方没有按照软件工程的要求建立独立的软件测试部门,软件测试仅仅是走过场,测试作用的可信度大大降低,“重开发、轻测试”的思想和现象较严重。同时对测试人员本身缺乏专业的测试思想和测试技术的培训,这些因素影响了软件测试的效果。
3)软件设计文档不完备
软件测试工作与软件设计文档密不可分,测试人员正是依据这些文档形成测试中需要的软件测试计划、软件测试说明、软件测试报告等测试文档。但是,在软件研制过程中,相关人员往往不重视软件设计文档的编制和管理,这些不完备或不符合要求的软件文档给测试工作造成重重障碍,严重影响测试工作的展开。
4)软件测试技术不先进
由于我军软件测试工作起步较晚且投入有限,许多测试机构的测试方法和手段都还比较落后,甚至沿用人工测试的方式。一些测试机构虽然购买了测试工具,但是由于军用软件应用的特殊性,许多工具没有被充分利用。此外,测试用例和缺陷是测试管理的核心,但是一些承制方在开展软件测试时,没有建立起完善的管理库,对设计的测试用例和测试过程中发现的缺陷缺少数据库管理手段,不能对测试问题进行有效跟踪、分析和处理。
2.2 军用软件测试的技术问题
1)嵌入式软件测试环境问题
在任务繁忙的时候,软件测试往往是用真实环境进行,但是受到嵌入式软件运行环境难以修改的约束限制,对于一些安全性的测试难以正常注入,测试的充分性得不到保障。并且,不同的测试级别对测试环境的要求也不尽相同。所以,嵌入式软件测试必须根据测试级别、软件项目需求建立合适的测试环境。
2)嵌入式软件内存分配问题
在嵌入式软件运行过程中,内存泄露、数组越界、内存空间不足等问题都会使系统受到影响,甚至会导致系统的崩溃。针对用于系统内存分配和使用的源代码的检查,一直是人工方式进行检查,但是工作量太大,且不能动态监视内存分配,测试不充分。
3)嵌入式软件数学模型验证问题
在软件测试的验证过程中一直都存在数学模型验证的难题,数学模型中含有大量的复杂数学公式和数值的计算,还有定义了大量的全局和局部的变量。为了保证这些运算的正确,必须要做好计算机软件数学模型的验证。
4)嵌入式软件静态测试问题
软件静态测试是对源代码的规则和度量元进行检测,在静态测试中,测试工具会在分析过程中存在一些误差,需要利用人工对软件静态测试结果进行深入的分析和确认。人工分析和确认工作与测试人员的认知和经验直接相关,因此如何提高嵌入式软件测试人员判断的准确性是静态测试过程不可忽略的问题。
5)嵌入式软件测试覆盖率问题
为了保证嵌入式软件的高可靠性和高安全性,要求测试要有很好的覆盖率,在测试过程中要尽量保证所有的代码都会被执行,最大限度的发现软件中潜藏的BUG。覆盖率的实现过程是通过对源代码的插装来完成的,如果用人工方式进行插装,不仅工作量巨大且易存在疏漏,由此得到的覆盖率分析工作也有巨大困难。所以,选择合适的覆盖率测试工具是解决问题的关键。
3 测试问题的解决措施
军用软件测试是一项跨部门、覆盖多学科、涉及多技术领域的复杂系统工程,要有效解决目前存在的困难和问题,促进其正规、有序发展,就必须树立体系建设思想,遵循积极、稳妥的原则,运用系统工程方法,着力寻求要素全面、协调配套的综合解决方案,分步实施、整体推进。目前,我们可以采取如下基础措施。
3.1 测试管理问题的解决措施
1)规范开发及测试过程
按照国家军用标准的相关要求,明确及规范开发及测试过程。规范的制定应由高层领导支持,在整个单位内实施。测试工作应随着项目启动尽早计划与开展,并贯穿整个项目过程,避免因时间节点等原因导致项目测试工作不够充分,甚至测试工作无法及时介入项目的情况。
2)提升软件测试人员的素质
成立由专人负责并由专职人员组成的软件测试队伍,负责从软件需求分析到交付用户的全寿命周期软件测试组织与管理工作。由于软件测试在软件的开发过程中占有重要地位,因此对软件测试人员提出了很高的要求,一般来说软件测试人员的水平不能比设计人员的水平低。软件测试人员需通过不断实践总结测试的经验与不足,加强对软件工程与测试方法的学习,同时提高与开发人员的沟通能力,切实做好单位内部的测试工作。
3)提升软件开发人员的素质
通过软件工程化及软件测试过程培训等手段,加强开发人员对软件测试工作的认识,使软件开发人员能够积极配合软件测试相关工作,切实有效地保证软件质量。
4)加大软件设计文档审查力度
目前,GJB5000A在军工企业逐步应用推广,软件产品研制过程的工程化要求越来越规范和严谨,对软件产品研制已经定义了流程化或模板式的操作方法,但大部分项目软件人员仍然会犯“先做事,后补文档”的错误。针对这种“重代码、轻文档”的现象,应该结合测试管理规定中的评审机制,进一步加强对文档的审查力度,力求文档能够及时更新,与软件实时保持一致。
3.2 测试技术问题的解决措施
1)嵌入式软件测试环境
嵌入式软件是软硬件耦合系统,把软硬件分离开来,建立嵌入式软件独立的运行环境是建立嵌入式软件仿真测试环境的关键。一个完整的嵌入式系统包括处理器、I/O接口以及各种外部设备。在建立嵌入式软件仿真测试环境时,需要考虑软硬件的分离原则,即哪些采用真实硬件设备,哪些需要用软件仿真实现,哪些需要用硬件仿真实现。如图5所示,不同的嵌入式系统以及软件测试阶段,需要建立的仿真测试环境也不相同。
图5 不同软件测试阶段需要的测试环境
嵌入式软件的单元测试主要采用白盒测试方法,一般在宿主机上,利用集成开发环境或测试工具的全数字仿真模拟器来进行,找出单元编码时产生的错误以及与软件设计的偏差。在极特殊情况下,也可以在目标机上进行,利用单元测试中的驱动模块和桩模块进行。
嵌入式软件的部件测试可在宿主机环境上利用测试工具来完成,也可在目标机上搭建仿真测试环境来完成,具体依赖于软硬件耦合程度和部件的集成级别。
嵌入式软件的配置项测试主要是软件形成独立的配置项后,加载到相应的硬件平台上测试其运行情况,以确定软硬件能够正确协调工作,实现软件需求规定的功能、性能等要求。配置项测试必须在目标机环境下进行,交联设备可以采用仿真模型替代,也可以利用半实物仿真测试工具搭建测试环境来进行确认测试。
嵌入式软件的系统测试是将被测软件和硬件资源都综合起来构成完整的应用系统进行测试,确保整个系统达到研制任务书的要求。嵌入式软件的系统测试对测试环境有严格的要求,必须在真实目标机环境下进行,包括运行平台、交联设备都要是真实的,目的是要确保嵌入式软件能够在最终的真实硬件环境下正确运行。
2)嵌入式软件测试工具
软件测试是一项有难度的专业技术工作,除了人工代码走查、系统测试之外,大部分工作需要专业的软件测试工具完成。软件测试的很多技术问题,如内存分配问题、测试覆盖率问题等都可以借助合适的测试工具来解决。常见的软件单元测试工具见表1。
表1 软件单元测试工具
根据测试的具体需要选择合适的测试工具既可以提高测试人员的测试效率,又可以极大提高测试的有效性。其中,TestBed能够实现汇编语言、C/C++、Fortran、Ada等语言的静态和动态测试,可用于代码评审、质量评审、设计评审、测试验证和测试管理,是目前针对嵌入式软件测试最有效的工具,被较多用于军用嵌入式软件测试。
4 结语
军用嵌入式软件在开发方法、实现语言特点、运行环境和承担功能等方面所具有的特殊性,决定了其测试方法、平台和工具的选型需要周密考虑。同时,要注重系统化的嵌入式软件测试体系的建立、软件测试环境的搭建、测试队伍的建设,以及测试管理体系的标准化等软件测试配套工程的建设,从而保证军用嵌入式软件测试的顺利实施。