嵌入式软件测试浅谈

发布者:温馨家园最新更新时间:2011-02-23 来源: 电子工程专辑关键字:嵌入式软件  单元测试  Unit  Testing 手机看文章 扫描二维码
随时随地手机看文章
    嵌入式软件测试与普通软件测试的目的一样,都是为了发现软件缺陷,而后修正缺陷以提高软件的可靠性。嵌入式系统安全性的失效可能会导致灾难性后果,即使非安全性失效,由于其应用场合特殊也会导致重大经济损失。因此,往往嵌入式软件对可靠性的要求比普通软件高。这就要求对嵌入式软件进行严格的测试、确认和验证,以提高产品的可靠性。

    不过由于嵌入式软件的多样性,基于的操作系统,使用的开发环境,微控制器都是日益繁多,完整规范的测试实现起来比较困难,一般企业都是直接进行系统测试。单元测试,集成测试由于测试执行的运行环境建立困难,执行效率低下,或者维护困难就往往被忽略。

    实际上,只要时间上做好安排,确立测试方案,根据情况建立单元测试环境,还是可以顺利实施单元测试,尽早发现软件缺陷,整体上获得时效,提高了系统可靠性。文中笔者就根据多年工作实践,将嵌入式软件单元测试相关的一些经验与大家分享,同时抛砖引玉。

测试环境

    单元测试首先需要动态运行代码的环境,嵌入式软件开发环境往往是交叉开发环境,我们希望将代码移植到开发主机上运行(比如Windows系统),这样做有几个好处:

1 可以利用高速的主机提高代码运行效率;

2 有利于测试管理,便于测试用例输入和形成测试结果报表和维护;

3 充分利用Windows系统的测试工具,实现自动化测试。

    不过移植代码至Windows系统需要将嵌入式软件的API都移植到Windows,形成虚拟系统接口层,这种方法往往是长期使用这一嵌入式系统,一劳永逸的长远性方案。

    当然还可以通过购买使用一些商用的工具,比如CodeTest,VcTester,使用这些工具在嵌入式系统上直接开展单元测试工作。

    这两种方案对于一些中小企业来说,由于不愿投入这么大人力物力,不能建立长期有效的开发方案而无法实施。对于这种条件还可以采用一种投入较小的短时方案,直接在程序中加入测试代码,直接在目标板上运行查看结果,测试用例也可以直接在代码中,或者通过接口从主机获得测试输入及输出测试结果。这一方案对于测试硬件驱动也是相当适用的,比如测试某设备读写做了以下c语言代码(详见本刊网站):

    在实际平台上运行该代码执行测试,这种方法主要用于单元的功能测试。虽然需要在单元测试阶段编写额外的代码,但是由上面例子可见,被测单元接口定义清晰,测试代码很容易完成,至于测试用例的编写是无法避免的。正式发布代码时通过条件编译将这些代码屏蔽即可。

测试策略

    从测试效果上看,当然是花费越多的时间、人力,发现的问题越多,产品的质量控制得更好。但实际上,彻底做好软件单元测试几乎是不可能的,我们需要综合考虑成本和效率,这是实际产品开发中经常遇到的问题,都面对这样两难的境地——上市时间延误而没有及时占领市场;或是时间上抢先,不过测试不充分导致出厂的产品质量不高。如果测试时间不充足,如何在限定时间内更好地完成测试工作呢?

1 我们需要强调对隐藏缺陷多的模块进行测试:问题是怎么在测试计划之前确定哪些模块缺陷多,容易出错呢?根据经验,出错率大的地方往往是以下几种情况:

* 时间压力大的情况下完成的模块;

* 经验不足的员工编写的模块;

* 前期发现过大量bug的模块;

* 接口关系复杂的模块;

* 技术难度大,处于行业领先地位的模块;

* 从未做过测试或缺乏底层测试的模块。

2 对于重要的模块加强测试:“重要”这个概念在这里往往也不是轻易评估的,实际实施中应该需要测试评审小组商议决定。这里就根据经验列出以下几点作为参考:

* 和安全相关的模块,比如产生辐射,高温,高压等威胁人身安全的模块,这是最为关键的一点;

* 从经济利益角度考虑,出现故障将造成较大经济损失的模块;

* 从使用角度看,用户操作的模块优先级要高于服务操作模块,因为用户的优先级高于客服人员;

* 基本功能模块优先级高于扩展功能模块,试想基本功能都不能使用,那扩展功能岂不是空中楼阁;

* 执行概率高的模块,因为执行概率高的代码在运行中暴露缺陷的几率也大。[page]

编码注意事项

    以上是从测试角度讨论如何建立单元测试执行环境的几种方案和测试策略的制定,不过,为单元测试的实施奠定坚实的基础的还是良好的程序设计。接下来从代码编写角度列举提高嵌入式软件的可测性的几点经验教训:

1 与硬件设备操作相关的需要与硬件操作无关的代码分离,这样与硬件操作相关的驱动代码可以独立在目标板上测试,当然逻辑简单也可不作测试;大部分与硬件操作无关的代码就容易实现跨平台移植测试。

2 中断响应函数功能尽量简单,这是因为中断响应相对不好测试,如果代码复杂,也不易定位错误,因为很多的开发环境或操作系统难以支持中断响应函数的断点调试。

3 系统调用及操作系统相关的操作做到与应用层分离,可以通过中间函数实现,比如虚拟操作系统函数,这样跨平台移植测试的时候只需将这些中间层函数修改就可以实现。

4对数据类型的差异性也可通过宏定义来实现统一,对于库文件的差异也通过宏定义来实现上层代码的一致性。

5 使用静态代码检测工具,比如PC-Lint,以尽早发现代码缺陷。PC-Lint是在代码产生初期静态查找代码缺陷,更有利用错误定位和修改,因为软件开发阶段越早发现问题,解决问题花费的代价越小。因此,一般应该是静态检查通过后再实施动态测试。

嵌入式软件单元测试也是基于普通软件单元测试的理论,仍需遵守,以上是对嵌入式软件单元测试特别之处的经验总结,希望能对初涉嵌入式软件开发的朋友有所帮助,重视软件质量,提高嵌入式系统的可靠性。

void test_ xxx_driver (void) // 测试xxx驱动函数

{

typedef struct _TEST_CASE // 测试用例结构体

{

UINT8* pBuf; //读写缓冲区指针

int len; //读写数据长度

STATUS result; // 测试结果,OK或ERROR

} TESTCASE;

#define TEST_NUM 4 // 测试用例数

UINT8* rBuf;

TESTCASE testCase[TEST_NUM]={

{0,DATA_MAX_LEN+1,ERROR}, // DATA_MAX_LEN指允许读写的最大长度

{"a",1,OK},

{"12",2,OK},

{0,DATA_MAX_LEN,OK}

};

for (int i=0;i< TEST_NUM;i++)

{

if(write(testCase[i].pBuf,testCase[i].len) != testCase[i].result) // 写测试

LOG ("test write failed!");

if(read(rBuf,testCase[i].len) != testCase[i].result) // 读测试

LOG ("test read failed! ");

if(bcmp(testCase[i].pBuf,rBuf,testCase[i].len) != 0) // 比较读写数据

LOG ("compare data failed! ");

}

}

关键字:嵌入式软件  单元测试  Unit  Testing 引用地址:嵌入式软件测试浅谈

上一篇:我给塞班写的的墓志铭
下一篇:手机平板大融合 Android2.4八项特性预测

推荐阅读最新更新时间:2024-05-03 11:20

国家嵌入式软件产品监督检验中心筹建申请通过专家论证
    11月18日国家认监委会同工信部组织专家对我所关于“国家嵌入式软件产品质量监督检验中心”的筹建申请召开论证会。会议由国家认监委黎玉娥副处长主持,国家认监委实验室与检测监管部齐晓副主任、工信部科技司沙南生副司长、何小龙处长、安平副处长、广东省质量技术监督局梁洪荣副处长、广东省经济和信息化委员会江长爱副处长等领导、孙玉院士等5名专家以及我所陈立辉副所长、万举勇副总工程师、王韬处长和杨春晖主任等共25人出席了本次会议。      陈立辉副所长首先对与会领导和专家的到来表示欢迎和感谢,指出我所在软件测试特别是嵌入式软件测试方面经过十多年的发展,已具备了建立国家嵌入式软件产品质量监督检验中心的良好基础。沙南生副司长在讲话中说,部推荐五
[手机便携]
嵌入式软件开发催化32位MCU需求
以目前趋势来说,8位MCU将会着重于「简单控制」应用上。但因产品应用所需之性能再提升,或是一些新应用所产生之新需求,32位MCU将会是最佳选择。其主要因素有二: 一, 因应用的性能需求再提升,而选择32位MCU: 例如,较大屏幕尺寸的多指触控应用,需要一个快速I/O接口从触控屏上来取得大量触控数据,进行实时讯号处理并计算多指坐标, 此时即需要一个高性能且有快速接口的32-bitMCU核心来处理大量且快速进入之数据。 二, 因性价比,而选择32位MCU: 现有的32位MCU价格已不再高不可攀,而是趋近于8位或16位的价格。当我们在选择下一世代 MCU平台或是 新应用的MCU时,性能、价格、开发工具与产品的生命周期将
[工业控制]
AURIX™嵌入式软件增加了符合ASIL D和SIL-2标准的驱动程序,以支持AUTOSARv4.4.0
英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)通过在现有的AUTOSARv4.2.2 MCAL基础上增加对AUTOSARv4.4.0的支持,进一步扩展其AURIX™ TC3xx MCAL。这将加快OEM厂商的软件开发。针对ASIL D应用,MC-ISAR TC3xx路线图已更新,以提供符合ASIL D标准的驱动程序。通过即将推出的维护版2.25.0,该驱动程序将包含符合ASIL D标准的软件产品。2.30.0版本将提供对IEC 61508 SIL-2的支持。最新版本面向各个汽车领域的AUTOSAR应用,包括 发动机 、底盘、安全和车身,以及商业农用车、工业和船舶应用。 MC-ISAR AS440 EX
[汽车电子]
嵌入式软件开发流程及中断调试方法
参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。 在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。 对后四种文件的理解很重要,其作用解释如下。 (1)链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程
[单片机]
嵌入式软件的覆盖测试
摘要:覆盖测试是验证软件功能结构正确性以及查找问题的非常重要的方法和手段,它要借助一定的工具才能取得较好的效果,满足软件在质量和时间上的双重要求(纯粹的人工测试工作量大、不方便、周期长)。如何利用好这方面比较成熟的工具,对其机理的研究及适应性改造是很重要。本文着重描述这类工具的工作机理,以及对嵌入式软件测试的特殊要求,并以对自主知识产权嵌入式操作系统的测试为例进行说明。 关键词:嵌入式操作系统 覆盖测试 软件测试工具 1 概述 软件测试是很广的概念。从其贯穿软件生命周期全过程来看,测试可分为模块测试、集成测试、系统测试等阶段。测试还可分为静态检查和动态运行测试两大类。在动态运行测试中,又可有基于程序结构的白盒测试(或称为覆盖
[嵌入式]
Mentor第二代AMD嵌入式R系列APU嵌入式软件产品上市
2014年5月20日,俄勒冈州威尔逊维尔——Mentor Graphics(NASDAQ:MENT)今天宣布针对最新第二代AMD嵌入式R系列APU(此前代号为:“白头鹰”)进行软件开发的Mentor®嵌入式软件已上市。作为Linux Foundation Yocto项目的金牌会员,AMD和Mentor Graphics就向嵌入式开发人员提供全面的嵌入式Linux®和开发工具解决方案事宜签订了多年协议。 嵌入式开发人员通过下载最新第二代AMD嵌入式R系列APU专用Mentor Embedded Linux Lite和Sourcery™ CodeBench Lite产品就能立即进行评估、原型设计及开发工作。此外,那些需要支持、
[嵌入式]
小广播
最新手机便携文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved