功能安全温度变送器的单元测试分析

2015-01-13 04:24蔡福全孙京诰
化工自动化及仪表 2015年7期
关键词:单元测试断线测试用例

蔡福全 孙京诰

(华东理工大学化工过程先进控制和优化技术教育部重点实验室,上海 200237)

随着社会对功能安全领域的日益关注,与之相关的软件测试技术也得到了迅速发展。单元测试作为软件测试过程中的第一阶段,自然占据着十分重要的地位[1]。单元测试以具体的程序模块为研究对象,设计合理的单元测试用例[2]来提升软件的质量。在功能安全领域,在遵循安全标准的前提下,通过单元测试,验证具体的软件模块设计是否符合安全完整性等级要求。在整个验证过程中,静态与动态测试方法的选择和过程分析是十分重要的研究课题。

功能安全温度变送器的软件开发过程需要遵循IEC61508-3中软件开发的要求,整个过程遵循软件安全完整性开发周期,即V模型的要求。V模型中包含两个部分,一个是软件的设计,另一个是软件的验证。

软件设计主要包括软件安全需求规范、软件结构设计、软件系统设计、模块设计和编码。软件的验证主要包含模型测试、集成测试、硬件与软件的集成测试和最终的确认测试。

笔者主要研究验证过程中的模块测试,即功能安全温度变送器软件设计中功能模块的单元测试研究。采用手动结合测试工作的方法,测试工具采用Parasoft C++test。

2 功能安全温度变送器的模块单元测试要求和策略

整个功能安全温度变送器的软件设计中,MSP430是数据处理单元的核心,软件主要功能模块分为主程序模块、键盘处理模块、显示模块、AD7794驱动模块、ADS1110采样模块、AD421转换模块、数据转换模块、Flash读写模块、配置模块和诊断模块。整个温度变送器的软件设计需要达到安全完整性等级SIL3,其测试工作应该包含以下技术要求:

a. 对软件单元进行动态分析与测试之前,要求进行静态代码分析;

b. 对软件设计中相关文档规定的软件单元的功能、性能及接口等应逐项进行测试,确保其运行结果满足文档中的相关要求;

c. 至少设计一个正常测试用例和一个被认可的异常测试用例去覆盖每个程序单元的软件特性;

d. 关于测试用例的设计,其输入至少要包含有效等价类值、无效等价类值和边界数据值;

e. 利用白盒测试原理,分析具体单元函数的特性,设计相关测试用例,检验每个单元函数的运行特性,确保行覆盖率、语句覆盖率、基本块覆盖率、判定覆盖率、简单条件覆盖率和修改条件-判定覆盖率能够达到100%

3 模块单元的静态测试与结果

静态测试[3]是指分析或者检查软件程序代码的结构、逻辑及语法等的一种测试方式,而不是运行待检测程序的方式。在测试过程中,需要通过人工对软件的需求说明、概要设计文档和程序源代码进行分析,找出其中的不足,例如程序中语句的结构不合理、逻辑混乱、参数使用不合理及指针指向错误等。本次静态测试通过人工结合Parasoft C++test测试软件来实现。温度变送器的软件静态测试主要针对程序代码进行分析,测试步骤如下:

a. 启动C++test,选择保存工程的路径,打开C++test测试工具;

b. 新建工程,选中IAR MSP430工程,将被测软件(即功能安全变送器软件)导入到该工程;

c. 配置C++test测试条件,按照C++test工具的使用要求定义CRules静态测试条件,其规则包含BUG自动侦测、异常处理检查、初始化检查、MISRA C、MISRA C 2004及内存资源管理等;

d. 选中被测工程,执行配置好的CRules测试,进行静态检测,记录测试结果。

通过测试,温度变送器的软件代码符合各类规则的要求,结果如图1所示。

图1 静态测试结果

4 模块单元的动态测试与结果

4.1 测试模型

图2所示为单元动态测试模型。

测试模型的核心对象为被测模块,笔者研究的被测模块指的是软件设计中每个功能模块中的每个具体函数,即单元函数。测试用例根据单元函数的要求,利用白盒测试原理[4]进行设计,用于检测被测单元函数的完整性。在整个测试模型的设计中,需要为每个被测模块开发驱动模块和桩模块。驱动模块在整个单元测试模型中起桥梁作用,是一个将测试用例输入被测模块使之整体运行并且能够输出测试结果的主程序。桩模块的作用是代替那些隶属于被测模块函数的调用函数。

4.2 测试案例分析

4.2.1单元函数动态分析

以诊断函数中的传感器热电阻两线制型号断线诊断为例,论述单元测试方法的具体应用和对断线诊断函数的动态测试分析,图3为传感器断线诊断的程序流程。

图3 热电阻二线制断线诊断函数流程

如图3所示,变量Sensor_type用来判断传感器的类型,当其采样值位于10~11之间时,可判断传感器类型为热电阻RTD型,然后使用变量(*ptrConfig).Channel.Sensor.Connection判定几线制,其值为2U时表示二线制连接方式。最后根据P1IN的采样值判定是否存在断线故障,二线制断线口用A、B表示,分别对应硬件接口P1.3、P1.1,断线情况见表1。

表1 P1IN数值及其含义

根据黑盒测试中的边界值分析法与白盒测试中的逻辑覆盖测试原理对传感器断线诊断模块进行案例设计。函数中涉及到Sensor_type、P1IN和(*ptrConfig).Channel.Sensor.Connection3个变量采样值,设计测试案例对这3个变量进行赋值。

根据边界值分析原理和源程序,Sensor_type取值为9、10、11、12,同时这些值也满足白盒测试逻辑覆盖原理中的判定-条件覆盖原理,包括了判定覆盖和条件覆盖。断线诊断中,判定条件中“(P1IN & 0x0002)==0x00U”,则P1IN取值0x0000U,为了满足条件覆盖率达到100%,该情况下还要考虑其不等于0x0000U的情况,则P1IN可取值0x0008U。

传感器断线诊断模块的测试用例及其功能测试的输出结果见表2,测试覆盖率的结果如图4所示。

表2 断线诊断模块测试用例及其功能输出结果

图4 传感器断线诊断模块测试覆盖率

4.2.2插桩技术的使用

在测试具体的单元函数时,常常需要在原来的程序中插入一些打印语句,然后在执行程序时,能够打印出最为关心的信息,进一步通过这些信息了解执行过程中的一些动态特性。研究中,笔者将桩函数用作替代调用模块及硬件设备读取采用值等,减少了大量的I/O操作[5,6],插桩原理如图5所示。

以AD信号读取采样值模块函数为例,论述桩函数的使用情况。如图6所示,流程图中存在两个调用其他函数的命令,一个为读寄存器命令,一个为读寄存器的值。单元测试中,最小单元函数为被测对象,不与任何硬件设备连接。在该情况下,就无法正常按照程序流程读取相关采样值,这里的调用函数被如图7所示的桩函数取代。图中所示的桩函数在程序运行中取代了调用函数,并且将调用函数的返回值设置为0,因此最后的返回值也为0。接下来按照正常的动态分析完成测试工作。

图5 插桩原理

图6 AD信号读取采样值模块流程

图7 AD779X_ReadADSample测试桩函数

5 结束语

单元测试在功能安全验证中占据很重要的位置,需要集合整体的软件设计对其中每个单元模块的程序进行测试分析和探讨。通过测试找出软件程序在结构及功能等方面存在的问题,使其符合功能安全完整性等级要求。笔者认为在功能安全领域的从业者,应该不断完善单元测试在具体产品中的测试策略,如动态测试的用例设计,使设计出来的产品更好地符合功能安全的要求。

[1] 董威.单元测试及测试工具的研究与应用[J].微型电脑应用,2008,24(5):24~26,23,5.

[2] 魏银英,杨苗.一种基于cantata的单元测试用例设计方法[J].电子世界,2014,(7):119.

[3] Larson E.SUDS:An Infrastructure for Creating Dynamic Software Defect Detection Tools[J].Automated Software Engineering,2010,17(3):301~346.

[4] 王敏,陈少敏,陈亚光,等.基本路径测试用例设计算法[J].计算机应用,2013,33(11):3262~3266.

[5] Chen T Y,Kuo F C, Merkel R.On the Statistical Properties of Testing Effectiveness Measures[J].Journal of Systems and Software,2006,79(5):591~601.

[6] 张荣,王曙燕.基于插桩技术的动态测试研究与实现[J].现代电子技术,2011,34(4):50~52,55.

猜你喜欢
单元测试断线测试用例
断线的珍珠
基于SmartUnit的安全通信系统单元测试用例自动生成
归来吧!精灵(连载八)
一起10kV开关控制回路断线故障分析及回路完善
断线的风筝
基于需求模型的航天软件测试用例生成方法
基于依赖结构的测试用例优先级技术
一年级上册第五单元测试
一年级上册一、二单元测试
第五单元测试卷