动态验证:单元测试
动态验证是通过预定义的测试用例执行软件,并测量其实际运行时行为。可验证函数在正常条件、边界情况和错误状态下是否返回正确结果,并生成ISO 26262、DO-178C、IEC 61508和IEC 62304标准所要求的、作为验证依据的结构覆盖率数据。
单元测试是该流程的起点。在开始集成之前,每个函数、模块、类和组件都会根据其规范进行独立验证。在此阶段发现的缺陷所产生的成本,仅为在集成阶段或现场发现的缺陷成本的一小部分,而此处生成的可追溯性记录构成合规性论证的基础。
测试工作流
在安全关键型开发中,动态验证工作流遵循一个既定的顺序。在测试开始之前,需导入需求并将其与测试用例关联,从而建立相关标准所要求的可追溯性基准。测试环境通过使用模拟对象和桩函数来替代不可用的依赖项,从而隔离待测软件。测试可在主机、目标设备或两者上执行,并全程测量测试覆盖率。测试结果反馈至需求管理系统,从而完成审计人员所审查的双向记录。
单元测试验证的内容
全面的单元测试套件不只会验证预期的输入。每个测试用例都是针对特定需求编写的,并涵盖:
- 正常输入和预期输出
- 边界条件和差一情况
- 错误输入和无效状态
- 与所涉及数据类型相关的溢出和下溢情况
当依赖项返回意外值时的行为
在安全关键型开发中,每个测试用例都可追溯到其设计用于验证的特定需求。从需求到测试用例再到结果的双向可追溯性,是DO-178C和ISO 26262标准下必须提供的证据。
需求可追溯性
根据ISO 26262、DO-178C、IEC 61508和IEC 62304标准,基于需求的测试是强制性的。每个测试用例必须可追溯至其设计用于验证的特定需求,且测试结果必须与这些需求建立双向关联。该记录证明所有需求均已通过测试,且不存在没有对应需求的测试。
VectorCAST的需求网关(Requirements Gateway)可连接外部需求数据库,将需求导入测试环境,并允许测试用例直接与这些需求建立关联。执行完成后,测试结果和覆盖率指标将导回需求管理工具。未被测试覆盖的需求以及未关联需求的测试用例将立即显眼地呈现出来。
测试环境的搭建
待测的嵌入式软件通常依赖于硬件接口、操作系统服务或其他软件组件,而在单元测试期间,这些组件往往无法使用或难以调用。桩函数(Stub)可替代这些依赖项,从而使待测单元能够在隔离环境中进行测试,并能完全控制每个依赖项的返回值。
在构建测试环境时,VectorCAST会为所有依赖项自动生成桩函数。可以根据测试用例启用、禁用桩函数,或对其进行配置以返回特定值。探针点进一步扩展这种控制能力,允许在被测单元的任意位置注入值,从而触达那些原本需要特定硬件条件或故障状态才能触发的代码路径。VectorCAST还支持对模板函数实例化的模拟,包括模板类成员的显式和隐式实例化,这对广泛采用此模式的C++代码库而言至关重要。
代码覆盖率
代码覆盖率衡量测试套件对可执行代码的覆盖程度。安全标准根据所开发软件的关键性规定最低覆盖率要求。
- 语句覆盖率确保每行可执行代码至少被执行一次
- 分支覆盖率则确认每个决策点都已经历过所有可能的结果
- MC/DC(修正条件/判定覆盖率)证明决策中的每个布尔条件都会独立影响结果,这是最严格的结构性标准,也是DO-178C A级和ISO 26262 ASIL D级软件的必备要求
VectorCAST可测量所有这些覆盖率类型,并包含行业模式,该模式会根据给定的标准和安全完整性等级自动选择正确的覆盖率标准。覆盖率结果均通过TÜV认证。
主机和目标测试
单元测试通常首先在主机上开发和运行,以提高速度并便于控制。快速迭代、即时反馈和轻松调试,使主机成为构建和完善测试套件的理想环境。在主机上测试时不会使用目标编译器,因此任何与编译器相关的行为都必须在目标平台上单独进行验证。
VectorCAST使在目标硬件上运行相同的测试用例变得非常简单。测试环境在主机上开发,并利用适用于多种交叉编译器和实时操作系统的运行时支持包 (RSP) 在目标上执行。覆盖率测量、可追溯性和报告功能在两种环境中均适用。
自动化测试生成
对于大型嵌入式代码库而言,手动编写测试用例既耗时又容易出现疏漏。VectorCAST的自动测试生成(ATG)功能可直接从源代码生成初始测试用例集,重点覆盖手动编写时通常会遗漏的边界条件和代码路径。工程师只需审查并扩展生成的测试用例,而非从头开始编写。
偏好直接编写测试代码的团队可以使用编码测试(Coded Tests)功能,该功能采用与GoogleTest兼容的语法提供xUnit风格的测试编写,同时仍可访问VectorCAST的代码覆盖率测量、可追溯性以及CI/CD集成功能。
VectorCAST
VectorCAST是专为嵌入式C、C++和Ada软件打造的动态测试与测试自动化平台,能够自动构建测试环境、生成和管理测试用例、在主机和目标系统上执行测试、测量结构覆盖率,并生成可审计的报告。
主要功能包括:
- 通过生成的存根、模拟对象和测试框架自动设置测试环境
- 自动测试生成(ATG),可直接从源代码生成初始测试用例
- 支持xUnit风格测试编写且兼容GoogleTest语法的编码测试
- 需求网关,实现与外部需求数据库的双向可追溯性
- 基于变更的测试,仅重新执行受代码变更影响的测试
- 适用于Visual Studio Code的VectorCAST Test Explorer扩展
- CI/CD集成,包括Jenkins、Azure DevOps和GitLab