logo Parasoft 行业资讯(二) 我也要发布文档

如何获得安全关键系统的100%结构代码覆盖率?


许多软件开发和验证工程师并不真正理解为什么获得结构覆盖很重要。许多人这样做只是因为这是他们行业的功能标准所要求的,而不是认真对待。

ADAS这样的安全关键系统可以在没有司机的情况下运送乘客,使自动驾驶仪能够让人们在我们的天空中飞行,并通过医疗设备让病人活着。人们的生活依赖于这些系统。获得结构代码覆盖率至关重要。让我们来看看什么是结构性覆盖,以及它为什么重要的更多原因。

什么是结构覆盖?

简而言之,结构覆盖是为了确定系统是否经过充分测试而执行和记录的代码的标识。安全关键系统覆盖的彻底性取决于安全完整性等级(SIL)汽车工业中的ASIL航空电子设备中常用的开发保证等级(DAL)

在嵌入式系统中,这些通常被分解到代码语句、分支、修改的条件决定,你还可以钻研到更细的粒度,比如对象代码或汇编语言。

你可能会听到或读到其他类型的覆盖指标,比如函数、调用、循环、条件、跳转、决策等。但对于嵌入式安全关键型系统来说,你目前需要了解的是语句、分支、MC/DC和对象代码。

目前有一种趋势是采用多条件覆盖(MCC),它比MC/DC更彻底。MCC要求的测试用例数量要多得多-2,达到条件数的幂。其计算公式为 2C

报表和分支机构覆盖率

语句覆盖是最简单的工作,代表了程序中的每一行代码。然而,代码语句可以有不同程度的复杂性。例如,分支语句表示代码中的if then else条件。case或switch等语句被解释为分支。不过,如果你要获得分支的覆盖率,这意味着必须覆盖真和假决策路径的执行。

如何获得安全关键系统的100%结构代码覆盖率?

在关注更高的安全水平时,可能需要修改后的条件决定覆盖范围(MC/DC)。分支的复杂程度会越来越高,在一个决策中存在多个条件,而且每个条件都必须独立测试。

语句覆盖是最简单的工作,代表了程序中的每一行代码。然而,代码语句可以有不同程度的复杂性。例如,分支语句表示代码中的if then else条件。case或switch等语句被解释为分支。不过,如果你要获得分支的覆盖率,这意味着必须覆盖真和假决策路径的执行。

对于覆盖标准来说,这意味着决策中的每个条件都已被证明会独立影响该决策的结果。

同时,程序中的每一个决策中的条件都至少采取了一次所有可能的结果,程序中的每一个决策都至少采取了一次所有可能的结果。在下面有4个条件语句的例子中,有16个可能的测试用例。MC/DC在这个例子中只需要5个。取条件数加1。

如何获得安全关键系统的100%结构代码覆盖率?

对象代码覆盖率

对于最严格的安全关键型应用,如航空电子,工艺标准DO-178B/C Level A规定了对象代码覆盖。这是由于编译器或链接器会产生额外的代码,这些代码不能直接追溯到源代码语句。因此,必须进行汇编级覆盖。

想象一下,必须执行这项任务的严谨性和人力成本。幸运的是,有Parasoft ASMTools,一个关于获得对象代码覆盖的自动化解决方案。

如何获得安全关键系统的100%结构代码覆盖率?


申请Parasoft测试试用

获得代码覆盖范围

代码覆盖率往往是通过对代码进行检测来确定的。检测指的是在用户代码中加入额外的代码,以便在执行过程中确定该语句、分支或MC/CD是否被执行。

基于嵌入式目标或设备,覆盖数据可以存储在文件系统中,写入内存,或通过各种通信渠道,如串行端口、TCP/IP端口、USB甚至JTAG发送出去。

获得嵌入式安全和安全关键型系统的代码覆盖率

对于代码覆盖率的要求,比如规定的100%的结构、分支和MC/DC覆盖率,或者是可选的、个人想要的80%,有几种测试方法用来满足你的目标。最常见的方法。

  • 系统测试
  • 单元测试
  • 手动测试

综合这些不同做法的覆盖率指标是典型的。但代码覆盖率究竟如何确定呢?

系统测试的覆盖范围

通过系统测试获得代码覆盖率是一个很好的方法,可以确定是否已经进行了足够的测试。方法是运行所有的系统测试,然后检查代码中哪些部分没有被行使。

未执行的代码意味着可能需要新的测试用例来行使未被触及的代码,在这些代码中可能潜伏着缺陷,并有助于回答这样一个问题:我是否做了足够的测试?

当我在系统测试期间进行过代码覆盖率的测试时,平均得出的指标是60%的覆盖率。40%的未执行代码中的大部分是由于你的应用程序中的防御性代码。

还有你的编码准则规定的防御性代码,系统测试永远无法执行。由于这些原因,系统测试不能带你达到100%的结构代码覆盖率。你需要采用其他的测试方法,如手动和/或单元测试来让你达到100%。要知道,流程标准允许合并从各种测试方法获得的覆盖率指标。

单元测试的覆盖范围

如前所述,单元测试可以作为系统测试的补充方法,以获得100%的覆盖率。通过单元测试获得代码覆盖率是比较流行的方法之一,但它并不能暴露你是否对系统做了足够的测试,因为重点是在单元级(函数/程序)。

这里的目标是创建一组单元测试用例,在所需的覆盖率合规性需求(语句、分支和MC/DC)下行使整个单元,以达到该单个单元100%的覆盖率。每一个单元都要重复这样做,直到覆盖整个代码库。然而,要想从单元测试中获得最大的收益,不要只关注获得代码覆盖率。

为了帮助通过单元测试加快代码覆盖率,Parasoft C/C++test中存在可配置的自动测试用例生成功能。测试用例可以自动生成,以测试空指针、最小-中间-最大范围、边界值等的使用。这种自动化可以让你走得更远。在几分钟内,你将获得大量的代码覆盖率。

然而,与系统测试一样,由于使用防御性代码或形式化语言语义,获得100%的代码覆盖率是难以实现的。在单元的颗粒级别上,防御性代码可能以开关中的默认语句的形式出现。如果一个开关中的每一个可能的情况都被捕获,这就使得缺省语句无法到达。

申请Parasoft测试试用

那么,对于这些特殊情况,如何才能获得100%的保障呢?

答案是需要部署手动方法。用户可以通过使用调试器,修改调用栈,执行return 0;语句,将该语句标注或标注为覆盖。目视见证执行过程,至少要记录现在被认为是覆盖的文件名、代码行和代码语句。

这种通过手动/视觉检查和报告执行的覆盖可以用来补充通过单元测试捕获的覆盖。这两种覆盖报告的补充可以用来证明100%的结构代码覆盖。

如果系统测试覆盖发生了,并且要包括在内,则可以使用所有三个覆盖报告(系统、单元、手动)来显示和证明100%的覆盖率和合规性。

如何获得安全关键系统的100%结构代码覆盖率?

当标准基于您的SIL、ASIL或DAL级别时,可能需要执行不同级别的覆盖(声明、分支、MC/DC和目标代码)。幸运的是,Parasoft提供了自动化的软件测试解决方案,以及您在获得100%结构代码覆盖率时需要解决的方法。

了解如何为您的嵌入式项目利用代码分析技术。请点击下方图片观看视频。

如何获得安全关键系统的100%结构代码覆盖率?

【点击观看视频】