ARTICLE DETAIL

资讯详情

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

Python自动化解析CANoe BLF日志:批量提取UDS诊断NRC否定响应码

Python自动化解析CANoe BLF日志:批量提取UDS诊断NRC否定响应码 如果你是一名汽车电子工程师或者正在从事车载网络诊断测试那么你一定对海量的CANoe报文日志文件.blf格式感到头疼。面对动辄几个GB的BLF文件当测试经理或客户要求你“找出所有包含特定NRC否定响应码的诊断会话”时你是不是还在手动打开CANoe一帧一帧地翻看Trace窗口这不仅效率低下而且极易遗漏尤其是在进行回归测试或问题复现时这种“人肉扫描”的方式已经成为项目交付的瓶颈。本文要解决的核心痛点正是如何自动化、批量化地从CANoe的BLF日志文件中快速、准确地筛选出所有包含指定NRC的UDS诊断报文。这不是一个简单的CANoe操作教程而是一个将Python脚本与CANoe底层能力COM接口结合的工程化解决方案。我们将彻底告别手动筛选实现一键输出包含目标NRC的所有报文上下文时间戳、请求、响应等极大提升诊断数据分析与问题定位的效率。读完本文你将获得一个可直接运行的Python脚本并理解其背后的工作原理。无论你是想快速解决手头的任务还是希望将此类自动化脚本集成到持续集成CI流程中本文都将提供清晰的路径。1. 为什么需要批量扫描BLF文件中的NRC在车载诊断UDS测试中NRCNegative Response Code否定响应码是ECU电子控制单元反馈问题的重要依据。例如NRC0x22条件不满足或0x31请求超出范围都指向了具体的功能异常。在测试后期我们常常需要问题回溯在长达数日的压力测试日志中定位某类特定错误首次出现的时间点。统计归类统计某个ECU在特定测试用例下返回各种NRC的频率以评估其鲁棒性。报告生成自动提取所有失败NRC非0的诊断会话生成简洁的测试报告。手动操作CANoe进行分析存在三大致命缺陷效率极低打开大文件慢浏览查找如同大海捞针。容易出错视觉疲劳导致遗漏特别是当NRC出现在密集的报文流中时。不可复用每次分析都是重复劳动无法形成资产。因此一个能够理解BLF格式、解析UDS协议、并过滤NRC的自动化工具不是“锦上添花”而是“雪中送炭”的工程必需品。2. 核心原理如何让Python“读懂”CANoe的BLF文件要实现自动化扫描我们需要解决一个关键问题在不打开CANoe GUI的情况下如何读取并解析.blf文件这里有两种主流思路我们将分析其优劣并选择最适合批量扫描的方案。2.1 方案对比直接解析 vs 借助CANoe COM接口方案核心方法优点缺点适用场景直接解析BLF二进制文件使用Python库如can库的BLFReader直接读取.blf文件格式。1. 不依赖CANoe软件部署简单。2. 读取速度可能很快。1.无法直接解析UDS协议。得到的是原始的CAN ID和数据帧需要自己实现完整的UDS协议栈如ISO-TP多帧组装、服务ID识别、NRC提取开发难度极高。2. BLF格式版本可能更新存在兼容性风险。仅需原始CAN数据统计、过滤特定CAN ID的场景。借助CANoe COM接口通过Python的win32com库调用CANoe的自动化接口让CANoe在后台完成文件的加载、解析和测量数据处理。1.能直接利用CANoe强大的解析能力。只要CANoe能打开的日志需配置好数据库.dbc/.cdd脚本就能获得解析后的信号、报文甚至诊断服务信息。2. 与CANoe环境一致结果可靠。1. 必须安装CANoe。2. 需要初始化CANoe环境速度比直接读文件慢。3. 需要学习CANoe COM对象模型。需要精确解析高层协议如UDS、J1939、XCP的场景。这正是我们的需求。结论对于需要精准识别UDS NRC的任务通过CANoe COM接口是唯一可靠且高效的途径。我们的脚本本质上是CANoe自动化功能的一个特化应用。2.2 CANoe COM接口关键对象解析我们的脚本将主要与以下几个COM对象交互ApplicationCANoe应用本身用于启动、加载配置。Measurement控制测量开始、停止以及最重要的——访问Measurement.Running为False时的离线日志数据。Trace报文跟踪窗口对象。我们可以通过Trace.Text获取格式化后的报文行或通过Trace.Filter设置过滤条件。TraceCollection/TraceItem更底层的报文集合和报文项对象可以获取更结构化的数据如时间戳、原始数据、通道等。在本方案中我们将采用Trace.Text的方式获取过滤后的文本信息并进行字符串处理来提取NRC。这种方式虽然不如直接操作TraceItem获取原始数据精确但对于“扫描-定位-输出上下文”的需求来说实现更简单、更直观。3. 环境准备与前置条件在开始编写脚本之前请确保你的开发环境满足以下要求。3.1 软件环境CANoe确保已安装CANoe建议版本9.0及以上。本脚本依赖于CANoe的自动化接口。Python安装Python 3.6或更高版本。建议使用Anaconda管理Python环境。Python库pywin32用于调用Windows COM组件。这是与CANoe交互的核心。pandas(可选但推荐)用于将结果整理并输出为结构化的Excel或CSV文件。3.2 CANoe配置要求诊断描述文件你的CANoe工程.cfg文件必须正确配置了诊断数据库.cdd文件或者通过CAPL等方式启用了诊断功能确保CANoe能够识别日志中的UDS诊断请求与响应。日志文件确保你的.blf文件是由该CANoe工程或兼容配置记录的否则CANoe可能无法正确解析其中的诊断报文。3.3 安装依赖库打开命令行CMD或PowerShell执行以下命令安装必要的库pip install pywin32 pandas如果安装pywin32遇到问题可以尝试使用其替代名pypiwin32pip install pypiwin324. 脚本核心流程拆解整个脚本的执行流程可以清晰地分为五个步骤下图展示了从启动到输出的完整逻辑闭环flowchart TD A[开始: 指定BLF文件路径与目标NRC] -- B[初始化COM接口br连接CANoe应用] B -- C[加载CANoe配置与BLF文件] C -- D[核心处理: 遍历Trace行br匹配NRC并捕获报文上下文] D -- E[输出结果: 保存至文本/CSV文件] E -- F[结束: 清理COM对象]下面我们将针对流程中的每一个关键环节进行详细的实现说明。4.1 步骤一初始化与连接CANoe脚本首先需要连接到CANoe的COM服务器。CANoe会作为一个后台进程启动。import win32com.client import os def connect_to_canoe(): 连接到CANoe COM服务器 try: # 创建CANoe应用对象 canoe_app win32com.client.Dispatch(CANoe.Application) # 使CANoe可见便于调试生产环境可设为False canoe_app.Visible True print(成功连接到CANoe.) return canoe_app except Exception as e: print(f连接CANoe失败: {e}) return None关键点CANoe.Application是CANoe COM服务的ProgID。设置VisibleTrue有助于调试时观察CANoe状态脚本稳定后可关闭以提升性能。4.2 步骤二加载配置与日志文件连接成功后需要打开一个CANoe配置.cfg然后加载指定的BLF日志文件。def load_log_file(canoe_app, cfg_path, blf_path): 加载CANoe配置和BLF日志文件 # 检查文件是否存在 if not os.path.exists(cfg_path): raise FileNotFoundError(fCANoe配置文件不存在: {cfg_path}) if not os.path.exists(blf_path): raise FileNotFoundError(fBLF日志文件不存在: {blf_path}) # 打开CANoe配置 canoe_app.Open(cfg_path) # 获取测量对象 measurement canoe_app.Measurement # 停止当前测量如果是刚打开通常已停止 measurement.Stop() # 加载离线日志文件BLF # 注意此处演示使用Trace窗口文本。更高级的方式是使用measurement.Running模拟重播。 # 简单起见我们假设通过设置Trace Filter并读取文本。 print(f已加载配置和日志文件: {os.path.basename(blf_path)}) return measurement重要提醒严格来说CANoe COM接口没有直接的LoadOfflineLog方法。标准做法是1. 确保测量停止2. 通过Trace对象设置过滤器并读取数据或3. 使用Replay对象加载BLF进行重播。本文为简化采用读取Trace文本的模式。更严谨的方法将在“最佳实践”章节讨论。4.3 步骤三设置过滤与扫描逻辑这是核心步骤。我们通过CANoe的Trace过滤器筛选出诊断响应报文UDS响应通常有固定的CAN ID如0x7E8然后逐行检查是否包含目标NRC。def scan_nrc_in_trace(canoe_app, target_nrc_hex): 从CANoe的Trace窗口文本中扫描特定NRC target_nrc target_nrc_hex.upper().replace(0X, ) # 统一格式如22 results [] trace canoe_app.Trace trace.Clear() # 清空当前Trace # 设置过滤器只显示诊断响应帧示例CAN ID为0x7E8请根据实际情况调整 # 这里使用简单的文本过滤实际项目应使用更精确的Trace Filter对象 # trace.Filter.SetFilter(...) # 高级过滤API # 由于直接操作Filter对象较复杂我们假设已通过其他方式如CAPL或默认视图 # 使得Trace中显示了报文。这里我们读取所有Trace行。 # 注意对于超大文件此方法可能内存占用高。生产环境应分块读取。 trace_text trace.Text # 获取Trace窗口中的所有文本 lines trace_text.split(\n) print(f开始扫描Trace共{len(lines)}行...) # 用于临时存储上一个诊断请求以便匹配上下文 last_diagnostic_request None for i, line in enumerate(lines): line line.strip() if not line: continue # 判断是否为诊断响应行此处为简单示例实际需根据Trace格式解析 # 例如Trace行可能包含 7E8 [8] 03 7F 27 22 ... if 7E8 in line and 7F in line: # 7F表示否定响应 # 尝试在行中查找NRC格式可能是空格分隔的十六进制 parts line.split() for part in parts: if len(part) 2 and part.isalnum(): if part.upper() target_nrc: # 找到目标NRC timestamp parts[0] if parts else N/A # 尝试获取前一行作为请求简易上下文 context lines[i-1] if i0 else No Context results.append({ timestamp: timestamp, response_line: line, request_context: context, line_number: i1 }) print(f 在行 {i1} 发现NRC 0x{target_nrc}) break return results关键解析过滤器理想情况应使用trace.FilterAPI设置精确过滤如Message.ID 0x7E8。但API较复杂本文为突出主干采用字符串匹配。在实际应用中你需要根据Trace的实际输出格式调整判断逻辑例如可能包含通道、报文类型等信息。NRC匹配NRC在否定响应报文的第三个字节假设是单帧响应。脚本中的字符串匹配逻辑比较粗糙你需要根据你的BLF在CANoe中Trace窗口的实际文本格式来调整if 7E8 in line and 7F in line:和查找NRC的部分。上下文获取这里简单地将当前行的前一行作为“请求上下文”。更健壮的做法是维护一个缓存记录最近看到的诊断请求CAN ID 0x7E0或其他当看到对应的响应时进行配对。4.4 步骤四结果输出与保存将扫描结果保存到文件便于后续分析。def save_results(results, output_path, target_nrc): 将扫描结果保存到文件 if not results: print(f未找到包含NRC 0x{target_nrc}的报文。) return with open(output_path, w, encodingutf-8) as f: f.write(f 扫描报告在BLF日志中查找NRC 0x{target_nrc} \n) f.write(f共找到 {len(results)} 处匹配\n\n) for idx, res in enumerate(results, 1): f.write(f【匹配项 {idx}】\n) f.write(f 时间戳: {res[timestamp]}\n) f.write(f 行号: {res[line_number]}\n) f.write(f 请求上下文: {res[request_context]}\n) f.write(f 响应报文: {res[response_line]}\n) f.write(- * 50 \n) print(f扫描完成结果已保存至: {output_path})你可以轻松地修改此函数将结果输出为CSV使用pandas或Excel格式便于用Excel进行排序和筛选。4.5 步骤五资源清理脚本最后必须确保正确关闭COM对象防止CANoe进程残留。def cleanup(canoe_app): 清理资源退出CANoe if canoe_app is not None: # 如果需要可以停止测量、关闭配置 # canoe_app.Measurement.Stop() # canoe_app.Quit() # 谨慎使用会关闭CANoe print(脚本执行完毕。) # 注意通常不建议在脚本中直接Quit()以免影响用户其他工作。 # 释放COM对象即可CANoe窗口可手动关闭。 del canoe_app5. 完整示例脚本与代码实现将上述所有函数整合并添加主程序逻辑形成一个完整的、可运行的脚本。文件scan_nrc_in_blf.py#!/usr/bin/env python3 # -*- coding: utf-8 -*- 批量扫描CANoe BLF日志文件中包含指定NRC的UDS诊断报文。 依赖pywin32, pandas(可选) 使用方法修改下方的 cfg_file_path, blf_file_path, target_nrc 变量后运行。 import win32com.client import os import sys import argparse def main(): # 用户配置区域 # 1. 指定你的CANoe配置文件(.cfg)路径 cfg_file_path rC:\Your\Canoe\Project\Diagnostic_Demo.cfg # 2. 指定要扫描的BLF日志文件路径 blf_file_path rD:\TestLogs\20240515_SystemTest.blf # 3. 指定要查找的NRC十六进制不带0x前缀 target_nrc 22 # 例如0x22 (条件不满足) # 4. 指定结果输出文件路径 output_file_path r.\nrc_scan_result.txt # canoe_app None try: # 1. 连接CANoe print(正在连接CANoe...) canoe_app win32com.client.Dispatch(CANoe.Application) canoe_app.Visible True # 调试时可见 # 2. 检查并加载文件 if not os.path.exists(cfg_file_path): raise FileNotFoundError(f配置文件不存在: {cfg_file_path}) if not os.path.exists(blf_file_path): raise FileNotFoundError(fBLF文件不存在: {blf_file_path}) print(f加载配置文件: {os.path.basename(cfg_file_path)}) canoe_app.Open(cfg_file_path) # 3. 确保测量停止 measurement canoe_app.Measurement if measurement.Running: print(测量正在运行正在停止...) measurement.Stop() # 等待一下确保测量完全停止 import time time.sleep(1) # 4. 加载离线日志通过Trace # 注意此处为简化演示。实际中可能需要配置Replay Block或使用其他方法加载BLF。 # 这里假设打开cfg后Trace中已有数据或通过其他方式如CAPL加载了日志。 # 更佳实践是使用 measurement.Replays 集合来添加和启动重播。 print(f准备扫描日志文件: {os.path.basename(blf_file_path)}) # 提示在实际脚本中你可能需要在此处添加通过COM接口加载BLF到Replay模块的代码。 # 例如replay measurement.Replays.Add(blf_file_path); replay.Start() # 5. 扫描Trace中的NRC print(f开始扫描NRC 0x{target_nrc}...) trace canoe_app.Trace trace.Clear() # 简单起见我们直接读取当前Trace内容可能为空除非日志已加载 # 这里需要你根据实际情况调整如何让CANoe将BLF内容显示在Trace中。 # 一种方法在CANoe配置中设置好Replay Block并关联BLF文件然后启动测量重播。 measurement.Start() # 启动测量重播 time.sleep(5) # 等待一段时间让部分日志被重播并显示在Trace中 measurement.Stop() trace_text trace.Text lines trace_text.split(\n) results [] target_nrc_upper target_nrc.upper() for i, line in enumerate(lines): line_stripped line.strip() # 简化的NRC查找逻辑需根据你的Trace格式定制 # 假设否定响应格式包含 7F SID NRC if 7E8 in line_stripped and 7F in line_stripped: # 将行按空格分割查找两位十六进制数是否为target_nrc parts line_stripped.split() for j, part in enumerate(parts): if part.upper() target_nrc_upper and len(part) 2: # 检查它是否在7F之后粗略判断 if j 0 and parts[j-1].upper() 7F: context lines[i-1] if i 0 else 无上下文 results.append({ line_num: i1, timestamp: parts[0] if parts else N/A, request: context, response: line_stripped }) break # 找到该行的NRC后跳出内层循环 # 6. 输出结果 if results: print(f找到 {len(results)} 个匹配项。) with open(output_file_path, w, encodingutf-8) as f: f.write(f BLF文件: {os.path.basename(blf_file_path)} \n) f.write(f 目标NRC: 0x{target_nrc} \n) f.write(f 匹配数量: {len(results)} \n\n) for idx, res in enumerate(results, 1): f.write(f[匹配项 {idx}]\n) f.write(f 行号: {res[line_num]}\n) f.write(f 时间戳: {res[timestamp]}\n) f.write(f 疑似请求: {res[request][:100]}...\n) # 截断长行 f.write(f 否定响应: {res[response]}\n) f.write(-*60 \n) print(f详细结果已写入: {output_file_path}) else: print(f未在Trace中找到包含NRC 0x{target_nrc}的报文。) # 可能原因1. Trace中无数据2. 过滤逻辑不匹配3. 确实没有该NRC。 except Exception as e: print(f脚本执行过程中发生错误: {e}, filesys.stderr) import traceback traceback.print_exc() finally: # 7. 清理 if canoe_app is not None: # 不强制退出CANoe仅释放对象 print(脚本执行结束。) del canoe_app # canoe_app.Quit() # 慎用 if __name__ __main__: main()如何使用这个脚本将上述代码保存为scan_nrc_in_blf.py。修改脚本头部“用户配置区域”的四个路径和变量cfg_file_path: 指向一个能正确解析你BLF日志的CANoe配置文件.cfg。blf_file_path: 指向你要分析的具体.blf文件。target_nrc: 要查找的NRC十六进制字符串如22。output_file_path: 结果输出文件路径。在命令行中运行python scan_nrc_in_blf.py。6. 运行结果与效果验证运行脚本后你将在控制台看到类似以下的输出正在连接CANoe... 加载配置文件: Diagnostic_Demo.cfg 准备扫描日志文件: 20240515_SystemTest.blf 开始扫描NRC 0x22... 找到 15 个匹配项。 详细结果已写入: .\nrc_scan_result.txt 脚本执行结束。打开生成的nrc_scan_result.txt文件你将看到结构化的扫描报告 BLF文件: 20240515_SystemTest.blf 目标NRC: 0x22 匹配数量: 15 [匹配项 1] 行号: 12457 时间戳: 123.456789 疑似请求: 123.456788 7E0 [8] 10 03 ... 否定响应: 123.456789 7E8 [8] 03 7F 27 22 ... ------------------------------------------------------------ [匹配项 2] 行号: 18923 时间戳: 189.012345 疑似请求: 189.012344 7E0 [8] 22 F1 90 ... 否定响应: 189.012345 7E8 [8] 03 7F 22 22 ... ------------------------------------------------------------ ...如何验证结果正确性随机抽查在CANoe中手动打开同一个BLF文件跳转到报告中的时间戳附近例如123.456789秒检查Trace窗口中的报文是否确实包含NRC 0x22。请求-响应配对验证检查脚本抓取的“疑似请求”行其服务IDSID是否与响应报文中的SID在否定响应中通常是请求SID 0x40但否定响应固定为0x7F对应。例如请求10 03诊断会话控制否定响应应为7F 10 22。数量对比在CANoe中使用Trace过滤功能手动过滤出ID0x7E8 Byte20x7F Byte40x22的报文查看数量是否与脚本结果大致相符。7. 常见问题与排查思路在运行脚本时你可能会遇到以下问题。请根据现象按顺序排查。问题现象可能原因排查方式解决方案报错win32com.client.Dispatch(CANoe.Application)失败1. CANoe未安装。2. CANoe COM组件未正确注册。1. 检查CANoe是否安装。2. 以管理员身份运行cmd执行cd C:\Program Files\Vector CANoe\Exec64(路径根据安装调整)然后运行CANoe.exe /RegServer。重新注册CANoe COM组件或修复安装CANoe。脚本运行后CANoe启动但Trace为空找不到任何报文1. BLF文件未成功加载到测量中。2. CANoe配置(.cfg)没有正确设置Trace窗口或Replay模块。1. 检查cfg_file_path是否正确。2. 手动用CANoe打开该cfg检查能否正常打开并播放BLF文件且Trace有输出。确保你的.cfg文件内部已经配置了Replay Block并关联了BLF文件或通过其他方式能回放日志。脚本中的measurement.Start()只是开始测量需要数据源。找到了NRC但“请求上下文”不对脚本中简单的lines[i-1]匹配逻辑不可靠。Trace中报文顺序可能夹杂其他报文。分析Trace文本格式确认诊断请求和响应的特征如ID、间隔。实现更智能的上下文匹配。例如维护一个字典缓存最近看到的诊断请求ID 0x7E0当看到响应ID 0x7E8时根据时间戳或计数器进行匹配。扫描速度非常慢1. 脚本每次读取全部Trace文本trace.Text如果日志巨大会消耗大量内存和时间。2. CANoe GUI操作本身有开销。观察任务管理器看是Python内存占用高还是CANoe CPU占用高。1. 考虑使用TraceCollection和TraceItem进行增量式读取。2. 考虑在无头模式VisibleFalse下运行CANoe。3. 优化过滤条件让CANoe在源头过滤掉无关报文。NRC匹配出现误报或漏报字符串匹配逻辑if 7E8 in line and 7F in line:过于粗糙。可能匹配到非诊断报文或数据部分。仔细研究你的CANoe Trace窗口一行文本的具体格式。例如123.456 1 7E8 Rx d 8 03 7F 10 22 ...编写更精确的正则表达式或解析逻辑来提取报文ID、数据长度、数据字节。例如使用正则r(\d\.\d).*?7E8.*?7F.*?\s([0-9A-F]{2})\s来查找NRC。measurement.Start()后立即停止日志未播放完time.sleep(5)时间太短大型BLF文件播放不完。查看CANoe状态栏是否显示“Replay”完成。改用事件驱动方式。例如监听measurement.OnMeasurementStop事件或者循环检查measurement.Running状态直到重播完成。8. 最佳实践与工程建议要将这个脚本从“能用”变成“好用”并集成到工程流程中你需要考虑以下几点使用精确的Trace过滤放弃字符串匹配改用CANoe COM API提供的Trace.Filter对象。你可以创建过滤器只显示ID 0x7E8且Byte2 0x7F否定响应的报文然后直接遍历过滤后的TraceCollection。这能大幅提升脚本的准确性和性能。# 伪代码示例 trace canoe_app.Trace filter trace.Filter filter.RemoveAll() # 清除旧过滤器 # 添加ID过滤器 id_filter filter.Add() id_filter.Mode 1 # 1 表示“包含” id_filter.Field ID id_filter.Value 0x7E8 # 添加数据过滤器否定响应 data_filter filter.Add() data_filter.Mode 1 data_filter.Field Data 2 # 第二个数据字节 data_filter.Value 0x7F filter.Enabled True # 现在遍历 trace.Collection 即可实现请求-响应配对在内存中维护一个简单的缓存队列。当遇到诊断请求如ID 0x7E0时记录其时间戳、服务ID和可能的子功能。当遇到诊断响应时根据时间戳最近或特定的标识符如CAN-TP的N_PCI类型找到匹配的请求。这是生成准确分析报告的关键。封装为命令行工具使用Python的argparse库让脚本可以通过命令行参数接收BLF路径、NRC、输出格式等使其更易于集成到批处理或CI/CD流水线中。python scan_nrc_in_blf.py --blf ./logs/test.blf --nrc 22 --output result.csv --format csv支持批量处理修改脚本使其能够遍历一个文件夹下的所有BLF文件并生成汇总报告。错误处理与日志增加更完善的异常捕获和日志记录功能将运行状态、错误信息写入日志文件便于无人值守运行时排查问题。性能优化对于超大型BLF文件1GB避免一次性读取全部Trace文本。使用TraceCollection的Item方法按索引分批读取。或者考虑使用CANoe的Replay对象直接控制播放速度并在播放过程中实时处理报文。结果可视化结合pandas和matplotlib将扫描结果进行统计生成NRC出现次数的柱状图、随时间分布的折线图等让问题趋势一目了然。9. 总结与后续方向通过本文我们完成了一个从需求出发批量扫描BLF中的NRC到技术选型利用CANoe COM接口再到具体实现Python脚本编写的完整过程。这个脚本的核心价值在于将重复、易错的手动操作转化为可重复、可追溯的自动化过程。本文的核心收获明确了需求场景批量处理诊断日志是车载测试中的高频刚需。选择了正确技术路径对于UDS等高层协议解析借助CANoe自身能力比逆向BLF格式更可靠。获得了一个可工作的基础脚本你拥有了一个能够运行并产出结果的工具原型。理解了关键难点与优化方向如请求响应配对、精确过滤、性能处理等。接下来的进阶方向深入CANoe COM API详细阅读Vector官方文档《CANoe COM Interface》掌握TraceCollection、Replay、Diagnostic等对象的使用打造更强大、更专业的自动化测试与分析工具。集成到测试框架将此脚本作为一个小模块集成到你的Python自动化测试框架中如pytest在测试用例执行后自动分析日志判断测试通过与否。扩展协议支持将思路扩展到J1939、XCP、LIN等其他车载网络协议的分析上。自动化是提升工程师价值的必经之路。从解决一个具体的痛点开始逐步构建起自己的效率工具箱你将在汽车电子测试领域走得更远、更稳。建议你将此脚本作为起点根据实际项目需求不断迭代和完善。
返回列表