浅议嵌入式软件覆盖率测试

2023-05-15 10:34:21 digiproto

01


嵌入式开发的现状与难点

随着现代信息技术与软硬件技术的快速发展,嵌入式系统的功能日益强大,嵌入式设备和软件应用领域越来越宽泛。近年来,嵌入式软件代码量呈爆炸式增长,对测试的要求越来越高,尤其是涉及防务、航空、汽车等安全关键领域。

image (3).png

▲图1:近20年车辆代码增幅


更加全面、系统的测试方法是必不可少的。更好的测试方法可以:

检验嵌入式软件是否满足需求;

检验预期结果与实际结果之间的差别;

保障软件质量。


嵌入式软件开发与通用软件开发的不同之处,在于嵌入式软件是运行在特定的目标环境中,用以实现某种特定功能。此外,嵌入式系统的内存、外设接口等资源一般都非常有限,但其在实时性方面的要求又比较高,嵌入式软件开发便因此受到相应限制。


嵌入式软件一般使用交叉开发模式:

image (2).png

▲图2:嵌入式交叉编译过程


在宿主机上完成软件的编译、链接并定址后,让可执行文件在真实环境即目标机上运行。由于运行环境和开发环境不同,嵌入式软件需要先进行固化,再放入运行环境进行测试。由于接收到的外部设备信号存在随机性,软件测试的可控性无法保证,测试难度陡然增加。但软件测试对于开发可靠的系统和软件必不可少,只有经过大量的测试,才能更好地了解软件。


02


测试方法

软件测试有白盒测试、黑盒测试等方法,其中白盒测试中的代码覆盖率测试能够较好地评价被测代码的质量,进而间接评价产品代码的质量。一般而言,代码覆盖率越高,出现未检测到的错误的概率就越低。代码覆盖率测试中最常用的测量方法包括语句覆盖、分支覆盖、条件覆盖、修订条件/判定覆盖等。


语句覆盖:最常用的覆盖率测试方法。

语句覆盖通常用于衡量程序运行的语句执行情况,但只能检测被测代码中的可执行语句(指被编译器解释并编译成机器可以理解的文件的语句,不包括注释等其他内容)是否至少被执行一次。语句覆盖的局限性在于其无法衡量代码中各种分支是否均被执行,所以即使语句覆盖的覆盖率为100%,也仍然会有潜在缺陷。


分支覆盖:用于衡量程序中的每一个分支是否都被执行过一次,即程序中每一个判断的取真分支和取假分支至少经历一次执行。


条件覆盖:用于衡量程序中有多个判定条件时,是否每一个条件都被覆盖。条件覆盖与分支覆盖的区别在于,当存在多个分支的判断条件时,例如满足a>10或a<5都能执行分支1,那么分支覆盖只要设计满足a>10和a<5其中一个条件的用例即可,而条件覆盖则要设计两个用例,一个满足a>10,一个满足a<5。


修订条件/判定覆盖:程序中每一个进入点及结束点都执行过一次,每一个判断的所有条件的所有可能结果都至少出现一次,而每一个条件都可以独立的影响判断的结果。


例:一个判断的条件为a>0||b>0&&c>0,则可以设计下表所示的测试用例。对于a:用例1,3中,a的值会独立影响判断结果,即a为真,则该用例判断条件结果为真,且用例包含判断条件结果为真(用例1)和为假(用例3)两种情况;b,c同理。

WX20220511-170637@2x.png

▲图 3:修订条件/判定覆盖测试用例示例


03


测试环境

嵌入式软件通常需要在特定的仿真测试环境中进行测试。仿真测试环境主要分为全实物仿真(目标机仿真)环境、半实物仿真(硬件仿真)环境、全数字仿真环境。


全实物仿真环境:建立真实的嵌入式环境并与外围物理设备相连接,形成闭环测试。该环境下测试所得结果的真实性最强,但是构造和使用的成本最为昂贵,可控行也比较差,难以进行数据收集和故障重现。一旦出现故障,很有可能会损害外部设备甚至整个物理环境,造成巨大的财产、人员损失。


半实物仿真环境:在目标机上测试软件,用仿真器模拟外部环境,以提供激励信息和接收反馈信息。该环境下测试的可靠性较强,虽然构造和使用的成本也比较高,但其可控性相对全实物环境较强,能收集到大部分数据,故障重现相对较容易,也能实现自动化测试。但是半实物仿真每次修改程序后,都需要经过重新固化才能运行,且需要在外设仿真上耗费较高的成本和较长的周期,使用时还会受到目标机限制,本身也可能会存在缺陷,例如出现难以判断究竟是硬件问题还是软件问题的情况。


全数字仿真环境:用软件来仿真嵌入式环境和外围物理设备。在全数字仿真环境下,测试的可靠性较好,构造和使用的成本相对其他两种而言也较少,并具有较好地收集数据、更容易地进行故障重现、可控性较强、更好地支持测试用例的加载和软件的闭环运行以及实现自动化测试等优点。


对比三种测试环境,可以看出通过搭建全数字仿真环境来进行测试无疑是更高效和低成本的方式。全数字仿真环境可以较好地解决传统插桩测试导致的代码膨胀和嵌入式系统资源有限导致的测试难度加大的问题,还可脱离目标环境在宿主机进行测试。测试人员可以在嵌入式软件开发前期就介入测试,不会受到硬件资源短缺、环境搭建艰苦等限制,而是可以直接利用宿主机上的工具与资源,尽早发现和定位软件缺陷,在降低开发的成本和风险的同时,加快软件开发进度。


04


全数字仿真平台SkyEye

SkyEye天目全数字实时仿真平台,可以支持零插桩的非侵入式代码覆盖率统计并生成报告。SkyEye可以在宿主机上控制虚拟目标机的运行,包括启动、暂停、停止和重启,也可以进行单步运行和查看某个时刻寄存器和内存的数据。开发人员还可以进行修改寄存器数据模拟故障注入、设置断点及性能调试等操作。

image (4).png

▲图4 SkyEye覆盖率运行结果



除了支持主流的芯片和外设,SKyEye也可以通过外设建模和定制开发实现对定制芯片和外设仿真的支持。


更多SkyEye相关内容,欢迎点击查看详情或访问www.digiproto.com进行了解!


参考文献

[1]. 《Measuring Code Coverage on an Embedded Target with Highly Limited Resources》

[2]. 《全数字仿真环境下嵌入式软件测试技术研究》


首页
产品
新闻
联系