4. 报告生成配置项详解
TestStand 的报告生成并不是“点一下按钮就出结果”的黑盒,它由一组相互关联的配置项共同决定:报告写到哪里、写成什么格式、同名文件如何处理、附带哪些额外数据、以及在序列执行的哪个时刻触发。理解这些配置项之间的依赖关系,是让报告从“能生成”走向“可交付”的关键一步。本章围绕一次基础报告输出,逐项拆解这些配置,并给出可直接参考的配置样例。
一、报告配置的入口与作用域
在 TestStand 中,报告配置主要分布在两个层面。第一个层面是序列文件级的 Report Options,通过 Station Options 或 Sequence File 的 Report 选项卡进入,它决定该序列文件默认使用哪种报告格式、是否启用报告、以及报告生成的基本行为。第二个层面是步骤级的 Report 属性,例如在 Sequence Call、Message Popup 或自定义步骤中,可以单独控制该步骤是否写入报告、写入哪些内容。两者是“全局默认 + 局部覆盖”的关系:序列文件级配置提供基线,步骤级配置在需要时进行微调。
需要特别注意的是,TestStand 的报告生成依赖 ReportOptions 和 Report 两个内置对象。前者保存格式、路径、覆盖策略等参数,后者保存运行时生成的报告内容。配置项最终都会落到这两个对象上,因此理解它们的字段含义,比记住对话框位置更重要。
二、报告路径:绝对路径与相对路径的选择
报告路径由 ReportOptions.ReportFilePath 控制。它支持两种写法:绝对路径和相对路径。绝对路径如 D:\TestReports\Station01\report.html,优点是位置明确,缺点是换机器或换盘符后容易失效。相对路径如 ..\Reports\report.html,相对于当前序列文件所在目录解析,更适合工程迁移和版本管理。
在实际工程中,推荐使用“相对路径 + 动态变量”的组合。例如:
ReportOptions.ReportFilePath = "..\\Reports\\" + RunState.Root.Locals.StationName + "\\report_" + RunState.Root.Locals.SerialNumber + ".html"
这样每个被测件(UUT)都会生成独立报告,避免多工位并发时互相覆盖。路径中的目录必须提前存在,TestStand 不会自动创建多级目录;如果目录不存在,报告生成会失败并在执行日志中留下错误记录。因此,在序列的 Setup 阶段用 CreateDirectory 或 PathMakeDir 确保目录存在,是一个值得养成的习惯。
三、报告格式:HTML、XML、文本与自定义
TestStand 内置的报告格式主要有 HTML、XML、ASCII 文本和自定义格式。HTML 适合人工阅读,支持表格、颜色和超链接;XML 适合机器解析,便于后续导入数据库或 MES 系统;ASCII 文本最轻量,适合快速排查和日志归档。选择格式时,核心判断依据是“报告的下游消费者是谁”:如果由工程师肉眼查看,选 HTML;如果由脚本或系统自动处理,选 XML。
格式由 ReportOptions.ReportFormat 指定,取值包括 HTML、XML、ASCII 等。需要注意的是,格式与文件扩展名应当保持一致,否则可能造成打开方式混乱。例如格式设为 HTML 但扩展名写成 .txt,浏览器可能无法正确渲染。此外,HTML 报告依赖样式表文件,如果启用了外部 CSS,需要确保样式表与报告文件一起分发,否则报告会失去排版。
四、覆盖策略:追加、覆盖与自动编号
覆盖策略决定当目标文件已存在时如何处理。TestStand 提供三种典型行为:覆盖(Overwrite)、追加(Append)和自动编号(Auto-increment)。覆盖策略由 ReportOptions.ReportFileMode 控制。
- 覆盖模式:每次生成都替换旧文件,适合单次调试或只关心最新结果的场景。
- 追加模式:在旧文件末尾继续写入,适合长时间连续测试的日志累积,但需要注意 HTML 追加可能导致结构不完整。
- 自动编号模式:在文件名后自动添加序号,如
report_001.html、report_002.html,适合需要保留历史记录又不希望手动命名的场景。
选择覆盖策略时,要结合路径中的动态变量一起考虑。如果路径中已经包含了序列号或时间戳,那么覆盖模式通常是安全的;如果路径固定不变,又希望保留历史,则应选择自动编号或追加。一个常见的错误是:路径固定为 report.html,同时使用覆盖模式,结果每次测试都只保留最后一份报告,历史数据全部丢失。
五、附加数据:让报告包含更多上下文
基础报告默认只包含步骤名称、状态、时间和测量值。如果希望报告更具可追溯性,需要配置附加数据。常见的附加数据包括:操作员姓名、工位号、产品序列号、测试程序版本、环境温度、夹具编号等。这些数据通常来自 RunState.Root.Locals 或 FileGlobals,通过 ReportOptions.AdditionalData 或自定义报告回调写入。
在 HTML 报告中,附加数据通常以“报告头”的形式出现在表格上方。配置时需要注意数据类型的转换:数值型数据直接写入即可,日期时间型建议格式化为字符串,避免不同区域设置导致显示差异。如果附加数据来自数据库查询,应确保查询在报告生成之前完成,否则报告头可能为空。
六、生成时机:On-The-Fly 与 End-of-Execution
报告生成时机由 ReportOptions.ReportGeneration 控制,主要有两种模式:On-The-Fly(边执行边生成)和 End-of-Execution(执行结束后一次性生成)。On-The-Fly 模式下,每个步骤执行完就立即写入报告,优点是即使测试中途崩溃,已执行部分的数据仍然保留;缺点是频繁写文件可能影响执行速度,且 HTML 文件在生成过程中可能处于不完整状态。End-of-Execution 模式下,所有数据先缓存在内存中,执行结束后统一写入,优点是文件完整、写入效率高;缺点是如果执行过程中断,报告可能完全丢失。
对于大多数基础报告输出场景,推荐使用 End-of-Execution 模式,配合执行结束后的报告回调进行最终处理。如果测试流程较长且中间步骤价值较高,可以改用 On-The-Fly,但应确保报告文件不被其他程序占用。
七、一次基础报告输出的完整配置示例
下面给出一个可直接参考的配置流程,目标是为每个 UUT 生成独立的 HTML 报告,包含操作员和序列号,执行结束后统一写入。
- 在 Setup 步骤中,从
RunState.Root.Locals读取StationName和SerialNumber,并拼接报告路径:"..\\Reports\\" + StationName + "\\" + SerialNumber + ".html"。 - 使用
PathMakeDir确保..\Reports\StationName目录存在。 - 设置
ReportOptions.ReportFormat = "HTML",ReportOptions.ReportFileMode = "Overwrite",ReportOptions.ReportGeneration = "EndOfExecution"。 - 在
ReportOptions.AdditionalData中写入操作员姓名、程序版本、测试日期。 - 执行序列,结束后检查目标目录下是否生成
SerialNumber.html,打开确认报告头包含附加数据,步骤表包含所有测试步骤。
八、配置项之间的相互影响
这些配置项并非彼此独立。路径中的动态变量决定了覆盖策略的实际效果:如果路径已经唯一,覆盖模式不会造成数据丢失;如果路径固定,覆盖模式就会覆盖历史。生成时机也会影响附加数据的可用性:On-The-Fly 模式下,附加数据必须在第一个步骤执行前就准备好;End-of-Execution 模式下,附加数据可以在执行过程中动态更新,最终统一写入。格式选择则影响附加数据的呈现方式:HTML 适合展示表格和颜色,XML 适合结构化嵌套,ASCII 适合纯文本追加。
因此,在配置报告时,建议按照“先确定下游消费者 → 再选择格式 → 然后设计路径与覆盖策略 → 最后确定生成时机与附加数据”的顺序进行。这个顺序不是强制流程,但它能避免“格式选错导致无法解析”或“路径固定导致历史丢失”这类常见问题。完成一次基础报告输出后,应当打开生成的文件,逐项核对报告头、步骤表、汇总信息和附加数据区,确认配置项真正生效,而不是仅仅在对话框中填写了参数。