头部新能源汽车企业如何实现覆盖率工程化?
C/C++test CT 工程实践解析
CUSTOMER CASE STUDY
前言
客户类型:某头部新能源汽车企业研发团队
在大型智能汽车软件研发中,C/C++ 项目通常具有代码规模大、测试 Target 多、构建链路复杂等特点。
当项目采用 Bazel + GoogleTest 架构后,如何在不改变现有测试体系的前提下,将覆盖率能力真正融入日常研发流程,成为覆盖率工程化落地的关键。
本案例展示了 Parasoft C/C++test CT 如何围绕真实大型 C/C++ 工程,完成从代码插装、测试执行、覆盖率采集,到数据归集与 CI 集成的工程化实践。

01
大型 C/C++ 工程的覆盖率,难的不只是“测”
• 保留既有 Bazel 构建体系,不重构工程组织方式。
• 继续使用现有 GoogleTest 用例,不迁移测试框架。
• 对真实被测代码完成 CT 覆盖率插装与运行时接入。
• 将多个测试目标产生的数据自动归集并统一报告。
·目标·
A

复用 GoogleTest 测试资产
测试用例继续沿用原有 GoogleTest 组织方式,降低迁移、重构、培训和后续维护成本。
B

适配 Bazel 真实构建链路
通过脚本定制把 C/C++test CT 插装和运行时依赖嵌入 Bazel 的编译、链接与测试流程。
C

自动化覆盖率数据闭环
测试执行后自动定位覆盖数据、过滤目标源码、归并结果并输出统一报告。
Bazel 继续负责构建,GoogleTest 继续负责测试,C/C++test CT 专注覆盖率,定制脚本负责把三者稳定连接。
02
遇到的挑战与困难
Bazel + GoogleTest 场景的难点不是“跑起来”,而是让覆盖率接入既准确又可重复。
与传统 Makefile 工程相比,Bazel 对目标依赖、缓存、沙箱、并行执行和输出目录进行了更强的抽象。编译命令往往由 Bazel 动态生成,测试目标也可能分散执行。覆盖率方案如果只在局部增加编译参数,很容易出现“部分源码未插装、运行时未正确链接、数据位置不统一、报告无法稳定复现”等问题。
01

Bazel 构建链路动态化,传统包装方式难直接套用
编译和链接动作由 Bazel 统一调度,实际命令、执行路径和产物位置与普通 Makefile 工程不同。覆盖率工具需要进入真实构建链路,才能确保目标源码被正确插装。
02

既有 GoogleTest 资产规模大,不适合重新迁移
客户已经拥有成熟的测试目标、Fixture、Mock 和断言逻辑。覆盖率方案需要保持 GoogleTest 测试入口不变,避免增加迁移和双体系维护成本。
03

多 target、多测试二进制导致覆盖数据分散
同一模块可能由多个测试目标共同覆盖,执行后数据分散在不同输出位置。若依赖人工查找和合并,容易遗漏,也难以支撑持续回归。
04

插装范围必须可控,避免无关代码干扰
大型 Bazel 工程包含业务源码、外部依赖、生成代码等多类内容,需要按模块、目录或目标控制插装范围,避免增加构建开销并稀释报告。
05

运行时、沙箱路径与自动化流程需要统一适配
覆盖率运行时库、Bazel 沙箱路径和数据输出方式需要与真实工程配合,同时还要把构建、执行、采集和报告封装为可重复流程,才能真正进入日常研发。
·核心问题·
如何在不改变现有测试体系的情况下,让覆盖率真正进入研发流水线?
覆盖率接入的关键,不是增加更多工具步骤,而是把复杂步骤封装掉,让研发人员仍然按照熟悉的Bazel + GoogleTest 方式工作。
03
解决方案:C/C++test CT 覆盖率工程化接入
Parasoft 围绕客户真实 Bazel 工程设计定制脚本,将构建、插装、测试、采集和报告串成统一链路。
用自动化流程解决复杂 Bazel 工程中的覆盖率接入大型项目中,真正的挑战往往并不是“有没有覆盖率工具”,而是:如何让覆盖率工具适配企业现有工程。
针对实际项目环境,围绕 Bazel 工程结构、Target、编译参数和测试执行流程,对覆盖率过程进行自动化封装。

Parasoft给出的方案的核心原则是“保留原体系、增强覆盖率能力”。Bazel 仍然负责工程构建和测试编排,GoogleTest 仍然作为测试执行入口;C/C++test CT 在编译与链接环节完成目标代码插装,并在测试运行后形成覆盖率数据。
Parasoft 定制脚本负责识别目标、注入参数、组织执行、收集数据和生成报告。

·目标·
这一流程使“覆盖率”从单次工具操作转变为可脚本化执行的工程能力。研发人员无需理解每个底层插装参数,也不必手工在 Bazel 输出目录中查找数据,只需通过统一入口触发测试与覆盖率流程。
01

构建层适配:识别真实 Bazel target 与编译动作
Parasoft 工程师先梳理被测模块、目标依赖、编译器/链接器入口以及测试 target,确认 CT 应在哪些编译动作中生效。通过脚本对目标进行选择和参数注入,避免对整个工程进行无差别插装。
02

插装层适配:将 CT 能力嵌入真实编译与链接
脚本将 C/C++test CT 的覆盖率参数带入实际 C/C++ 编译和链接流程,同时处理运行时库依赖、工作目录和数据输出位置,确保生成的测试二进制具备覆盖率采集能力。
03

执行层复用:继续运行客户原有 GoogleTest
测试逻辑、Fixture、Mock、参数化测试和断言均保持原状。覆盖率方案不重新生成测试用例,也不改变测试框架,只对“被测代码如何构建”和“执行结果如何采集”进行增强。
04

数据层闭环:自动收集、过滤、归并与报告
测试结束后,脚本自动定位覆盖率数据文件(例如 CT 运行产生的数据),按照目标源码范围进行过滤和归并,并生成统一报告,便于研发团队查看已覆盖区域和覆盖缺口。
核心不是改造客户测试体系,而是让 C/C++test CT 成为 Bazel + GoogleTest 工程中的“覆盖率能力层”。
04
Parasoft 工程师脚本定制与环境适配
针对 Bazel 的真实工程行为,把复杂的集成细节封装为可配置、可重复的自动化脚本。
C/C++test CT 本身提供覆盖率插装与数据处理能力,但在大型 Bazel 项目中,真正决定方案能否落地的是“如何进入客户现有工程”。因此,本项目由 Parasoft 工程师结合客户构建方式进行脚本定制,并通过多轮构建、链接、执行与数据验证完成环境适配。

Step 1: 工程链路摸底
确认 Bazel workspace、主要 build/test target、C/C++ toolchain、GoogleTest 测试入口和被测模块边界,明确需要插装的范围。
Step 2: 脚本入口设计
将覆盖率操作封装为统一脚本入口,通过少量参数选择模块、测试目标和报告位置,脚本内部负责组织 CT 参数与 Bazel 调用。
Step 3: 插装与链接适配
验证 CT 是否进入目标源码,检查运行时库连接,并处理 Bazel 沙箱、缓存和输出路径对覆盖数据生成的影响。
Step 4: GoogleTest 执行复用
继续调用现有测试目标,保持测试逻辑与执行习惯不变,由脚本统一控制测试前清理、执行和结果传递。
Step 5: 数据归集、过滤与报告
自动收集多个测试目标的覆盖数据,按业务源码范围过滤并归并结果,最终生成统一报告,同时保留关键日志便于问题定位。
·定制脚本的典型职责·

这种工程化适配把“工具能力”转化为“团队可长期使用的流程能力”。即使后续新增测试目标或调整被测模块,也可以在脚本参数和配置层进行扩展,而不需要每次从头重新研究工具接入方式。
Parasoft 工程服务的价值,在于把一次性验证变成可复用的工程资产,并让复杂 Bazel 环境中的覆盖率流程可维护、可扩展。
05
项目价值
在不替换 Bazel 与 GoogleTest 的前提下,为既有单元测试体系补齐专业覆盖率能力。
通过 C/C++test CT 与定制脚本的结合,客户能够在真实 Bazel 工程中复用现有GoogleTest 测试资产,并建立一致的覆盖率采集方法。研发团队不需要维护额外的测试框架,也不需要在每次回归后手工整理覆盖数据,覆盖率可以与原有测试流程同步
01

保护既有测试资产
GoogleTest 用例、Mock、Fixture 和测试目标继续复用,避免大规模。
02

降低 Bazel 集成复杂度
脚本封装 CT 参数、构建入口、运行时依赖与数据路径,让研发人员无需反复研究 Bazel 内部细节。
03

提升覆盖率结果可信度
插装发生在真实被测代码和真实测试目标上,结果更贴近项目实际构建与执行环境
04

提高回归测试效率
测试执行、数据收集、归并和报告生成形成固定流程,减少人工查找与整理覆盖数据的时间。
05

支持持续集成并沉淀工程能力
统一脚本可纳入CI,范围配置、数据处理和问题定位方式可持续复用。
06

增强功能安全认证合规能力
使用 C/C++test CT 中由 TÜV SÜD 认证覆盖的 GoogleTest,支撑ISO 26262等功能安全标准相关的验证与审计准备。
·从单次覆盖率采集到持续质量数据·

从开发自测、回归验证到 CI 流水线,统一的脚本化覆盖率流程让质量数据能够持续沉淀。
06
案例总结
本案例并不是用新的测试框架替换GoogleTest,而是利用Parasoft C/C++test CT为现有 Bazel+GoogleTest 体系补充专业覆盖率能力。Parasoft 工程师通过脚本定制,将插装、测试执行、数据归集和报告输出组织成稳定、可重复的流程。在项目价值层面,对于有ISO 26262等功能安全认证需求的项目,可使用 C/C++test CT 中TÜV SÜD认证覆盖的 GoogleTest版本,有助于降低安全关键项目中开源测试框架的资格认定与合规准备工作量。
真正高效的覆盖率方案,不是替换已有测试体系,而是让覆盖率能力融入现有研发体系。
不迁移测试资产,不重建构建体系,以脚本适配让覆盖率真正进入日常工程流程。
-End-