20 个章节 · 支持关键词组合搜索
测试、可验证性与证据
实践 / 建议可验证性:产品行为、测试有效性、证据可信度一起建设
开发 Agent 自验、CI 扫描与独立验收协作
用户于 2026-11-08 补充确认:开发 Agent 主要为 Claude、Codex 等,频繁与 GitLab 交互; 它们自行执行分层及端到端测试,详细过程和测试结果保留在 Multica,进展及证据保留在 GitLab。 GitLab CI 已内置团队称为 SonarLint 的安全、Bug 等扫描。泳道图已按此更新。 前轮依据用户确认记录扫描已接入,本轮补充部分项目 CI 抽查,不能推断所有仓均强制阻断。 这里沿用团队名称;落地接入卡应填写实际扫描器、版本、规则集和结果入口,避免名称代替配置事实。 本轮新增抽查发现 IDP 普通 MR 的 Sonar 扫描可为手动且允许失败,特定条件下才自动执行; 因此“CI 内置扫描”不等于每次 MR 都有必需阻断扫描,详见项目可观测与操作能力包的最新快照说明。
| 职责 | 执行与反馈 | 结果落点 |
|---|---|---|
| Claude / Codex 开发 Agent | 读取 Issue 当前合同、实现、执行适用的单元/集成/契约/端到端测试,分析失败并修复 | Multica 留步骤、环境、命令、结果、失败和重试;GitLab 留进展、结论与证据 |
| GitLab CI 扫描与必需测试 | 按 pipeline 配置运行 SonarLint 安全/Bug 扫描和必需检查,产出真实报告 | GitLab job、reports/artifacts 或稳定证据引用;绑定实际 SHA |
| 开发 Agent 持续反馈 | push 后读取 CI,MR 后持续回应 comment/discussion;修复后重新提交并重跑受影响项 | MR 更新变更和验证摘要,Multica 记录完整执行过程 |
| 独立验证/评审 | 按风险核对 验收标准、原始报告、负向样例与关键路径,必要时独立复跑 | GitLab 保留验收结论和证据;Multica 保留执行与交接细节 |
| 人工责任人 | 判断需求、风险、例外和合并/生产发布条件 | GitLab 审批与交付记录,关联实际发布事实 |
开发 Agent 的测试不只限于编译或单测,也包括适用的集成与端到端验证。 独立验证按风险和已有证据选择复核/复跑范围,避免机械地重复全部套件。 静态安全/Bug 扫描覆盖其规则能识别的问题,业务 验收标准、租户隔离、异步完成和用户旅程仍需行为测试。
建议 GitLab 中每次有效验收至少能定位:关联 Issue/MR、commit SHA、pipeline/job 或外部执行 ID、 环境与关键依赖版本、实际测试结果、扫描结论、原始报告、Multica run/topic/reply。 开发 Agent 在 CI 外执行的端到端测试也应保存原始报告和运行来源,并从 GitLab 可追溯访问; 不能仅贴一段“全部通过”的模型总结。保存证据不等于把运行日志提交进 Git 源码历史。 长期需要保留的证据应采用明确的 artifact 保留策略或受控持久存储,避免过期后只剩失效链接。
建议区分 PASS、FAIL、未运行、环境阻塞、报告缺失,以及经授权接受的例外。 新增提交后,按影响重新运行检查;旧 SHA 的绿灯不得直接作为新候选版本的放行依据。 误报处置和例外遵循已有授权,不由开发 Agent 通过关闭扫描、削弱规则或忽略失败自行放行。
复用两项公司已有工程实践
IDP 把反恒真、零断言与测试归属检查接到 CI,并测试检查器自身; Egress 拒绝缺报告、零执行、skipped/failures/errors,并对 长时间稳定性测试 检查 revision、时长与行为。 这两项很适合推广为参考适配,不能把启发式扫描或 JUnit 计数解释为完整的正确性证明。
先让产品行为可观察:权限是否拒绝、资源是否释放、状态是否落库、异步是否完成、用户是否能完成旅程。 再让测试能够识别错误:去掉目标实现应失败、错误凭据应被拒绝、异常路径应释放资源。 最后使报告绑定实际输入、执行者和环境,独立判定必需项是否满足。
测试使用多维矩阵
| 测试层次 | 必须看见的行为 | 典型位置 |
|---|---|---|
| 纯逻辑单元 | 边界、不变量、状态转移 | 本地与 CI;可控时钟/随机性 |
| 受控组件集成 | 事务、并发、装配、资源生命周期 | 隔离数据库、容器或受控组件 |
| 服务/消费者契约 | 错误语义、鉴权、租户、兼容性 | 接口测试与固定版本组合 |
| 完整应用 | 启动、配置、真实网络与依赖 | 测试环境、CLI binary、服务 smoke |
| 用户旅程 | 跨服务业务完成、UI/设备行为 | 浏览器、模拟器/真机、端到端数据检查 |
另标目的(回归/安全/性能/长时间稳定性测试)、位置、触发时机与判定责任。 不把一次 smoke 当成全量测试,也不把层次名称直接映射为任务风险。 编辑期跑最小有效检查,候选版本补齐风险要求,CI 独立运行必需项。
长时间稳定性测试:发现持续运行后的退化
长时间稳定性测试(Soak,也称耐久测试)是在代表性负载下持续运行系统, 观察短时间测试不易暴露的内存/资源泄漏、性能退化、队列积压与周期性状态问题。 它是测试目的与运行方式,可以作用于组件、服务或完整系统,不另造一个必须顺序经过的测试层级。
| 测试类型 | 主要回答的问题 |
|---|---|
| 功能测试 | 行为是否符合验收标准? |
| 负载测试 | 预期业务负载下,吞吐和响应时间是否达标? |
| 压力测试 | 超过正常负载后,在哪里失效,能否恢复? |
| 长时间稳定性测试 | 在持续运行和相关周期之后,资源、性能与业务状态是否仍然稳定? |
Java 服务可重点观察堆/堆外内存、GC、线程和连接池、文件句柄、错误率、响应延迟与消费积压。 例如异步消费服务变更后,在固定制品、配置、数据集和代表性流量下持续运行, 核对消费正确性,以及积压、资源占用是否出现不可接受的增长;必要时观察停止负载后的资源回落。
运行时长按风险和机制周期确定,应覆盖相关的缓存过期、凭据刷新、定时任务或资源累积窗口; 不统一规定所有工程必须运行若干小时,也不只用“运行期间没有崩溃”作为通过标准。 执行前定义负载与观察窗口、资源/延迟/错误阈值、允许的变化趋势和停止条件, 保存实际时长、候选 SHA、制品/环境、负载曲线、指标与原始报告。 未达到约定时长、流量不足或证据缺失,应记录未完成或缺口,不能汇总为通过。
按改动风险在候选发布、定时任务或专门环境执行,不要求每次提交都跑完整耐久测试。 Agent 可以准备、执行、分析和归档;人负责确定业务代表性与可接受阈值, 成熟场景由独立执行器按已确认标准自动判定,异常按规则升级。
退出码为零还不够
建议统一验证结果为 PASS、FAIL、BLOCKED_ENV、NOT_RUN、UNKNOWN; SKIPPED 作为测试项状态记录,必需项被跳过时整体不能 PASS。 纯文档改动等不适用项记录理由,经规则判断后排除;不为“绿灯”虚构运行。
| 输入事实 | 应得结论 | 为什么 |
|---|---|---|
| 命令退出 0,JUnit 中 failure > 0 | FAIL | 包装脚本可能忽略失败 |
| 命令退出 0,报告缺失或 0 测试 | UNKNOWN/FAIL,按合同阻断 | 没有证明必需行为被执行 |
| 单测全部通过,必需集成环境不可用 | BLOCKED_ENV | 不能用局部结果覆盖整体缺口 |
| Pod Ready、health 通过,权限场景未测 | 仅部署/冒烟通过 | 就绪与业务正确是不同断言 |
| 旧版回归失败、新版通过、必需套件齐全、输入一致 | 对指定 验收标准 的 PASS | 结论仍限于约定范围,不代表没有未知缺陷 |
交付证据包的最小字段(建议 schema 语义)
validation:
task_ref: TASK-EXAMPLE
acceptance_ids: [AC-object-permission]
inputs:
repo: project-repository
commit: resolved-commit
merge_base: resolved-base
dirty: false
artifact_digest: resolved-artifact-digest
dependency_lock: resolved-dependency-revision
policy_revision: pinned-policy
capability_revision: pinned-bundle
execution:
runner_ref: isolated-runner
suite: permission-contract
required: true
environment_ref: isolated-test-environment
config_revision: resolved-config
data_fixture_revision: resolved-fixture
result:
verdict: PASS
executed: 12
passed: 12
failed: 0
skipped: 0
report_ref: access-controlled-report
report_digest: resolved-report-digest
first_attempt_ref: retained-first-attempt
cleanup: complete
示例字段不是当前系统已提供的 API,数字是示例;实际记录还需时间、命令/工具版本与失败明细。 由受控验证执行器生成结果,模型不能只写一份 YAML 自称通过。 证据存储权限、写入身份、内容摘要和输入绑定一起提供可信度;SLSA provenance 可借鉴其追溯结构, 本方案不宣称达到某个 SLSA 等级。
必需验证的版本失效规则
新提交使旧输入的验证失效;合并基线变化重验受影响内容;重新构建的制品要核验 digest。 可变 SNAPSHOT、配置、测试数据或共享环境变化也会使结果不可复用。 改检查器、降低测试范围或更新规则包同样属于验证输入变化。 临时分支上的检查器不能单独决定放行,关键校验从受保护版本执行,调整门禁要独立评审。
本节依据: IDP 测试治理 ADR、Egress 证据检查器、检查器负向测试、Egress CI。