ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Vector DOORS AddIn:打通需求库与工具链的自动化同步实践

2026/9/19 6:03:30 拓冰建站 浏览量
Vector DOORS AddIn:打通需求库与工具链的自动化同步实践 简介Vector DOORS AddIn官方用户手册为PDF文档面向使用vTESTstudio进行测试开发与需求管理的汽车电子、嵌入式系统工程师解决将IBM Rational DOORS需求纳入Vector测试工具链后的需求跟踪、覆盖分析与结果回传问题。手册内容涵盖安装步骤、DXL脚本扩展导出额外属性、追踪项导出/导入、与测试用例实现关联、在CANoe中执行测试单元、导入CANoe测试报告等完整流程并提供认证、保修、支持等说明可作日常操作与排错参考。资源包共1个文件文件类型为PDF压缩包整体大小2.74MB便于按需查阅与存档。目前已有227人学习下载适合需要打通DOORS需求与vTESTstudio测试执行的测试开发与验证人员。1. Vector DOORS AddIn把需求库推进 Vector 工具链的同步器汽车电子项目里需求常年在 IBM DOORS 里维护而 CANoe、vTESTstudio、vCDM 这边既要看需求又要留 trace 链接。常见做法靠手动复制需求 ID一等需求变更就出现文本过期、引用断开。Vector DOORS AddIn 不是某个神秘的官方魔法而是解决这条断链的一套集成思路在 DOORS 侧做好属性导出再用脚本和转换程序把需求数据喂给 Vector 工具链。它适合测试工程师、需求管理员和工具链集成者也让覆盖分析不再靠翻 Excel。当前 DOORS 里的需求基数越大越需要把同步动作做得规范和可重复。下面从扩展机制讲起落到一组可抄走的最小实现。2. 集成方式与数据模型AddIn 不能只靠复制粘贴DOORS 里的需求不是一堆 Word 段落而是模块里的对象。每个对象带绝对编号、文本和若干属性属性名因企业模板而异。要做一个能长期用的 AddIn先得搞清楚 DOORS 提供了哪些扩展口以及 Vector 侧到底接受什么数据。2.1 DOORS 的扩展口径DXL、Automation 与外部工具DOORS 的扩展机制粗略分为三类DXL 脚本、Automation API 和外部工具集成。DXL 是 DOORS 内置脚本语言能直接遍历模块、读写对象属性、注册窗口菜单Automation API 是 DOORS 的 COM 接口外部程序可以启动 DOORS 进程来操作数据外部工具则是在 DOORS 的用户工具配置中注册命令行程序把当前模块等参数传给外部进程。扩展方式适合任务典型场景维护成本DXL读对象、算统计、改属性模块内导出、菜单按钮低Automation API跨进程批量操作生成报告、复杂计算中高外部工具 转换程序对接第三方工具链DOORS 与 Vector 数据交换中我会优先选「DXL 做采集外部程序做转换」而不是把整个 AddIn 塞进 DOORS 进程。原因有三个第一DOORS 进程很敏感插件一旦异常会把整个需求库拖垮第二DXL 写字符串处理和 XML 生成非常痛苦C# 或 Python 做转换更顺手第三外部程序可以独立做日志、单测、断点重放出现问题排查成本低。下面各节的实现都按这个思路展开。2.2 Vector 工具链的数据入口文件交换、自动化接口与模型同步Vector 工具链不是只有一个入口。整车测试常用 CANoe需求配置常走 vCDM架构设计又可能是 PREEvision。它们的共同点是需要看见需求正文、需求 ID 和验证状态但不应该直接去改 DOORS 数据库。常见做法是先生成一份结构明确的交换文件再让 Vector 侧的工作台或数据管理模块去导入。下面是一个最简交换文件示例展示一个需求节点需要携带的信息Requirements sourceDOORS exportTime2026-03-10T09:30:00 Requirement IdREQ-001/Id Title点火关闭后休眠电流小于150uA/Title Text在点火OFF且等待30秒后休眠电流应小于150uA。/Text PriorityHigh/Priority TraceFromPower/ChassisRequirements: /42/TraceFrom /Requirement /Requirements这段 XML 的逻辑是Id是 DOORS 的绝对编号Title和Text来自对象文本TraceFrom保存 DOORS 模块路径和对象在模块内的序号。这样在 Vector 侧显示需求时点击记录能追溯到 DOORS 里的来源对象。exportTime用于后续对照同步时间避免把过期的导出文件误当作最新状态。2.3 最小数据集绝对编号、对象文本与验证状态很多团队第一次做集成时只导出ObjectText结果到了测试用例里只看到一大段描述不知道优先级和状态。一个合格的 AddIn 至少要把下面的字段带出来数据项DOORS 来源Vector 侧用途需求唯一键模块路径 绝对编号trace 链接主键标题对象标题或文本首行列表展示完整描述对象文本测试评审优先级自定义属性 Priority测试排序验证状态自定义属性 Status覆盖矩阵链接来源对象链接追溯关系这里的重点是用「模块路径 绝对编号」作为复合主键而不是单独用绝对编号。DOORS 的绝对编号在一个数据库里唯一但多个产品线可能共用同一个 DOORS 服务模块路径能区分来源避免 Vector 侧合并数据时碰撞。2.4 双向同步的有向设计用同步字段切断循环需求描述永远以 DOORS 为准测试状态则可能从 Vector 回写到 DOORS。最怕做成无脑双向DOORS 导出到 VectorVector 又回写两边互相触发再导入形成循环。常见做法是把同步方向拆成两条单向链路需求正文只从 DOORS 走Vector 只回写验证状态。DOORS 模块里预留一个VECTOR_LAST_SYNC字段导出完成后把对象标记上后续脚本只处理未标记的对象这样循环更新就切断了。3. 用 DXL C# 做一个最小可用的 Vector DOORS AddIn下面这套实现可以在半天内跑通DXL 负责从 DOORS 取数C# 负责把数据转成 Vector 侧能导入的 XML。先不追求界面和完整映射先证明数据链路是通的。3.1 在 DOORS 中注册外部工具入口在 DOORS 的“用户工具”配置里新增一条命令把可执行文件路径填进去。注意不要让 DOORS 直接传模块路径给外部程序不同版本的占位符写法不一样容易造成兼容性坑。建议 DXL 脚本里用current拿到当前模块再把导出的 CSV 写到固定临时目录外部程序只接收文件路径参数。这样入口只做一件事把当前模块的数据导出来。3.2 DXL 导出脚本把当前模块写为 CSV下面这段 DXL 脚本遍历当前模块的对象输出 CSV 文件。属性名要根据你模块里的实际列调整Module m current if (null m) { print No module opened\n halt } Stream out write C:/temp/doors_export.csv if (null out) { print Cannot create output file\n halt } out ID|TITLE|TEXT|PRIORITY|STATUS\n Object o for o in m do { if (o.Deleted) { continue } string title o.ObjectTitle string text o.ObjectText string prio o.Priority string status o.Status out o.AbsoluteNumber | csv(title) | csv(text) | csv(prio) | csv(status) \n } out.close print export done\n string csv(string x) { string r replace(x, \\, \\\\) r replace(r, \, \\\) r replace(r, \n, \\n) return \ r \ }这个脚本的关键在csv()函数DOORS 对象文本里经常带换行和引号如果不转义下一步按行解析 CSV 会把需求描述拆得七零八落。脚本里先跳过o.Deleted的对象避免把已删除记录带进 Vector。o.Priority和o.Status用引号括起属性名是为了兼容属性名带空格的情况如果你的模块里没有这两个属性DXL 会直接报错需要先删掉或改成实际属性名。3.3 C# 转换器从 CSV 生成 Vector 交换 XMLCSV 只是中间产物真正的关键是把字段映射成 Vector 工具认识的 XML。下面的 C# 控制台程序读取 CSV逐行生成 XML同时做一次基本的数据清洗using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; namespace VectorDoorsAddIn { class Program { static int Main(string[] args) { if (args.Length 2) { Console.Error.WriteLine(usage: VectorDoorsAddIn input.csv output.xml); return 2; } string[] lines File.ReadAllLines(args[0]); var settings new XmlWriterSettings { Indent true, Encoding new UTF8Encoding(false) }; using (XmlWriter writer XmlWriter.Create(args[1], settings)) { writer.WriteStartElement(Requirements); writer.WriteAttributeString(source, DOORS); writer.WriteAttributeString(exportTime, DateTime.Now.ToString(s)); for (int i 1; i lines.Length; i) { if (string.IsNullOrWhiteSpace(lines[i])) continue; string[] fields ParseCsvLine(lines[i]); if (fields.Length 3) continue; writer.WriteStartElement(Requirement); writer.WriteElementString(Id, fields[0]); writer.WriteElementString(Title, CleanValue(fields[1])); writer.WriteElementString(Text, CleanValue(fields[2])); writer.WriteElementString(Priority, fields.Length 3 ? fields[3] : Unset); writer.WriteElementString(Status, fields.Length 4 ? fields[4] : Unset); writer.WriteEndElement(); } writer.WriteEndElement(); } Console.WriteLine(converted (lines.Length - 1) rows); return 0; } static string[] ParseCsvLine(string line) { var fields new Liststring(); var sb new StringBuilder(); bool inQuotes false; foreach (char c in line) { if (c ) { inQuotes !inQuotes; } else if (c | !inQuotes) { fields.Add(sb.ToString()); sb.Clear(); } else { sb.Append(c); } } fields.Add(sb.ToString()); return fields.ToArray(); } static string CleanValue(string value) { return value.Replace(\\n, \n).Trim(); } } }程序用|作为字段分隔符因为你可能需要在字段内部保留逗号。ParseCsvLine只处理一层引号与转义已经能覆盖 DOORS 导出的大多数情况。CleanValue把脚本里的\n还原成真实换行保证正文可读。命令行参数只有两个输入 CSV 路径和输出 XML 路径程序返回0表示成功2表示参数错误。字段数量不足三行的记录被跳过防止空行或破损行把 Vector 导入流程打断。3.4 调用方式与退出码整个流程串起来就是两步先在 DOORS 中运行 DXL 脚本再在命令行里执行VectorDoorsAddIn.exe C:/temp/doors_export.csv C:/temp/vector_requirements.xml退出码含义常见处理0转换成功可继续导入 Vector1运行时异常看 stderr 输出的异常堆栈2参数错误检查输入输出路径DXL 和 C# 解耦后调试时可以直接用上一次导出的 CSV 反复跑转换器不用每次打开 DOORS。这个工作流对日常需求变更很有用。4. 参数配置与字段映射的落地细节数据通了之后下一步是把映射关系从硬编码挪到配置里。否则每次改一个属性名都要重新编译程序这个 AddIn 就失去了长期使用价值。4.1 命令行参数与配置文件常见做法是传入一个 JSON 配置文件把 CSV 字段名、XML 元素名和 DOORS 属性名都写在里面。这样后续接入新项目时只改配置不动代码{ input: C:/temp/doors_export.csv, output: C:/temp/vector_requirements.xml, separator: |, mapping: [ { csvField: ID, vectorElement: Id }, { csvField: TITLE, vectorElement: Title }, { csvField: TEXT, vectorElement: Text }, { csvField: PRIORITY, vectorElement: Priority }, { csvField: STATUS, vectorElement: Status } ] }配置文件里的mapping数组决定 CSV 列名到 XML 元素名的转换关系。新增一个字段时先在 DXL 导出脚本里加一列再在mapping里加一条映射不需要改 C# 主流程。separator单独配置是因为有些团队习惯用逗号有些用制表符配置化能避免不同模板之间互相干扰。4.2 需求属性映射DOORS 列名到 Vector 字段DOORS 属性CSV 字段名Vector XML 元素示例值AbsoluteNumberIDIdREQ-001ObjectTitleTITLETitle休眠电流限制ObjectTextTEXTText点火 OFF 后 30 秒...PriorityPRIORITYPriorityHighStatusSTATUSStatusVerified映射时要注意大小写和空值。DOORS 的自定义属性可能叫Priority也可能叫优先级别CSV 字段名要保持一致。空值建议统一写成Unset而不是空字符串因为 Vector 工具的导入校验经常把空字符串当作格式错误。Id字段不要拼DOORS-前缀或加版本号它应该是稳定键否则后续 trace 数据会断。4.3 增量同步与冲突处理全量导出在模块对象超过几千条时会很慢而且每次导入 Vector 都会重建需求列表容易把已经建立的链接覆盖掉。所以要在 DOORS 模块里加一个VECTOR_LAST_SYNC字段DXL 导出脚本在处理完对象后把它置为Y下次只处理没有标记的对象。如果需求文本被修改由修改流程清空标记或者把修改操作封装到一个 DXL 工具里自动重置标记。冲突处理原则是需求正文以 DOORS 为准Vector 侧只回写状态字段不覆盖需求描述。5. 验证同步正确性的三个步骤5.1 与 DXL 基准脚本核对导出数量同步完成第一步是检查数量不是检查内容。用一个独立的 DXL 脚本统计当前模块非删除对象总数Module m current int count 0 Object o for o in m do { if (o.Deleted) { continue } count } print total count \n然后对比 CSV 行数。如果 CSV 少了优先看脚本里是否误跳过了对象如果多了看是不是把表格对象或隐藏对象也导出了。数量对上了再抽几个对象核对标题和正文。5.2 在 Vector 工具中干跑导入与回读比对把生成的 XML 先导入一个空的 Vector 工程不要直接覆盖正式工程。成功导入后从 Vector 侧导出一份需求清单和 DOORS 的导出行做字段级比对。重点看Id是否唯一、Title是否完整、Status是否落到了预期字段。空值字段在 Vector 侧经常显示成空单元格检查这些单元格就能反推 DXL 里属性名是否写错。5.3 在 DOORS 里增加一个覆盖计数列做日常巡检验证不是一次性的。长期维护时在 DOORS 模块里加一个只读属性VECTOR_COVERED用 DXL 统计当前模块里有多少对象已经被 Vector 侧回写了状态再除以总需求数得到覆盖百分比。把这个计数命令挂到每周巡检脚本里定期提醒哪些需求还没有测试覆盖。这样每次新增需求后只需要重新跑一遍 AddIn 和计数脚本就能看到覆盖率的即时变化不需要再到 Vector 侧手工查一遍。本文还有配套的精品资源点击获取