Want to see Parasoft in action? Sign up for our Monthly Demos! See Demos & Events >>

X

代码覆盖率:提升测试的置信度

Parasoft的代码覆盖解决方案暴露了您的应用程序中已经测试和尚未测试的代码。用户可以在目标硬件或主机环境上进行不同层次的代码测试,例如覆盖率,功能或单元测试以及整个文件或整个应用程序。而且,您可以从各种测试方法中汇总覆盖率,如单元测试和系统测试。

什么是代码覆盖率?

结构性代码覆盖率是指识别已经执行并记录的代码,以确定系统是否已被充分测试。代码覆盖率表示应用程序的源代码被所有测试实践所验证的程度,包括单元测试、手动测试、自动化功能测试等。这使得覆盖率指标更加准确,同时暴露出应用程序的死代码、未测试或测试不足的部分。

因此,应用程序的覆盖率对软件风险提供了极其强大的影响力。在大多数组织中,单元测试是驱动覆盖率的主要手段。虽然单元测试是一种有价值的测试实践,它还能带来一些面向过程的好处,但它在创建、管理和维护测试的专业知识和时间方面也很昂贵。

代码覆盖率可以作为持续集成(CI)过程的一部分加以利用,也可以作为开发人员桌面工作流程的一部分。您还可以对源代码进行高级分析,并根据开发人员所做的代码修改来确定哪些单元测试需要重新运行。

这些代码覆盖工具在安全和安保关键应用的嵌入式开发行业中特别有用,因为软件系统不能出现故障,否则就会导致重大事故隐患。

安全关键系统中覆盖的彻底性取决于各行业使用的应用安全完整性等级(SIL或ASIL)指标和航空电子学中常用的开发保证等级(DAL)。彻底性指的是代码中的结构元素。这些通常被细分为代码语句、分支、判定,通过Parasoft,您还可以深入到更精细的覆盖粒度,如目标代码或汇编语言。

代码覆盖率的优势

测试是否完成?

代码覆盖率可以帮助衡量测试的完整性,它保证您已经通过执行检查了您的应用程序中的每一行代码。利用静态分析、单元测试、系统测试、性能测试等测试方法的组合,是确保代码质量的最佳方式。

满足代码覆盖率合规性需求

满足功能安全标准的代码覆盖率要求,如DO-178B/C、ISO 26262、IEC 62304、IEC 61508和EN 50128。代码覆盖率要求通过暴露未测试的代码和消除缺陷来帮助确保代码的安全性、保障性和可靠性。

减少缺陷的成本

在生产中发现的代码缺陷是最昂贵的。通过在发布应用程序之前突出显示未经测试的代码,防止问题的发生。这可以在开发人员的工作站上进行,或者作为持续集成(CI)管道的一部分自动进行。

执行汇编/对象代码验证

对于绝对最严格的安全关键代码覆盖要求,如DO-178C A级,Parasoft提供汇编级的代码覆盖。通过我们的自动化解决方案,可以节省数天甚至数周的劳动密集型、易出错的人工工作。

在主机和目标硬件上实现代码覆盖

彻底测试嵌入式安全和安全关键型应用需要在目标硬件和主机环境中进行测试。Parasoft为两者提供了代码工具,以捕获和报告语句、分支、MC/DC等的结构性代码覆盖率。

实现100%的代码覆盖率

尽管您一般可以通过单元测试实现100%的结构性代码覆盖目标,但通过汇总从系统测试中自动获得的代码覆盖结果来节省时间和精力。然后用单元测试完成剩余的未覆盖的代码。

结构性代码覆盖工具

部署Parasoft的产品套件,对用C、C++、Java、C#和VB.NET编写的应用程序进行结构化代码覆盖。

代码覆盖率的最佳实践

为了了解应用程序中剩余的风险级别,获取测试期间执行的代码数量是一个强大的度量。以下是一些可以遵循的最佳实践。

CI 管道

将测试和代码覆盖集成到您的构建系统中,将提高效率,促进协作,并在您的整个软件开发生命周期中提供更大的可见性。

系统测试

利用您的系统测试来获得代码覆盖率,并识别可能暴露隐藏bug的缺失测试。

覆盖率指导助手

使用覆盖率指导助手可以确定测试用例中所需的所有输入值和前提条件来覆盖难以分析的语句、分支或MC/CD行代码而浪费时间。

总覆盖率

使用您必须执行的各种测试方法来加速您的覆盖率需求。聚合覆盖率可以从系统、集成、单元和手动测试中获得。

自动生成测试用例

Parasoft解决方案可以自动分析和生成单元测试用例,以清除空指针问题、边界值条件、除零和许多其他类型的缺陷。此外,这些测试用例可以产生代码覆盖率,在某些情况下,可以使您的结构化代码覆盖率达到90%。

部分插桩

代码插桩会导致代码膨胀,而代码大小的增加可能会影响将代码加载到内存受限的目标硬件上进行测试的能力。每次测试代码的一部分,运行测试,并从每次运行中合并覆盖率指标。

覆盖率调试

如果您要满足结构代码覆盖率100%,但防守只会执行的代码在系统进入一个错误的状态,可能需要几周,几个月,甚至几年,使用调试器来模拟所需的条件和执行的代码执行检查/覆盖。

死代码

如果代码是因为没有执行路径而被发现的,出于安全性考虑,请确保将其删除。

如何开始使用代码覆盖率

要开始收集代码覆盖率,请熟悉您的覆盖率需求。也许您的行业和应用程序类型不需要获得任何覆盖率指标,但是您想要确保或 提高代码质量,因此您可以选择75%为初始目标。

如用于航空电子设备的DO-178C或用于汽车的ISO 26262或用于医疗的IEC 62304,则需要确定是否需要获得100%的代码覆盖率或建议获得其他百分比的代码覆盖率。同样,知道您需要满足什么结构代码覆盖类型。它可以是函数、行、语句、块、调用、路径、决策、简单条件、MC/DC、对象/程序集或这些的组合。

获得代码覆盖率的最简单的方法之一是在实现期间,当工程师创建单元测试用例来测试他们的代码时。像Parasoft C/C++test这样的解决方案可以直接集成到IDE中,并提供此功能,为用户提供非常短的学习曲线。这些单元测试用例可以被QA团队重用,用于回归测试或作为自动化CI管道工作流中的构建过程的一部分。

请注意,插桩代码可能会导致代码膨胀,如果在目标硬件上进行测试,则可能需要执行部分插桩。插装代码也可能会改变执行的性能,所以您可能想要熟悉各种可用的优化特性。

 

收集和报告代码覆盖率度量是至关重要的。有几种方法取决于您的应用程序是运行在嵌入式目标上,还是运行在资源充足的系统或服务器上。

最终,您将获得或合并覆盖率数据,以获得完整的代码覆盖率指标。覆盖率报告可以从您的IDE中生成,并且可以导出到Parasoft的报告和分析仪表板DTP。在DTP中,用户可以直观地检查高风险区域,了解下一步应该处理什么,并生成合规性和审计报告。

代码覆盖率示例

在IDE和DTP仪表板报告分析解决方案中覆盖Parasoft代码。

Screen capture of Parasoft Report Center Complete Code Coverage dashboard.

 

为什么选择Parasoft?

Parasoft的代码覆盖率解决方案通过关联测试和结构化代码覆盖率结果,提供关于测试过程完整性和彻彻性的关键反馈。通过我们对所有重要类型的代码覆盖(函数、调用、行、语句、块、路径、决策、简单条件和MC/DC)的支持,您可以使用这些结果或度量来评估单元、集成和系统级测试的完整性,包括对象/汇编覆盖。

覆盖率结果可以直接在IDE中获得,在源代码编辑器中有方便的视图和高亮显示,以及静态HTML或pdf报告的形式,以及通过Parasoft的集中报告仪表板的动态报告。

用户可以监控在桌面本地执行的应用程序、使用模拟器的跨平台应用程序,或在真实的嵌入式硬件上执行的应用程序。C/C++test的覆盖模块进行了优化,以最小化对执行性能和测试二进制内存占用的影响,这使得它适合用于高端的、基于服务器的应用程序,以及基于16位微控制器的非常有限的系统。

当与Parasoft的过程智能引擎连接时,用户可以从测试影响分析中受益。对于每一个执行的测试,包括手动的、系统级的,或者基于UI的,测试不仅记录了测试/失败和结果,还记录了它们对代码库的覆盖影响。

每个附加的测试都覆盖在这个现有的信息上,创建测试成功和覆盖率的完整画面。当代码被更改时,其影响在底层记录上是清晰可见的,突出显示现在失败的覆盖率测试或现在未测试的代码。以不同程度的细节提出这个信息,允许开发人员和测试人员快速地识别出在下一次测试运行中需要修改/修正什么。

使用Parasoft,团队可以专注于活跃开发领域的代码覆盖率,而不是整个代码库,在使用遗留代码库时,这可能会产生特别大的问题。而不是仅仅试图达到整个代码库的覆盖率数字,Parasoft帮助您确定代码中发生变化的部分。

Parasoft的报告仪表板将来自C/C++test的数据与代码库中观察到的变化相关联,从而使开发团队专注于为那些特定的、修改过的代码库部分实现更高级别的代码覆盖率。使用Parasoft,您可以通过有效地管理更改本身来最小化更改的影响。

常见问题

结构代码覆盖是为了确定系统是否被充分测试而被执行和记录的代码的识别。代码覆盖率表示应用程序的源代码在所有测试实践中被执行的程度,包括单元测试、手动测试、自动化功能测试等等。在暴露死代码、未测试或未测试的应用程序部分时,这可以实现更准确的质量和覆盖率度量。因此,应用程序覆盖为风险提供了非常强大的洞察力。在大多数组织中,单元测试是驱动覆盖率的主要工具。

代码覆盖率应该由您的覆盖率需求或目标来决定。您是否需要满足要求或建议100%覆盖率的安全功能标准(用于航空电子设备的Do – 178c或用于汽车的ISO 26262,或用于医疗的IEC 62304) ?或者您可能只是想提高代码质量,所以60%可能是您的初始目标。同样,确定您需要满足什么结构代码覆盖类型。它可以是调用、行、语句、块、函数、路径、决策、简单条件、MC/DC、对象/程序集或这些的组合。

我们建议至少达到60%的代码覆盖率,这应该很容易打到。这将给您一些安全保障,但知道40%的代码没有经过测试可能会让导致程序有问题。

有些人建议70-80%,但是确定您是否需要增加覆盖率的最好方法是基于已识别的缺陷的数量。如果这是一个很高的数字,那么代码质量就是一个问题,我们建议增加代码覆盖率。要知道,即使100%的代码覆盖率,也不能保证所有的缺陷都被识别出来。它只是降低了风险。

是的,获得100%的代码覆盖率是可能的。您可以通过聚合各种测试方法和使用调试器观察代码执行来实现这一点。例如,单元测试可以使您非常接近100%的目标,但是对于需要非常特定的环境来执行的代码行,例如防御代码,可能需要几周、几个月、几年,或者您可能永远无法达到那个事件。如果您的覆盖率工具没有提供一种方法来达到100%的代码覆盖率,您可以使用您的调试器,在某些情况下,编辑调用堆栈,并通过可视化检查逐步检查未覆盖的代码。

知道您的测试没有遗漏任何未测试的代码是您的信号。然而,您的代码覆盖率分析目标应该基于任何遵从性需求或您组织提高代码质量的目标。如果需求是100%的声明覆盖、分支覆盖和MC/DC覆盖,那么这就是您的目标。当您已经测试了所有的代码行,并且达到了合同要求的覆盖率百分比时,那么您就完成了。请记住,开源测试不像专业开发的测试工具那样准确或可靠,因此您需要使用经过认证的工具,比如Parasoft提供的工具。

绝对的!Parasoft的测试自动化解决方案已经将集成构建到Azure管道中,并与GitHub、GitLab、Jira等其他工具一起,这些工具可以自动化持续集成和持续交付工作流程。这些集成提供了灵活性,比如使用命令行API,不仅可以实现代码覆盖率测试的自动化,还可以通过调用所有测试套件实现所有软件测试的自动化。