当前位置: 首页 > news >正文

【Python调用CANoe进行测试报告配置与统计】

Python调用CANoe进行测试报告配置与统计

本文将介绍如何使用Python与CANoe COM接口交互,实现测试报告的自动化配置与统计功能。

1. 环境准备

1.1 安装必要的Python库

# 需要安装pywin32库来支持COM接口调用
pip install pywin32

1.2 CANoe COM接口基础

CANoe通过COM接口提供外部控制能力,Python可以通过win32com.client模块调用这些接口。

2. 基本连接与配置

import win32com.client
import pythoncom
import os
from datetime import datetimeclass CANoeReportManager:def __init__(self):self.can_app = Noneself.measurement = Noneself.configuration = Nonedef connect_to_canoe(self):"""连接到CANoe应用程序"""try:self.can_app = win32com.client.Dispatch("CANoe.Application")print("成功连接到CANoe")return Trueexcept Exception as e:print(f"连接CANoe失败: {e}")return Falsedef open_configuration(self, cfg_path):"""打开CANoe配置文件"""if not self.can_app:print("请先连接到CANoe")return Falsetry:if not os.path.exists(cfg_path):print(f"配置文件不存在: {cfg_path}")return Falseself.can_app.Configuration.Open(cfg_path)self.configuration = self.can_app.Configurationprint(f"成功打开配置文件: {cfg_path}")return Trueexcept Exception as e:print(f"打开配置文件失败: {e}")return False

3. 测试报告配置

class CANoeReportManager:# ... 之前的代码 ...def setup_test_report(self, report_settings):"""配置测试报告设置Args:report_settings: 字典,包含报告配置参数"""try:# 获取测试配置test_configuration = self.configuration.TestSetup.TestConfigurations.Item(1)# 配置测试报告test_report = test_configuration.ReportConfiguration# 设置报告格式if 'format' in report_settings:test_report.Format = report_settings['format']  # 如: "HTML", "XML"# 设置报告路径if 'output_path' in report_settings:test_report.OutputPath = report_settings['output_path']# 设置是否在测试结束后自动生成报告if 'generate_after_test' in report_settings:test_report.GenerateReportAfterTest = report_settings['generate_after_test']# 设置报告详细程度if 'verbosity' in report_settings:test_report.Verbosity = report_settings['verbosity']  # 如: 0-最小, 1-标准, 2-详细print("测试报告配置完成")return Trueexcept Exception as e:print(f"配置测试报告失败: {e}")return Falsedef configure_html_report(self, output_dir, report_name=None):"""配置HTML格式测试报告"""if report_name is None:timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")report_name = f"TestReport_{timestamp}.html"report_path = os.path.join(output_dir, report_name)report_settings = {'format': "HTML",'output_path': report_path,'generate_after_test': True,'verbosity': 2  # 详细报告}return self.setup_test_report(report_settings)

4. 测试执行与报告生成

class CANoeReportManager:# ... 之前的代码 ...def start_measurement(self):"""开始测量"""try:if self.can_app.Measurement.Running:print("测量已在运行中")return Trueself.can_app.Measurement.Start()print("测量开始")return Trueexcept Exception as e:print(f"启动测量失败: {e}")return Falsedef stop_measurement(self):"""停止测量"""try:if self.can_app.Measurement.Running:self.can_app.Measurement.Stop()print("测量已停止")return Trueexcept Exception as e:print(f"停止测量失败: {e}")return Falsedef run_test_sequence(self, test_sequence_name, wait_for_completion=True, timeout=60):"""运行指定的测试序列"""try:test_environment = self.configuration.TestSetup.TestEnvironments.Item(1)test_sequence = None# 查找测试序列for i in range(1, test_environment.TestSequences.Count + 1):seq = test_environment.TestSequences.Item(i)if seq.Name == test_sequence_name:test_sequence = seqbreakif not test_sequence:print(f"未找到测试序列: {test_sequence_name}")return False# 运行测试序列test_sequence.Start()print(f"开始执行测试序列: {test_sequence_name}")if wait_for_completion:import timestart_time = time.time()while test_sequence.Running:if time.time() - start_time > timeout:print(f"测试序列执行超时 (>{timeout}秒)")test_sequence.Stop()return Falsetime.sleep(1)print(f"测试序列执行完成: {test_sequence_name}")return Trueexcept Exception as e:print(f"执行测试序列失败: {e}")return False

5. 测试结果统计与分析

class CANoeReportManager:# ... 之前的代码 ...def get_test_results_summary(self):"""获取测试结果摘要"""try:test_service = self.can_app.GetTestService()test_results = test_service.Resultssummary = {'total_tests': test_results.Count,'passed': 0,'failed': 0,'inconclusive': 0,'total_execution_time': 0}# 统计各项结果for i in range(1, test_results.Count + 1):result = test_results.Item(i)verdict = result.Verdictif verdict == 1:  # Passsummary['passed'] += 1elif verdict == 2:  # Failsummary['failed'] += 1elif verdict == 3:  # Inconclusivesummary['inconclusive'] += 1summary['total_execution_time'] += result.ExecutionTimereturn summaryexcept Exception as e:print(f"获取测试结果摘要失败: {e}")return Nonedef get_detailed_test_results(self):"""获取详细的测试结果"""try:test_service = self.can_app.GetTestService()test_results = test_service.Resultsdetailed_results = []for i in range(1, test_results.Count + 1):result = test_results.Item(i)test_info = {'name': result.Name,'verdict': self._verdict_to_string(result.Verdict),'execution_time': result.ExecutionTime,'start_time': result.StartTime,'end_time': result.EndTime,'error_message': result.ErrorMessage if hasattr(result, 'ErrorMessage') else ""}detailed_results.append(test_info)return detailed_resultsexcept Exception as e:print(f"获取详细测试结果失败: {e}")return Nonedef _verdict_to_string(self, verdict):"""将裁决代码转换为字符串"""verdict_map = {0: "None",1: "Pass",2: "Fail", 3: "Inconclusive"}return verdict_map.get(verdict, "Unknown")def generate_statistics_report(self, output_file=None):"""生成统计报告"""summary = self.get_test_results_summary()detailed_results = self.get_detailed_test_results()if not summary or not detailed_results:print("无法生成统计报告")return False# 生成文本报告report_content = self._format_statistics_report(summary, detailed_results)if output_file:with open(output_file, 'w', encoding='utf-8') as f:f.write(report_content)print(f"统计报告已保存至: {output_file}")else:print(report_content)return Truedef _format_statistics_report(self, summary, detailed_results):"""格式化统计报告"""report = "=" * 50 + "\n"report += "CANoe 测试统计报告\n"report += "=" * 50 + "\n\n"# 摘要部分report += "测试摘要:\n"report += f"  总测试数: {summary['total_tests']}\n"report += f"  通过: {summary['passed']}\n"report += f"  失败: {summary['failed']}\n"report += f"  不确定: {summary['inconclusive']}\n"report += f"  总执行时间: {summary['total_execution_time']:.2f} 秒\n"if summary['total_tests'] > 0:pass_rate = (summary['passed'] / summary['total_tests']) * 100report += f"  通过率: {pass_rate:.1f}%\n"report += "\n" + "=" * 50 + "\n"report += "详细测试结果:\n"report += "=" * 50 + "\n"# 详细结果for i, test in enumerate(detailed_results, 1):report += f"\n{i}. {test['name']}\n"report += f"   裁决: {test['verdict']}\n"report += f"   执行时间: {test['execution_time']:.2f} 秒\n"report += f"   开始时间: {test['start_time']}\n"report += f"   结束时间: {test['end_time']}\n"if test['error_message']:report += f"   错误信息: {test['error_message']}\n"return report

6. 完整使用示例

def main():# 创建报告管理器实例report_manager = CANoeReportManager()# 连接到CANoeif not report_manager.connect_to_canoe():return# 打开配置文件cfg_file = r"C:\path\to\your\canoe\configuration.cfg"if not report_manager.open_configuration(cfg_file):return# 配置HTML报告output_dir = r"C:\TestReports"if not report_manager.configure_html_report(output_dir):return# 开始测量if not report_manager.start_measurement():returntry:# 运行测试序列test_sequence_name = "MainTestSequence"if report_manager.run_test_sequence(test_sequence_name, timeout=120):# 生成统计报告stats_report = os.path.join(output_dir, f"Statistics_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt")report_manager.generate_statistics_report(stats_report)finally:# 停止测量report_manager.stop_measurement()if __name__ == "__main__":main()

7. 高级功能

7.1 批量测试执行

def run_batch_tests(report_manager, test_sequences, config_files):"""批量执行多个测试"""all_results = []for cfg_file in config_files:print(f"\n正在处理配置文件: {cfg_file}")if not report_manager.open_configuration(cfg_file):continuefor test_seq in test_sequences:print(f"执行测试序列: {test_seq}")if report_manager.run_test_sequence(test_seq):results = report_manager.get_test_results_summary()if results:all_results.append({'config': cfg_file,'test_sequence': test_seq,'results': results})return all_results

7.2 报告数据导出

import pandas as pd
import jsondef export_results_to_excel(detailed_results, excel_file):"""将测试结果导出到Excel"""df = pd.DataFrame(detailed_results)df.to_excel(excel_file, index=False)print(f"结果已导出到Excel: {excel_file}")def export_results_to_json(summary, detailed_results, json_file):"""将测试结果导出到JSON"""data = {'summary': summary,'detailed_results': detailed_results,'export_time': datetime.now().isoformat()}with open(json_file, 'w', encoding='utf-8') as f:json.dump(data, f, indent=2, ensure_ascii=False)print(f"结果已导出到JSON: {json_file}")

总结

通过Python调用CANoe COM接口,可以实现:

  1. 自动化测试配置 - 自动配置测试环境和报告设置
  2. 批量测试执行 - 按顺序执行多个测试序列
  3. 结果统计与分析 - 自动收集和分析测试结果
  4. 报告生成 - 生成格式化的测试报告和统计信息
  5. 数据导出 - 将结果导出到多种格式供进一步分析

这种方法大大提高了测试效率,特别适用于持续集成环境和自动化测试流水线。

http://www.dtcms.com/a/431828.html

相关文章:

  • 佛山做网站开发电脑app制作教程
  • 东莞网站建设和制作成都系统开发
  • sm2025 模拟赛5 (2025.9.13)
  • 网站建设 中关村产品设计是什么
  • C/C++ 关键关键字面试指南 (const, static, volatile, explicit)
  • 网络IO基础知识
  • 基于ollama运行27b gemma3解决ffmpeg命令生成问题
  • 银河麒麟Kylin-Server-V10
  • 昆明云南微网站搭建张家界网站建设dcwork
  • 正则表达式匹配 - 动态规划
  • Java 开发工具,最新2025 IDEA 使用
  • 动态规划 - 背包详解(下)
  • 北京小程序定制开发seo技能培训课程
  • 个人网站设计内容和要求企业做网站带来的好处
  • 关于校园图书馆网站建设公司设计图
  • 怎么样用自己电脑做网站企业注册信息查询单
  • 自己怎么做家政网站做百科需要发哪些网站
  • 网站开发需要哪些资料wordpress主题黑糖
  • 丽江市网站建设制作aspnet网站开发实例教程pdf
  • 添加Entity Framework Core
  • 中小企业加盟网站建设精品建站教程
  • 凡科建设网站入门版好不青木三色品牌商城网站开发
  • 波峰焊万用治具的制作及使用
  • 怎样在手机上创建网站班级网站首页怎么做
  • 拖鞋设计网站推荐做室内概念图的网站
  • 公司建一个网站昆明seocn整站优化
  • Claude Sonnet 4.5重磅发布:Claude Sonnet 4.5新特性大全|更新了什么?
  • 想做个卷帘门百度优化网站网站的版面布局
  • 网站开发实战视频教程广州 骏域网站建设 陶瓷
  • 国内开源建站cms网站注销主体注销