3. 测试数据与证据的分类体系

在航空软件适航审定中,测试数据与证据不是一堆散落的文件,而是一套需要被检索、追溯、复用和审查的结构化资产。如果分类体系设计得不好,最直接的后果是:审查方要一份"某软件等级下、某测试阶段产生的、用于覆盖率验证的原始数据",团队需要人工翻找数天,甚至无法证明数据与需求的追溯关系。因此,本节要解决的核心问题是——如何用一套稳定的分类维度和编码规则,把测试数据与证据组织成可管理、可追溯的对象。

一、四个分类维度及其正交关系

航空软件测试数据与证据的分类,通常从四个维度切入,它们之间是正交的,即一条数据记录会同时携带四个维度的属性,而不是被归入其中某一个类别。

  • 按测试阶段分类:单元测试、部件测试、配置项测试(CSCI 级)、系统测试、验收测试。阶段维度决定了数据的"产生时机"和"责任主体",也决定了它与 DO-178C 生命周期数据的对应关系。
  • 按测试类型分类:功能测试、接口测试、性能测试、鲁棒性测试、边界与等价类测试、结构覆盖率测试(语句/判定/MC/DC)。类型维度决定了数据的"验证目标"。
  • 按软件等级分类:A、B、C、D 级(依据 DO-178C 的失效影响等级)。等级维度决定了数据的"严格程度要求",例如 A 级要求 MC/DC 覆盖率证据,C 级通常只要求语句覆盖。
  • 按数据用途分类:测试输入数据、预期结果、实际结果、覆盖率报告、测试日志、缺陷记录、追溯矩阵、审查记录。用途维度决定了数据在证据链中"扮演什么角色"。

这四个维度组合起来,才能唯一描述一条证据。例如:"配置项测试阶段 + 结构覆盖率测试 + A 级 + 覆盖率报告",指向的是 DO-178C 表 A-7 中要求的目标证据。只用一个维度分类,检索和追溯都会失效。

测试数据与证据的四维分类与编码结构 测试阶段 单元 / 部件 配置项 / 系统 验收 编码位:PH 测试类型 功能 / 接口 / 性能 鲁棒性 / 边界 结构覆盖率 编码位:TY 软件等级 A / B / C / D 决定覆盖目标 与独立性要求 编码位:DL 数据用途 输入 / 预期 / 实际 覆盖率 / 日志 缺陷 / 追溯 / 审查 编码位:US 分类编码:PH-TY-DL-US-序号 示例:CSCI-COV-A-RPT-0017 元数据模型(每条证据记录携带) 标识:ID / 版本 / 哈希 来源:工具 / 环境 追溯:需求 / 用例 状态:通过 / 失败 时间:生成 / 签署 责任人:执行 / 复核 完整性:签名 / 校验 保留:期限 / 密级

二、分类编码规则的设计

分类维度确定后,需要把它们固化为可机读的编码。推荐采用分段式编码,格式为:PH-TY-DL-US-序号。各段取值如下表所示。

段位含义取值示例
PH测试阶段UT(单元)、CT(部件)、CSCI(配置项)、SYS(系统)、ACC(验收)
TY测试类型FUN(功能)、IF(接口)、PERF(性能)、ROB(鲁棒性)、BND(边界)、COV(覆盖率)
DL软件等级A、B、C、D
US数据用途IN(输入)、EXP(预期)、ACT(实际)、RPT(覆盖率报告)、LOG(日志)、DEF(缺陷)、TRC(追溯)、REV(审查)
序号流水号4 位数字,如 0017

例如编码 CSCI-COV-A-RPT-0017 表示:配置项测试阶段、结构覆盖率测试、A 级软件、覆盖率报告、第 17 号记录。审查方看到这个编码,无需打开文件就能判断其性质。这种"自描述"能力是分类体系的核心价值。

三、元数据模型:让证据可追溯、可验证

仅有编码还不够,每条证据记录必须携带一组元数据字段,才能支撑追溯和审查。建议的最小元数据集包括:

  1. 标识类:唯一 ID、版本号、文件哈希(SHA-256),用于防篡改和版本比对。
  2. 来源类:生成工具及版本(如测试执行工具、覆盖率分析工具)、运行环境(目标机/仿真环境)、配置项版本。
  3. 追溯类:关联的需求 ID、测试用例 ID、上级证据 ID,形成双向追溯链。
  4. 状态类:执行结果(通过/失败/阻塞)、覆盖率数值、缺陷关联 ID。
  5. 责任类:执行人、复核人、签署时间,满足独立性要求。
  6. 保留类:保留期限、密级、存储位置,满足数据管理要求。
元数据不是"填得越多越好"。字段过多会导致录入负担和错误率上升。建议先落地上述最小集,再根据项目审查反馈逐步扩展。关键是每个字段都要有明确的用途——要么支撑追溯,要么支撑验证,要么支撑管理决策。

四、落地示例:一条覆盖率证据的完整记录

下面给出一条 A 级软件配置项测试的覆盖率证据记录示例(数据为教学假设,非实测结果):

{
  "evidence_id": "CSCI-COV-A-RPT-0017",
  "version": "1.2",
  "file_hash": "sha256:9f2c...a71d",
  "phase": "CSCI",
  "test_type": "COV",
  "software_level": "A",
  "usage": "RPT",
  "tool": "CoverageAnalyzer v3.4",
  "environment": "目标机 PowerPC MPC755",
  "config_item": "FCU-SW-2.1",
  "requirement_ids": ["REQ-FCU-045", "REQ-FCU-046"],
  "test_case_ids": ["TC-FCU-112", "TC-FCU-113"],
  "result": "PASS",
  "coverage": {
    "statement": "100%",
    "decision": "100%",
    "mc_dc": "98.7%"
  },
  "defect_ids": [],
  "executor": "张工",
  "reviewer": "李工",
  "signed_at": "2025-03-12T14:30:00+08:00",
  "retention": "型号寿命周期+5年",
  "classification": "内部"
}

这条记录的价值在于:审查方可以通过 requirement_ids 追溯到需求,通过 test_case_ids 追溯到用例,通过 coverage.mc_dc 判断是否满足 A 级要求,通过 file_hash 验证文件未被篡改,通过 reviewer 确认独立性。任何一个字段缺失,追溯链就会断裂。

五、分类体系落地时的常见问题

在实际项目中,分类体系最容易出问题的地方有三个。第一是维度混用:把"测试类型"和"数据用途"混为一谈,例如把"覆盖率报告"既当作类型又当作用途,导致编码冲突。第二是等级信息丢失:数据从测试团队移交到审定团队时,软件等级字段被丢弃,审查方无法判断该证据是否满足对应等级的严格程度。第三是追溯字段空置:元数据模板里有 requirement_ids,但实际录入时留空,导致证据无法与需求建立关联。

分类编码一旦在型号中启用,就不应随意变更段位含义。如果必须调整,应建立版本映射表,保证历史数据的编码仍可被正确解析。编码规则的不稳定会直接破坏追溯链的连续性。