持续交付2.0

智能汽车软件:最低可接受的代码覆盖率标准是多少

Image

注:本文只能说是一份调研综述,而并非一个工业标准,仅供参考。
       从本文的行文中,可以推断出:作者认为代码覆盖率的工作是测试人员的工作。

1

引言

对于大多数具有覆盖率指标的项目来说,70-80% 的代码覆盖率是系统测试的合理目标。而对于那些有高可测试性或失败成本高的项目来说,应该使用更高的目标。单元测试的最低代码覆盖率可能是 80~90%。

2

介绍

实际项目的经验研究发现,将代码覆盖率提高到 70-80% 以上,是比较耗时的工作。你的目标应取决于项目的风险评估和经济状况。请考虑以下因素。

  • 故障成本。对于安全关键系统或故障成本较高的系统,例如医疗或汽车行业的产品或广泛部署的产品,请提高您的目标。

  • 资源。如果测试人员人手不足或培训不足,请降低目标。如果测试人员不熟悉应用程序,即使他们覆盖了相关代码,也可能无法识别故障。

  • 可测试的设计。如果您的系统有特殊的测试规定,例如绕过用户界面直接访问内部功能的方法,请提高您的目标。

  • 开发周期状态。如果您维护的是原有系统,而原来的设计工程师已经不在,那么请降低目标。

许多项目没有设定特定的最低代码覆盖率要求。相反,他们使用代码覆盖率分析只是为了节省时间。测量代码覆盖率可以快速找到测试规划期间忽略的那些区域。

推迟选择代码覆盖率目标,直到您手头有一些测量结果。在获得测量结果之前,测试人员通常会高估其代码覆盖率 20-30%。

3

全面覆盖通常不切实际

尽管 100% 的代码覆盖率似乎是最好的结果,但即使 100% 的代码覆盖率也只能暴露系统中大约一半的故障。低代码覆盖率表示测试不足,但高代码覆盖率并不能保证任何事情。

在大型系统中,实现 100% 的代码覆盖率通常并不经济。下面列出了一些原因。

  • 有些测试用例重现成本高,但发生概率却极低。成本效益比不值得仅仅为了记录代码覆盖率而重复这些测试。

  • 可能会检查意外的错误情况。代码层可能会掩盖低级代码中的错误是否会传播到更高级别的代码。工程师可能会认为处理所有错误比跟踪可能的错误更能创造一个更强大的解决方案。

  • 当前版本中无法访问的代码可能会在将来的版本中被访问。工程师可以通过投入更多精力来添加一些当前不需要的功能来解决未来开发的不确定性。

  • 多个项目之间共享的代码仅被测试项目部分利用。

一般来说,当你越来越关注提高覆盖率数字时,你的动机就不再是寻找错误了。

4

单元、集成和系统测试

单元测试可以实现比集成测试或系统测试更高的代码覆盖率。

在单元测试期间,测试人员可以使用更多工具,例如用于操作数据的调试器和用于模拟错误条件的条件编译。

同样,集成测试的代码覆盖率可能比系统测试更高。在集成测试期间,测试工具通常比系统用户界面提供更精确的控制和功能。

因此,为单元测试、集成测试和系统测试设定逐渐降低的目标是有意义的。

例如,单元测试时为 90%,集成测试时为 80%,系统测试时为 70%。

5

覆盖率指标

本文中的信息适用于独立考虑控制结构的代码覆盖率指标。具体来说,这些是:

  • 语句覆盖(行覆盖)

  • 基本块覆盖

  • 决策覆盖(分支覆盖)

  • 条件/决策覆盖

  • 修改条件/决策覆盖 (MCDC)

尽管其中一些指标对控制流的敏感度不如其他指标,但它们在大规模上都具有统计相关性。

1

正式标准

1,DO-178B

航空标准 DO-178B 要求安全关键系统的代码覆盖率达到 100%。

该标准针对更关键的系统指定了更敏感的代码覆盖率指标。

Image

上面要求既没有考虑失败的概率,也没有考虑执行测试用例的成本

2,IEC 61508

标准 IEC 61508:2010“电气/电子/可编程电子安全相关系统的功能安全”建议几个指标的代码覆盖率达到 100%,但该建议的严格程度与关键性有关。

Image

安全完整性等级 (SIL) 与不安全故障的概率有关。确定 SIL 需要进行长时间的风险分析。

本标准建议但不要求 100% 覆盖。它规定您应该解释任何未覆盖的代码。

该标准没有定义覆盖率指标,也没有区分条件覆盖率和 MC/DC。

3,ISO 26262

ISO 26262“道路车辆-功能安全”要求测量代码覆盖率,并规定如果达到的水平“被认为不够”,则必须提供理由。该标准建议单元测试和集成测试采用不同的覆盖率指标。在这两种情况下,建议的力度都与关键性有关。

对于单元测试,建议使用三种覆盖率指标,如下表所示。标准没有提供这些指标的定义。

Image

对于集成测试,推荐下面两个度量指标。

Image

标准将功能覆盖率定义为已执行的软件功能的百分比,将调用覆盖率定义为已执行的软件功能调用的百分比。

汽车安全完整性等级 (ASIL) 取决于故障概率、对车辆可控性的影响以及危害严重程度。ASIL 与 IEC 61508 的 SIL 没有直接关联。

代码覆盖率要求包含在第 6 部分“软件级产品开发”中。

4, ANSI/IEEE 1008-1987

IEEE 软件单元测试标准第 3.1.2 节规定 100% 语句覆盖率是完整性要求。第 A9 节建议对关键代码或需求规范不足的代码进行 100% 分支覆盖。虽然这份文件相当古老,但它在 2002 年得到了重申。

5, FDA 对医疗器械的要求

美国联邦药品管理局 FDA 文件《 软件验证通用原则》于 2002 年 1 月发布,建议进行结构测试,但未指定任何特定的代码覆盖率要求。该文件仅说:

结构覆盖的量应该与软件带来的风险级别相称。

参考文献:

1. Efficient use of code coverage in large-scale software development, Yong Woo Kim, 2003

2. Code coverage, what does it mean in terms of quality? Williams et al, 2001

3. An Empirical Study of the Branch Coverage of Different Fault Classes, Melissa Cline and Linda Werner, 1994

4. Coverage measurement experience during function test, Paul Piwowarski et al, 1993

5. How Do You Know When You Are Done Testing?, Richard Bender, 2000

6. How to Misuse Code Coverage, Brian Marick, 1997

7. Comparing the Effectiveness of Software Testing Strategies, Basili and Selby, 1987

8. Understanding the Use, Misuse and Abuse of Safety Integrity Levels, Felix Redmil, 2000

原文链接:https://www.bullseye.com/minimum.html