十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用Python和SQLite实现可审计的需求跟踪矩阵RTM

用Python和SQLite实现可审计的需求跟踪矩阵RTM 简介面向系统工程与需求管理实践者的技术文档聚焦需求跟踪矩阵RTM的建立与维护解决需求与设计、实现、验证之间追溯关系模糊、变更影响难控制等常见问题。文档系统梳理了RTM的垂直关系高层目标逐层分解与水平关系同级需求依赖及冲突识别强调双向可追溯、变更管理、覆盖率分析、责任分配和质量分析等核心功能并给出定义需求、构建矩阵、关联元素、持续更新、审查审计的五步建立流程。读者可据此在ISO 15288/IEEE 12207等国际标准框架下落地需求追溯体系明确每个需求的责任人开展覆盖率与来源分析辅助评审和审计决策最终提升需求管理效率减少返工量并降低项目失败风险。资源包为单个PDF文件共1份文档大小仅22KB内容精炼且中英对照便于快速通读。已有46人浏览/学习适合系统工程师、项目管理人员与测试人员作为需求管理工具实践参考。1. 需求跟踪矩阵 RTM系统工程里最容易被忽略的“无法验证的空头支票”集成测试阶段最容易被推翻结论的现场常常不是代码写错而是追溯不上来变更单写着“改动了模块 A 的接口”设计文档里却找不到对应接口的需求编号测试计划里更没有该接口的回归项。需求跟踪矩阵 RTM 原本是用来堵这个窟窿的但实际项目中它往往是建好之后第一个被搁置的文档字段偶尔改两行版本被直接覆盖三个月后新来的同事根本不敢引用里面的链接。在系统工程里RTM 的问题可以从四个角度切数据模型怎么立、可查询的底座怎么建、需求变更时维护哪些关联、最后用什么指标证明它没腐烂。这里不准备重复教科书上的定义而是直接给出一套能落地的做法从追溯关系的方向语义开始紧接着 Python 与 SQLite 实现最后落到基线和自动检查。适合正在搭新系统、或打算把手动表格升级为可审计链路的系统工程师、测试经理和嵌入式项目负责人。2. 先建模再填表RTM 的三类追溯关系与最小字段集2.1 正向追溯、逆向追溯与双向追溯方向不同链路作用也不同RTM 的本质是把两个维度的条目之间对应关系固定下来行的维度是需求列的维度是设计方案、代码组件、测试用例这类实现与验证对象。建表之前必须把追溯方向定清楚因为后续所有断链检查都依赖方向语义。正向追溯是需求到实现的顺序推进利益相关者需要到系统需求再落到子系统设计、接口定义、代码单元与测试用例。它主要防“漏”字——一条需求没有对应设计或者设计了但没有可执行的验证用例都会被链路缺口暴露。逆向追溯是反向查询拿着一个测试用例、一条缺陷记录或者一处代码变更沿链路回到需求条目和需求来源。它主要防“错”字变更影响分析和故障定位都靠它完成。二者结合成双向追溯后才构成闭环。多数团队正向追溯都做得好因为导出需求列表时顺手就能挂上设计文档逆向追溯容易被忽略因为测试团队不会反向维护“这条用例验证哪条需求”。结果就是缺陷单出来时仍然要人工到各文档里逐个猜。这也是为什么很多 RTM 评审会上表能通过评审真正定位问题时却又回到原始文档。2.2 最小字段集用 12 个字段先让一条链路跑通常见的 RTM 模板会把列扩到二三十个但维护成本跟列数正相关。我一般先保持一个最小字段集行能立起来了再按项目需要加列。其中这 12 个字段不建议省掉字段作用示例值需求编号全局唯一键所有追溯链接指向它REQ-SYS-PERF-001需求概述简短描述保证不产生歧义系统启动时间在 3 分钟内来源编号对应上层需求或原始输入SRD-APP-13需求类型功能、性能、接口、约束等性能设计引用设计文档编号、章节或代码路径DES-ARCH-02/S4验证用例引用关联测试用例或验证活动标识TC-INT-021验证方法分析、演示、测试、检查测试当前状态草稿/已评审/已基线/已验证已基线基线名记录这条记录在哪个基线生效BASELINE-V1.2负责人谁对这条链路维护负责zhang.s建立日期用于审计追溯2025-02-14最近变更近期变更描述及原因启动时限由 5 分钟调整为 3 分钟这里的经验是需求编号必须稳定。常见做法是采用“类型前缀 分层标识”的编号方式例如 REQ-SYS-PERF-001 表示“系统级性能类需求”不要让编号里带上日期或建立人否则需求一旦被修改链接就会因编号不可稳定而全部重排。验证方法字段对嵌入式系统特别重要它决定了该条需求在验证阶段以什么证据闭环。2.3 承载工具怎么选Excel 能用但要看见边界需求在三百条以内、变更频率不高的项目Excel 建 RTM 完全够用筛选和统计也直观。但行数超过这个量级、或者一个月内有多轮基线评审时Excel 的两个问题就暴露了一是多人同时编辑时很难处理合并冲突二是没有任何机制强制维护链路完整性连“需求编号是否重复”都要靠肉眼。因此常见做法是先在 Excel 里把字段定义评审通过再迁到一个能跑 SQL 查询的库中。轻量级选择我用 SQLite单体文件、可纳入 Git 版本管理、Python 原生支持后续 CI 里写检查脚本也方便。至于 DOORS、Jama、codebeamer 这类商业需求管理平台适合对审计要求严格的行业和已有成套工具的团队。数据模型和追溯关系是通用的换平台只改接入层。发布时间点的约定同样重要。RTM 通常在系统需求评审通过后生成第一版设计评审期间每两到三周做一次交叉核对集成测试期间以周为单位维护交付前再冻结一份快照。没有节奏的表谈不上维护这点在建库前就要写进项目计划。3. 用 Python 与 SQLite 搭建 RTM 数据底座可查询、可自动核对3.1 先建库把编号规则和链接约束写进 DDLSQLite 中的 RTM 至少要有两张表需求主表和验证项表。验证项表通过 req_id 引用需求主表链路关系在这里体现。CREATE TABLE IF NOT EXISTS rtm_req ( req_id TEXT PRIMARY KEY, req_text TEXT NOT NULL, source_id TEXT NOT NULL, req_type TEXT NOT NULL, design_ref TEXT, status TEXT DEFAULT 草稿, baseline TEXT, owner TEXT ); CREATE TABLE IF NOT EXISTS rtm_ver_item ( ver_id TEXT PRIMARY KEY, req_id TEXT NOT NULL REFERENCES rtm_req(req_id), ver_method TEXT NOT NULL, ver_result TEXT, evidence TEXT, baseline TEXT ); CREATE INDEX idx_rtm_ver_req ON rtm_ver_item(req_id);需求主表里最关键的约束是 req_id 唯一它让外部链接有稳定锚点source_id 不允许为空强制要求每条需求都能找到来源。验证项表的 req_id 以外键方式引用 rtm_req既防止悬挂的测试用例也可以用它做后续断链检查。如果从命令行导入常见操作是执行sqlite3 rtm.db schema.sql重复执行时IF NOT EXISTS不会报错能安全重放。3.2 一段可改用的 Python 脚本找出“已基线但没有验证结果”的需求建完表之后的第一次体检一般查两类缺口没有验证项的需求以及有验证项但结果为空的需求。下面脚本按当前状态过滤避免把草稿状态的需求也带进来造成噪音。import sqlite3 db_path rtm.db # 按实际路径修改 cursor sqlite3.connect(db_path).cursor() cursor.execute( SELECT r.req_id, r.req_type, r.status FROM rtm_req r LEFT JOIN rtm_ver_item v ON r.req_id v.req_id WHERE r.status 已基线 AND (v.req_id IS NULL OR v.ver_result IS NULL) ORDER BY r.req_id; ) for req_id, req_type, status in cursor.fetchall(): print(f[缺验证] {req_id} | {req_type} | {status})逻辑说明LEFT JOIN 保留所有需求主记录而验证项缺失时 v.req_id 为 NULLWHERE 里v.req_id IS NULL OR v.ver_result IS NULL同时覆盖“没有验证项”和“验证项存在但无结果”两种情况。参数上需要调整的是db_path和status 已基线后者要和你项目的状态流一致否则过滤条件不生效。这个脚本可以固定放在项目 tools 目录下作为每日检查入口。3.3 从 Excel 迁入之前先跑一次空值体检如果原来就有 Excel 版本的 RTM直接导入很容易把空行、合并单元格和全角空格一起带进库。我一般先建一张与 Excel 结构一致的 raw_import 临时表然后跑一条统计 SQL把核心字段的空值率看一下SELECT SUM(CASE WHEN req_id IS NULL OR TRIM(req_id) THEN 1 ELSE 0 END) AS miss_id, SUM(CASE WHEN req_text IS NULL OR TRIM(req_text) THEN 1 ELSE 0 END) AS miss_text, SUM(CASE WHEN source_id IS NULL OR TRIM(source_id) THEN 1 ELSE 0 END) AS miss_source, COUNT(*) AS total FROM raw_import;返回结果中 miss_source 偏高通常意味着原需求文档的编号规则不统一这时不要硬导入先回到需求文档补齐来源编号。miss_id 偏高则说明 Excel 里存在合并单元格或自动填充产生的空行导入任务就该暂停在整理数据阶段而不是把问题带到新库里。注意SQLite 的 TRIM 只处理普通空格Excel 里的全角空格需要先通过文本整理工具转成半角否则空值检查会漏判。如果链路规模比较大几千行需求已经超出逐行打印的阅读能力可以把上面的 SQL 再套一层 CASE WHEN 分组统计按需求类型看缺口占比能快速定位是接口类需求没写验证还是性能类需求拖在最后。用视图包装这个查询周报里直接读汇总。4. 维护 RTM 的闭环动作变更传播、基线冻结与断链审计4.1 需求变更发生时四条链路必须同步维护RTM 的维护工作不是“表上改一行”而是变更沿着链路往下游传播。常见的变更类型与维护动作可以总结成下表变更类型RTM 里的维护动作利益相关者需求增删在需求主表增删对应行同时检查派生需求是否需要跟进系统/子系统需求文字调整更新 req_text并把 design_ref 重新指向受影响的设计章节性能指标或接口定义变化更新需求行同时核对验证方法是否仍然适用删除一条需求不物理删除行状态改为“已删除”并附上删除原因测试用例变更更新 rtm_ver_item 中的 ver_id 引用与 ver_method一个容易踩的坑是直接把验证项从表里删除。删除会让审计失去上下文后续若要解释“为什么这条接口没回归”拿不出任何证据。正确做法是在 rtm_ver_item 里增加一个 ver_status 字段用“失效”状态替代物理删除。变更传播的具体执行顺序建议固定为“先改需求文字再改设计引用最后改验证项”且任何两步都不跳过。这样即使传播中途被打断别人也能从半成品状态看出差在哪一步而不是张表里各列分别被改过、彼此却对不上。4.2 基线冻结用快照表不用修改旧记录基线评审通过后RTM 里的记录仍会随后续变更继续更新但基线那一刻的状态必须被完整保留下来否则版本纠纷时没有裁决依据。常见做法是新建一张快照表在每次基线评审通过后把当时的需求主表复制进去CREATE TABLE IF NOT EXISTS rtm_snapshot ( snap_name TEXT NOT NULL, snap_time TEXT NOT NULL, req_id TEXT NOT NULL, req_text TEXT, status TEXT, PRIMARY KEY (snap_name, req_id) ); INSERT INTO rtm_snapshot (snap_name, snap_time, req_id, req_text, status) SELECT BASELINE-V1.2, datetime(now), req_id, req_text, status FROM rtm_req WHERE status NOT IN (已删除);快照表的作用不是备份而是提供“按基线名查询”的审计能力。现场质量问题要追溯时只需要查WHERE snap_name BASELINE-V1.2没人再为“当时这张表到底长什么样”争执。快照的粒度按项目节奏定通常一个评审里程碑存一次即可。4.3 断链检查三条 SQL 找出不合规的追溯行RTM 维护有没有出问题用 SQL 一查便知。这三条语句分别覆盖最常见的断链情况-- 1) 孤儿需求没有对应验证项 SELECT req_id, req_text FROM rtm_req WHERE req_id NOT IN (SELECT DISTINCT req_id FROM rtm_ver_item); -- 2) 悬空验证项引用了不存在的需求 SELECT ver_id, req_id FROM rtm_ver_item WHERE req_id NOT IN (SELECT req_id FROM rtm_req); -- 3) 需求无设计来源 SELECT req_id, status FROM rtm_req WHERE design_ref IS NULL OR TRIM(design_ref) ;这里有一个 SQLite 语义要留意NOT IN的集合里如果存在 NULL 值整个判断结果会被记为 NULL从而过滤掉本应命中的行。解决办法是把需求编号字段约束为 NOT NULL并在建表时杜绝可空主键。如果规模不大第 1、2 条用LEFT JOIN ... WHERE ... IS NULL写法更直观结果也更准确。4.4 责任到人把维护动作写进阶段检查单RTM 不是某个人的专属台账而是多人协作的产物。责任会落在“状态字段由谁来改”这个具体问题上实现状态由开发负责人按阶段更新验证状态由测试工程师在验证完成后两个工作日内更新数据库文件由配置管理员在关闭变更单时合并。阶段检查单里可以固定加三条变更单关闭前确认验证项状态已更新、基线冻结时确认快照表已生成、每周跑一次断链查询并处理空结果。这三条做到了矩阵至少不会在评审会上被指出明显漏洞。5. 验证 RTM 健康度的硬指标与自动提交护栏5.1 覆盖率有三种口径别混在一起用交付评审里常说的 RTM 覆盖率其实有三种需求实现覆盖率、需求验证覆盖率和验证通过率。实现覆盖率 已挂接设计引用的需求数 / 基线需求总数回答“需求有没有落到设计”验证覆盖率 已有验证结果的需求数 / 基线需求总数回答“设计有没有被验证”验证通过率 验证结果为通过的需求数 / 已执行验证需求数回答“验证过的是否都合格”。三者混用最容易在评审会上造成话语分歧建议在项目度量定义里写清楚各自公式和来源表。5.2 用 Git pre-commit 钩子自动卡住悬空验证项如果 RTM 库文件已经在 Git 仓库里管理可以让提交前自动跑一次断链检查悬空验证项直接阻止提交。钩子只需要放在.git/hooks/pre-commit并赋予执行权限#!/usr/bin/env bash # .git/hooks/pre-commit RTM_DBdb/rtm.db if command -v sqlite3 /dev/null 21 [ -f $RTM_DB ]; then orphan_count$(sqlite3 $RTM_DB \ SELECT COUNT(*) FROM rtm_ver_item \ WHERE req_id NOT IN (SELECT req_id FROM rtm_req);) if [ $orphan_count -gt 0 ]; then echo RTM 存在 $orphan_count 条悬空验证项请先修复再提交。 exit 1 fi fi exit 0钩子只检查了“悬空验证项”这一种断链属于成本最低的一道护栏核心价值在于让 RTM 更新不及时的情况在提交现场就被暴露而不是留到评审会。如果团队已经使用 CI也可以把同样的检查放到流水线的 setup 阶段效果一致只是触发时机从本地提交提前到合并请求。Git 2.9 之后可以用core.hooksPath统一管理团队钩子把脚本放到独立仓库里避免每个开发者本地各自维护。本文还有配套的精品资源点击获取
返回列表