MC/DC准则在嵌入式软件测试中的应用
2019-07-12陆云峰
安 媛,陆云峰
(1.国核自仪系统工程有限公司,上海 200241;2.上海申能崇明发电有限公司,上海 202155)
0 引言
随着核电仪控系统数字化程度的提升,应用于核电仪控系统的嵌入式软件向复杂化和集成化发展,并能实现硬件的功能。嵌入式软件在设计、编码后,要固化在存储芯片,或者在硬件板卡等硬件环境中才能看见,必须配备专门的开发工具和开发环境。
而嵌入式软件的安全性和可靠性要求比较高。为了保证系统的稳定性,避免由于其可能出现的失效而导致灾难性的后果,要求对嵌入式软件进行独立的验证和确认(independent verification and validation,IV&V)。
嵌入式软件IV&V过程中,有着严格的体系标准和验证流程。因此,在软件的各个生命周期内因地制宜地调整测试方法和策略,可提高和改善嵌入式软件的质量。
修正的条件/判定覆盖(modified condition decision coverage,MC/DC)准则是一种实用的软件结构覆盖率测试准则,由波音公司提出,并被RTAC/DO-178B(机载系统和设备合格审定中的软件)所采纳。其目前被广泛应用于嵌入式软件IV&V过程中。
1 嵌入式软件测试特点
嵌入式软件的主要特点是实时性、可移植性以及软硬件可裁剪;应用的硬件平台及操作系统具有多样性,开发工具昂贵,缺陷不容易修复等特点。
针对以上嵌入式软件特点,在IV&V的需求分析阶段、设计阶段、实现阶段以及验证阶段,需要采用不同的测试策略。本文主要采用的是静态代码分析和动态测试方法相结合的策略[1]。
静态测试时不需要运行软件,主要分为代码审查和静态代码分析,通过人工审查和测试工具检测相结合的方式,完成编码规范检查、语法和语义分析、数据流分析等。在需求、设计和实现阶段尽早地检查出错误,以减少整个项目的开发成本[2]。
动态测试时软件需要运行在目标环境中,分为黑盒测试和白盒测试两种测试类型。黑盒测试主要进行功能检测,功能全覆盖后利用白盒测试实现软件代码的覆盖测试,从而进一步提高软件的质量和可靠性。
覆盖测试贯穿于单元测试、软件集成测试、系统测试,通过构造测试实例,运行被测程序,检查运行结果与预期结果的差异,从而达到测试程序内部逻辑结构的目的[3]。
软件测试方法分类如图1所示。
图1 软件测试方法分类图
2 MC/DC的基本概念
在嵌入式软件的IV&V过程中需要进行两种覆盖验证,即需求覆盖和结构覆盖。通过需求覆盖,验证所有目标函数被正确地执行;通过结构覆盖,验证软件代码的可达性和充分性。
两种覆盖分析相辅相成,建成完备的IV&V体系,实现软件测试的严格性和完全性。条件判定语句由高安全性的实时嵌入式软件基本语句构成,用于实现各种逻辑控制与实时数据处理。条件判定语句占嵌入式软件代码的50%以上。实现条件判定覆盖是保证结构覆盖的基础[4]。
条件判定覆盖要求同时满足条件覆盖和判定覆盖。条件覆盖是指每个条件的任何可能取值至少执行一次。判定覆盖是指每个判定结果也要至少执行一次。但是,条件判定覆盖却忽略了两者组合的情况。
MC/DC修正的条件/判定覆盖是在条件判定覆盖的基础上,实现的一种优化结构覆盖准则。该准则要求代码中所有可能输入输出取值一次,每个条件必须产生所有可能的输出结果至少一次,并且每个判定中的每个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,从而使判定结果改变[5]。
条件判定语句由多个布尔表达式通过布尔操作符(如and,or,not等)组成。布尔表达式由关系操作符(如“>”,“<”,“=”等)构成。相同的条件在一个判定中出现多次,则每次出现均视为不同的条件。布尔表达式中最基本就是逻辑与操作符与逻辑或操作符,任何复杂的布尔表达式均可视为“and”和“or”最简布尔表达式的逻辑组合。
逻辑与布尔表达“A and B”中,A和B均为布尔变量,取值为{0,1},C = A and B的完备测试用例集。逻辑与测试集如表1所示。
表1 逻辑与测试集
{1,2}组测试用例中条件A的所有取值均出现一次,条件A在条件B不变的情况下独立地影响判定的结果。
{1,3}组测试用例中条件B的所有取值均出现一次,条件B在条件A不变的情况下独立地影响判定的结果。
因此,取交集{1,2,3}生成逻辑与的最小测试用例集。
逻辑或布尔表达 “A or B”中,A和B均为布尔变量,取值为{0,1},C = A or B的完备测试用例集。逻辑或测试集如表2所示。
{7,8}组测试用例中条件A的所有取值均出现一次,条件A在条件B不变的情况下独立地影响判定的结果。
{6,8}组测试用例中条件B的所有取值均出现一次,条件B在条件A不变的情况下独立地影响判定的结果。
因此,取交集{6,7,8}生成逻辑或的最小测试用例集。
表2 逻辑或测试集
最小测试集是实现MC/DC结构覆盖的基础,根据最小测试集建立最小测试集用例,从而完成MC/DC覆盖测试。
3 基于工具的MC/DC测试应用
随着嵌入式实时系统的广泛应用,MC/DC覆盖率指标被越来越多的监管机构与认证机构认可。很多软件自动化测试工具中都支持MC/DC覆盖率度量方法,如Cantata++,VectorCAST等。
VectorCAST是主要用于C/C++/Ada程序的自动化测试软件,可以应用于Windows和Linux等多种开发平台。最大程度的自动化和更适用于嵌入式环境,是该平台最大的特点和优势。使用VectorCAST辅助进行MC/DC覆盖测试用例设计和执行分析的流程步骤如下。
①在VectorCAST中创建工程环境,导入测试源码,完成语句和MC/DC插桩,分离出独立影响的布尔表达式。
②通过独立影响条件的真值表获取每个表达式的最小测试集,并结合需求完成测试用例设计。
③编写脚本,执行测试用例,分析测试结果,完成缺陷追踪。
④VectorCAST自动生成覆盖率报告。
以某核电仪控系统的RCS顶盖排气阀控制子系统为例,基于VectorCAST完成MC/DC覆盖测试,阀门分为电动阀、爆破阀、电磁阀以及调节阀。每类阀门的状态分为使能、挂牌、打开、关闭,并用黄、红、粉、绿四种颜色表示。
程序中关于阀门状态的表达式如下:
If (ValveA->Selected II ValveB->Selected)&& (ValveC->Selected II ValveC->Selected) then
ValveSetStatus(Open);
else
ValveSetStatus(Close);
简化为if (A or B) and (C or D) then
Statement1;
else
Statement2;
该表达式可以进一步简化为 Z = X and Y。其中:X=A or B,Y=C or D。
某核电仪控系统RCS顶盖排气阀控制子系统的逻辑结构如图2所示。
图2 顶盖排气阀控制子系统逻辑结构图
根据以上基本逻辑与或的分析,可获取独立影响结果的最小子集,即可得到MC/DC的最小测试用例集。
顶盖排气阀控制子系统最小测试集如表3所示。
表3 顶盖排气阀控制子系统最小测试集
{1,5}为条件A独立影响判定结果,{1,3}为条件B独立影响判定结果,{2,4}为条件C独立影响判定结果,{2,3}为条件D独立影响判定结果。即{1,2,3,4,5}5个测试用例生成的最小测试集就可以达到MC/DC的100%覆盖率。相比于16个测试用例完成的全代码覆盖,其数量减少了约70%,有效地提高了验证效率,节约了验证成本。
在VectorCAST建立测试工程,选择statement和MC/DC覆盖准则插桩源码,基于最小测试集方法创建相应的测试用例集,编译运行后可以得到MC/DC的覆盖率报告。
表4为顶盖排气阀系统相关测试模块的覆盖率信息,其中最后一列为MC/DC覆盖率情况。由此可见,最小测试集方法可以实现MC/DC的100%覆盖测试。
表4 MC/DC 覆盖率信息
4 结束语
MC/DC覆盖作为软件结构覆盖测试准则之一。在高安全性和高可靠性的嵌入式软件Level A认证过程中,DO-178B、IEC61508是强制要求遵守的标准。语句覆盖和MC/DC覆盖相结合,可以有效地检出软件错误,从而提高软件的安全等级。随着越来越多的国际认证机构对MC/DC覆盖的认可,MC/DC得到了广泛应用。