SCI论文(www.lunwensci.com):
摘要:在机载大规模复杂软件验证过程中,开展结构覆盖活动时,需要选择既高效又能满足实际项目工程需要的方法。在总结了传统结构覆盖方法的局限性后,对机载大规模复杂软件的结构覆盖分析方法进行研究,结合已有项目经验,提出了一套针对软件中不同性质的代码分别采用在宿主机或目标机上进行结构覆盖,以及使用模型覆盖工具进行结构覆盖的方法。
关键词:大规模复杂软件;民机适航;软件验证;结构覆盖分析
Research on Structural Coverage Analysis for Large-scale Complex Airborne Software
WANG Juan,ZHAO Xiaolong,YU Jiayang
(China National Aeronautical Radio Electronics Research Institute,Shanghai 200241)
【Abstract】:In the verification process of airborne large-scale complex software,when carrying out structural coverage activities,it is necessary to choose an efficient method to meet the engineering needs of the projects.After summarizing the limitations of traditional structural coverage methods,and combined with existing project experience,the structural coverage analysis method of airborne large-scale complex software is researched and proposed.This method divides different kind of source codes and do structural coverage analysis on host or target computer for them.This method also includes how to use model coverage tools to do structural coverage analysis.
【Key words】:large-scale complex software;civil aircraft airworthiness;software verification;structural coverage analysis
0引言
随着民用机载航空电子技术的发展得以不断加速迭代。当前机载系统的功能越来越复杂,同时,越来越多的功能通过机载软件实现,使得当今机载软件的复杂度和规模都急剧增加。基于传统手段的软件开发和验证方法都面临成本激增、维护困难等问题,因此,当前软件的各项研制活动必须考虑如何适应大规模复杂软件的特性。
根据机载软件适航标准DO-178C[1]的目标,对于安全等级为C级及以上的软件,在软件验证过程中,除了需要完成基于需求的测试活动外,还需要开展结构覆盖分析活动,以证明测试的充分性。本文对大规模复杂软件开展结构覆盖分析会遇到的具体问题进行了分析,结合已有项目的经验,以基于模型开发的显示系统为例,对大规模复杂软件如何进行结构覆盖分析进行了研究并提出了一套方法。
1传统结构覆盖分析方法的局限
由于传统手工编码方法在编写大规模复杂软件时费时费力、可靠性低,而基于模型的软件开发方法则简单、易操作,且其生成的代码也能满足一系列的安全特性。因此国内外航空领域在应对大规模复杂软件时,陆续开始使用基于模型的软件开发方法[2-4]。基于模型的开发可实现软件的大部分功能需求。同时,为了软件能在不同平台上适配,需要使用手写代码的方式实现软件框架,并在框架手写代码中调用模型。由于基于模型开发的代码,在处理类似字符串处理等功能时,性能较低,因此对性能要求较高的部分功能,一般不直接在模型中实现,而使用在模型中嵌入手写代码的方式。因此大规模复杂机载软件往往由框架手写代码,模型生成代码,嵌入模型中的手写代码组成。
对于结构覆盖活动,传统的做法是,针对模型,使用工具进行模型层级的结构覆盖;针对手写代码,通过工具对所有的代码进行插桩,将插桩后的代码加载至目标机后执行测试用例,通过硬件采集、串口或网络将覆盖数据回传到宿主机上进行分析,从而得到覆盖率的结果[5-6]。基于DO-178C的要求,不同安全等级的软件需要满足不同的覆盖率准则,对此国内已有较多研究[7-9]。
然而,对于基于模型实现的大规模复杂软件,其代码量会大幅度增长,根据真实项目统计,某A机型主飞行显示和发动机参数软件,使用手工代码实现的代码行数约为3万余行,而某B机型使用基于模型开发的主飞行显示和发动机参数软件,功能更多更复杂,其模型生成代码行数为35万余行。对于大规模复杂软件,使用传统的结构覆盖方法会有以下的局限性:
(1)环境不支持:由于软件的规模很大,对源代码进行插桩后,会产生巨大的膨胀,而目标机的空间往往非常有限,插桩后的软件无法被加载到测试环境中,这就对结构覆盖的分析带来了很大的难度;
(2)代码可读性差:若采用基于模型的开发技术,由模型生成的代码可读性相对较差,尤其是逻辑复杂的部分。在结构覆盖分析过程中,需要对未覆盖的代码结构进行分析,然而代码本身难以看懂,会对分析工作产生巨大的工作量,且对分析人员的要求非常高,很大地影响工作效率;
(3)资源不够用:软件复杂度及规模的增加也会使测试用例增加,执行用例的时间也会相应增加,但是目标机的数量有限,在项目时间和成本优先的情况下,不可能为了结构覆盖分析活动成倍地生产制造目标机和采购测试环境所需的设备。传统的结构覆盖方法会对资源的分配带来很大的挑战;
(4)目标不满足:很多模型开发工具配备了相应的模型覆盖分析工具,也有一定的应用[10-11],但都是使用仿真用例对模型层级进行覆盖分析。从DO-178C的目标来看,结构覆盖是针对源代码或目标代码的,仅在模型层级获取覆盖率结果是不足以满足DO-178C的目标的。
2大规模复杂软件结构覆盖分析方法
机载座舱显示系统(CDS)软件是一个典型的大规模复杂软件,软件代码行数达到了数百万行,该软件采用了ANSYS公司开发的基于模型的开发工具SCADE进行软件开发。SCADE工具分为两部分,SCADE Suite用于逻辑模型的开发,SCADE Display用于显示模型的开发。SCADE Suite KCG和SCADE Suite Display KCG分别可以根据模型生成代码,KCG代码生成器经过了严格的工具鉴定,能保证模型与生成代码的一致性。SCADE还提供了SCADE Suite MTC工具用于对Suite模型进行模型覆盖分析。对于手写代码的结构覆盖分析,仍采用LDRA公司开发的Testbed工具进行。
2.1总体思路
一个典型的基于SCADE模型开发的显示系统应用软件结构如图1所示:
SCADE Suite生成的代码主要负责处理软件的逻辑部分,因此其生成代码的结构会非常复杂,而SCADE Display生成的代码负责处理软件的显示部分,其生成代码的结构相对简单。
为了解决前文提到的传统结构覆盖方法的缺点,在对基于SCADE模型开发的软件进行结构覆盖时,需要考虑以下几点:
(1)尽可能地在宿主机中完成结构覆盖分析:由于目标机的资源有限且内存较小,尽可能在宿主机中进行覆盖结果的收集,一方面可减少在目标机上进行源代码插桩的规模,降低对目标机空间容量的需求;另一方面能有效减少需要在目标机执行的用例数量,降低对目标机资源数据的需求;
(2)尽可能使用基于模型的结构覆盖分析工具:由于模型生成的代码可读性较差(尤其是SCADE Suite模型生成的代码),因此使用基于模型的结构覆盖工具能减少人工分析模型生成代码的工作,能够满足适航目标的同时也可降低对结构覆盖分析工程师的能力要求;
(3)为了保证结构覆盖结果的有效性,需要确保结构覆盖分析时执行的用例和测试时执行的用例是一样的,并且执行结果也一致。(包括TC、TP、TR)。
因此,对于基于SCADE模型开发的大规模复杂软件,会针对软件的不同组成部分,采用不同的策略进行结构覆盖分析;
(4)SCADE Suite生成的代码:在宿主机中,使用SCADE Suite MTC(以下简称MTC)获取结构覆盖结果,需要注意的是,必须获取生成代码层级的覆盖结果;
(5)SCADE Suite中嵌入的手写代码:可以在宿主机执行,因此使用Testbed在宿主机中获取结构覆盖结果;
(6)SCADE Display生成的代码:代码可读性较好,使用Testbed在宿主机中获取结构覆盖结果;
(7)框架及接口手写代码:由于只能运行在目标机上,使用Testbed在目标机中获取结构覆盖结果。
2.2 SCADE Suite模型生成代码的结构覆盖方法
SCADE Suite生成的代码需要在宿主机中使用MTC获取结构覆盖结果,MTC是SCADE工具链中的模型覆盖分析工具。该工具可以对基于SCADE Suite搭建的模型进行模型覆盖分析。MTC主要由两部分组成,分别是模型层级覆盖分析模块(MLCM)和代码层级覆盖分析模块(CLCM)。MTC的功能概貌参如图2所示。
其中代码结构覆盖的功能主要由CLCM完成。CLCM可以通过基于需求的测试度量对KCG生成代码的结构覆盖。对于MLCM和CLCM,须使用相同的测试场景文件进行覆盖分析。虽然CLCM是对模型生成代码进行结构覆盖分析,但是由于前期首先使用了MLCM进行模型层级的覆盖分析,而代码生成器保证了模型与生成代码具有一致性,因此,CLCM运行后还需进一步分析的未覆盖代码结构会非常少,即使代码可读性较差,但是工作量却不会很大。
CLCM分为三个模式:插桩模式、采集模式和报告模式。
插桩模式会对根据代码生成的配置生成的代码进行插桩,并将这些代码编译成静态库,并生成一份参考代码用于和软件开发过程产生的源代码进行比较。
采集模式通过运行测试场景文件,得到覆盖结果文件和执行结果文件,软件验证人员需要再次确认执行结果均通过。
报告模式可以将多次的结构覆盖结果进行合并,得到一个总体的覆盖结果。软件验证人员应根据覆盖结果对未覆盖的代码进行分析。CLCM的覆盖分析过程如图3所示。
使用CLCM时,需要以基于测试的场景文件作为输入。根据SCADE工具的定义,执行模型覆盖分析前,在软件测试阶段,测试人员根据软件需求编写的测试用例格式是不限的,但是最终必须使用基于TCL脚本格式的测试场景文件作为模型覆盖分析的输入。只需在测试环境中增加一个场景文件记录的功能,即可做到运行测试用例时,同时获取到用于覆盖分析的脚本文件,而不必再基于需求设计一次模型仿真用例。
为了保证覆盖分析的有效性,同时需要在宿主机环境下运行和目标机环境下一模一样的测试用例,并比对测试结果,其目的是确保生成的测试场景文件是有效的。接着分别在插完桩的代码和没插桩的代码中运行测试场景文件进行仿真,并对比输出结果,其目的是为了保证插完桩的模型生成代码是有效的。从中得到的覆盖结果即为SCADE模型生成代码的覆盖率。
2.3记录测试场景文件的宿主机环境设计
由于使用MTC工具对SCADE Suite模型生成代码进行结构覆盖的活动是在宿主机开展的,因此需要在宿主机环境获取覆盖结果,并且使得该结果是个有效的结果。一方面宿主机环境中执行测试用例使用要与目标机环境中相同的测试用例,需要满足宿主机中从用例设值到模型输入与目标机中一致;另一方面需要能在宿主机环境中获取到用于生成覆盖报告的场景文件。用于MTC的宿主机环境设计如下:
(1)将软件配置项中,真实的输入输出接口提炼出来,作为整个宿主机环境的输入输出。
例如,对于显示系统中的某个应用软件,其输入端有通用输入输出数据处理软件(COMMON IO),显示服务软件(A661 Server)。真实目标机环境中,在手写代码中将从COMMON IO接收到的数据转换为IO interface接口,从A661 Server接收的A661 Message数据通过UA Adaptor转换为A661 Inputs,然后在手写代码中使用IO Interface与A661 Inputs作为参数调用主模型Model Toplevel。如图4所示:
由于宿主机环境中没有真实的COMMON IO,可以开发一个用于向模型发送测试环境给出的数据激励的组件Model Input,这个组件嵌套在模型中可以模拟COMMON IO的功能。由于没有真实的A661 Server,可以开发一个仿真的A661 Server作为A661 Inputs的数据输入,这样就可实现宿主机环境与目标机环境的输入一致。
(2)在宿主机环境中添加能记录输入数据的代码。如果记录每个周期的所有数据,会导致记录下来的场景文件的规模巨大,只记录变更的数据是一个良好的解决方案。对于模拟的COMMON IO数据,在环境中的Model Input功能中增加自动记录所有变更的数据,而针对仿真A661 Server的A661 Inputs数据,可在环境中添加Record_InputA661模块子模型,在子模型中添加手写代码,记录A661 Inputs中变更数据。因此实现了宿主机环境与目标机环境输入一致的同时记录下了用于获取MTC覆盖的场景文件。如图5所示。
使用以上宿主机环境,在执行测试用例后,同时就可以获取到用于MLCM和CLCM输入的测试场景文件。
2.4 SCADE Display模型生成代码及Suite模型嵌入代码的结构覆盖方法
SCADE Suite中嵌入的手写代码和SCADE Display生成的代码都需要在宿主机中使用Testbed工具获取结构覆盖结果。
首先Testbed工具会使用配置好的插桩模板对源代码进行插桩,接着,根据插桩的代码生成覆盖结果输出文件后,将其和测试环境联合编译生成结构覆盖测试环境,在该环境中执行测试用例后获取符合格式要求的输出结果(exh文件),使用Testbed工具对该输出结果进行分析后即可得到相应代码的覆盖率。
需要注意的是,只需要对SCADE Display模型生成代码及Suite模型中嵌入手写代码需要进行插桩,同时,和MTC工具类似,在使用Testbed进行结构覆盖时,需要在宿主机环境下运行和目标机环境下一模一样的测试用例,并比对测试结果,其目的是为了保证获取覆盖结果的测试用例的有效性,Testbed工具的在宿主机的使用策略如图6所示:
2.5框架及接口手写代码的结构覆盖方法
由于在宿主机环境中,很难使框架及接口代码和实际项目中的完全一致,因此,这些代码只能使用传统的方式,即使用Testbed在目标机中获取结构覆盖结果。
在目标机中使用Testbed的原理和宿主机中类似,首先,对源代码进行插桩,接着在插桩后的代码中运行相应的测试用例,得到符合格式要求的输出结果(exh文件)后,使用Testbed工具对该输出结果进行分析后即可得到相应代码的覆盖率。
为了使获取覆盖结果的测试用例有效,在目标机中使用Testbed进行结构覆盖时,需要在插桩的代码中和没有插桩的代码中运行相同的测试用例,并比对结果。需要注意的是,只需要对框架及接口手写代码进行插桩,由于这部分代码一般不会很多,因此基本上不会有由于代码膨胀造成的目标机资源问题。同时,该段代码对应的需求也不会很多,只需要执行和该段代码对应需求相关的测试用例即可,这样就起到了节约资源的效果。Testbed工具在目标机中的使用策略如图7所示:
3结语
本文在总结了大规模复杂软件中,传统结构覆盖方法的局限性,并以基于SCADE模型开发的显示系统软件为例,提出了一套针对大规模复杂软件结构覆盖的方法。该方法解决了传统方法中环境不支持、代码可读性差、资源不够用和目标不满足的问题,为后续大规模复杂软件满足结构覆盖分析这一适航目标提供了借鉴的意义。
参考文献
[1]RTCA,Inc.Software considerations in airborne systems and equipment certification[S].RTCA,Inc,DO-178C,2011.
[2]尹伟,缪万胜,王念伟,等.大规模复杂系统的开放式软件架构研究[J].航空电子技术,2017,48(2):23-29.
[3]李红军,牟明,崔西宁.机载大规模复杂系统软件开发技术研究[J].现代电子技术,2019,42(5):111-114.
[4]陈福,牟明,戴小氐,等.机载大规模复杂软件开发及验证技术[J].电子科技,2016,29(3):190-193.
[5]黄荦,丁立冬.基于LDRA Testbed的民用机载软件结构覆盖率分析流程研究[J].航空标准化与质量,2014,2014(4):26-42.
[6]丁旭,崔吉岗,刘春裕.军用嵌入式软件结构覆盖测试技术[J].指挥控制与仿真,2008,30(3):120-122.
[7]张卫民,刘松毅.关键软件测试结构覆盖要求分析[J].测控技术,2008(27):329-333.
[8]张军才,王娟,潘卫.基于DO-178B的结构覆盖分析研究[J].航空计算技术,2011,41(4):67-69.
[9]左泽轩,薛战东.基于DO-178的机载软件结构覆盖分析[J].科技视界,2016,15(1):1-25.
[10]马金梭.基于模型的安全关键软件全覆盖测试方法的研究与实现[D].上海:上海交通大学,2011.
[11]赵飞,张杰.基于模型的FADEC软件结构覆盖率分析[J].航空计算技术,2017,47(2):93-96.
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!
文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/38800.html