CANoe-TestModule-vTESTstudio-Python -- 爱恨情仇

news/2024/4/24 21:32:48/文章来源:https://blog.csdn.net/weixin_54581097/article/details/129152089

前面有聊过什么才是真正的自动化平台;其实说起来也是每个测试人的工作之路,从入门的测试执行、测试用例设计、自动化脚本开发、自动化架构开发、自动化平台开发,实际上我们大多数测试人都在纠结第一步的测试执行和第三步的自动化脚本开发,而领导层则更加着重看到平台化的产品;但在我看来测试用例设计和自动化平台开发则尤为重要。今天我们来介绍下实现平台化开发车载网络测试的基础内容 -- 如何通过Python调用CANoe工程,并在CANoe工程中添加TestModule和vTESTstudio工程,后面还会出一块进阶版的Python调用,本篇仅讲解基础的调用整块TestModule和vTESTstudio工程并启动测试。

Vector提供源码

import time, os, msvcrt
from win32com.client import *
from win32com.client.connect import *def DoEvents():pythoncom.PumpWaitingMessages()time.sleep(.1)
def DoEventsUntil(cond):while not cond():DoEvents()class CanoeSync(object):"""Wrapper class for CANoe Application object"""Started = FalseStopped = FalseConfigPath = ""def __init__(self):app = DispatchEx('CANoe.Application')    app.Configuration.Modified = Falsever = app.Versionprint('Loaded CANoe version ', ver.major, '.', ver.minor, '.', ver.Build, '...', sep='')self.App = appself.Measurement = app.Measurement  self.Running = lambda : self.Measurement.Runningself.WaitForStart = lambda: DoEventsUntil(lambda: CanoeSync.Started)self.WaitForStop = lambda: DoEventsUntil(lambda: CanoeSync.Stopped)WithEvents(self.App.Measurement, CanoeMeasurementEvents)def Load(self, cfgPath):# current dir must point to the script filecfg = os.path.join(os.curdir, cfgPath)cfg = os.path.abspath(cfg)print('Opening: ', cfg)self.ConfigPath = os.path.dirname(cfg)self.Configuration = self.App.Configurationself.App.Open(cfg)def LoadTestSetup(self, testsetup):self.TestSetup = self.App.Configuration.TestSetuppath = os.path.join(self.ConfigPath, testsetup)testenv = self.TestSetup.TestEnvironments.Add(path)testenv = CastTo(testenv, "ITestEnvironment2")# TestModules property to access the test modulesself.TestModules = []self.TraverseTestItem(testenv, lambda tm: self.TestModules.append(CanoeTestModule(tm)))def LoadTestConfiguration(self, testcfgname, testunits):""" Adds a test configuration and initialize it with a list of existing test units """tc = self.App.Configuration.TestConfigurations.Add()tc.Name = testcfgnametus = CastTo(tc.TestUnits, "ITestUnits2")for tu in testunits:tus.Add(tu)# TestConfigs property to access the test configurationself.TestConfigs = [CanoeTestConfiguration(tc)]def Start(self): if not self.Running():self.Measurement.Start()self.WaitForStart()def Stop(self):if self.Running():self.Measurement.Stop()self.WaitForStop()def RunTestModules(self):""" starts all test modules and waits for all of them to finish"""# start all test modulesfor tm in self.TestModules:tm.Start()# wait for test modules to stopwhile not all([not tm.Enabled or tm.IsDone() for tm in app.TestModules]):DoEvents()def RunTestConfigs(self):""" starts all test configurations and waits for all of them to finish"""# start all test configurationsfor tc in self.TestConfigs:tc.Start()# wait for test modules to stopwhile not all([not tc.Enabled or tc.IsDone() for tc in app.TestConfigs]):DoEvents()def TraverseTestItem(self, parent, testf):for test in parent.TestModules: testf(test)for folder in parent.Folders: found = self.TraverseTestItem(folder, testf)class CanoeMeasurementEvents(object):"""Handler for CANoe measurement events"""def OnStart(self): CanoeSync.Started = TrueCanoeSync.Stopped = Falseprint("< measurement started >")def OnStop(self) : CanoeSync.Started = FalseCanoeSync.Stopped = Trueprint("< measurement stopped >")class CanoeTestModule:"""Wrapper class for CANoe TestModule object"""def __init__(self, tm):self.tm = tmself.Events = DispatchWithEvents(tm, CanoeTestEvents)self.Name = tm.Nameself.IsDone = lambda: self.Events.stoppedself.Enabled = tm.Enableddef Start(self):if self.tm.Enabled:self.tm.Start()self.Events.WaitForStart()class CanoeTestConfiguration:"""Wrapper class for a CANoe Test Configuration object"""def __init__(self, tc):        self.tc = tcself.Name = tc.Nameself.Events = DispatchWithEvents(tc, CanoeTestEvents)self.IsDone = lambda: self.Events.stoppedself.Enabled = tc.Enableddef Start(self):if self.tc.Enabled:self.tc.Start()self.Events.WaitForStart()class CanoeTestEvents:"""Utility class to handle the test events"""def __init__(self):self.started = Falseself.stopped = Falseself.WaitForStart = lambda: DoEventsUntil(lambda: self.started)self.WaitForStop = lambda: DoEventsUntil(lambda: self.stopped)def OnStart(self):self.started = Trueself.stopped = False        print("<", self.Name, " started >")def OnStop(self, reason):self.started = Falseself.stopped = True print("<", self.Name, " stopped >")# -----------------------------------------------------------------------------
# main
# -----------------------------------------------------------------------------
打开一个空白的CANoe工程
app = CanoeSync()# 导入工程配置cfg文件
app.Load('CANoeConfig\PythonBasicEmpty.cfg')# 导入test modules的配置文件
app.LoadTestSetup('TestEnvironments\Test Environment.tse')# 导入configuration和test units文件
app.LoadTestConfiguration('TestConfiguration', ['TestConfiguration\EasyTest\EasyTest.vtuexe'])# 启动CANoe
app.Start()    # 启动test modules
app.RunTestModules()# 启动TestConfiguration
app.RunTestConfigs()# wait for a keypress to end the program
print("Press any key to exit ...")
while not msvcrt.kbhit():DoEvents()# 关闭CANoe软件
app.Stop()

一、打开CANoe软件

app = CanoeSync()

注意这里打开的是所在电脑本机安装的CANoe软件,如果你的电脑存在多个CANoe版本,那么你就会打开最后安装的CANoe软件版本或者最后注册的CANoe的软件版本,如果你想要打开指定的软件版本的话,那么你就需要在执行该步骤之前对想要打开的CANoe软件版本进行注册,然后再执行该步骤,你就可以打开想要的版本了。这里肯定会有朋友想问怎么注册,下面听我一一道来。

好吧,其实很简单,查找RegisterComponents.exe文件所在的位置,查找到对应软件版本下的RegisterComponents.exe文件,然后以管理员身份运行即可;如果你问我这个不好搜怎么办,好说,推荐给你everything搜索工具;如果你有外网权限,直接使用谷歌浏览器搜索即可;如果没有VPN的话,那我就给你一个好了,直接去我的下载里面下载即可,免费开源,非常值得推荐。

如果你是未接触Python的小白,我也就不说太多,能够让你用起来最为关键,这里主要就有以下几个点:

  1. 将要打开的CANoe软件版本设置

  1. 获取到已打开CANoe的句柄;如果你不知道句柄是什么意思,你就把这个句柄当成你打开的CANoe即可,剩下的操作你就通过这个句柄进行。

二、导入你自己的CANoe工程配置

由于上一步打开的是一个空白的CANoe工程,距离你想要用例还有非常远的一段路要走,为了节省时间,最好就是保存好配置,直接导入即可(当然如果你希望挑战下自己也是可以通过自动化来实现配置)。

app.Load('D:\Work_Project\Automation\CANoe_Project\CANoeConfig\CANoe\Diagnostic.cfg')

demo中使用的是相对路径,但是个人建议使用绝对路径,这个通过Python也是很容易实现的,而且不容易出错,下面是给了获取路径的几种常用的方法,大家有需要可以自取。

import os
#得到当前工作目录
current_path = os.getcwd() 
#返回指定目录下的所有文件和目录名
os.listdir() 
# 上级目录
os.path.dirname(os.path.abspath(__file__))  
os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
获取路径下test.txt的路径
txt_path = os.path.join(os.path.dirname(cur_dir), "test.txt")

执行结果如下:

注意:如果需要导入自动化脚本TestModule或者vTESTstudio,要保证Test Setup里面为空,下面我会说为什么

三、导入要执行的自动化配置

这里要说下,为什么不直接把自动化配置保存在第二步打开的工程中呢?

这是个好问题啊,如果你在第二步直接打开了保存了自动化(无论是TestModule或vTESTstudio编译的文件),那你如何去获取到启动按钮呢?这个demo中可没有啊,并且,如果导入已存在的脚本执行文件,会报错的,因此要在上面那步保证配置为空,为了自动化配置做准备。如果你想在第二步保存配置也不是不行,请关注我后面的文章会有对应的讲解的。

# 导入test modules的配置文件
app.LoadTestSetup('TestEnvironments\Test Environment.tse')# 导入configuration和test units文件
app.LoadTestConfiguration('TestConfiguration', ['TestConfiguration\EasyTest\EasyTest.vtuexe'])
# 这里可以同时在TestConfiguration下一次性导入多个.vtuexe文件
# 这里的.vtuexe文件路径还是建议使用绝对路径(相对路径很大可能会搞到绝望)
app.LoadTestConfiguration('TestConfiguration', ['TestConfiguration\EasyTest\EasyTest.vtuexe'],['TestConfiguration\EasyTest\EasyTest1.vtuexe'], ['TestConfiguration\EasyTest\EasyTest2.vtuexe'])

大家可以在这里看到一个是导入test modules,一个是导入configuration和test units文件;他们有什么区别呢?test module是在CANoe软件中的test module节点,然后通过CAPL实现的简单自动化测试脚本;而configuration名称和test units文件是通过vTESTstudio软件开发的自动化测试脚本编译生成的后缀名为.vtuexe的文件;这是vector工具链中两种完全不同的自动化脚本(虽然都是通过CAPL实现,但是平台和使用方法完全不同,我的其他文章中有介绍,有兴趣的话可以找下);因此上面两种配置不要出现在同一个CANoe工程中,也就是说,两种导入配置一次只能使用其中的一个(还是那句话同时导入2个也不是不行,但是为了能够跑起来,建议不要这样做)。

四、启动CANoe

为什么要单独说呢?因为对于CANoe工程的自动化来说,启动CANoe这是将CANoe这个软件运行起来,并没有运行自动化脚本;就是左上角的黄色闪电,我这个由于没有license都是灰色的大家心理把它当成黄色的就行;箭头很大,大家应该能理解了。

# 启动CANoe
app.Start()    

五、启动测试模块

到了这里才是我们真正需要的执行的脚本,同第三步一样在这里也是有2种,要保持跟第三步加入的一致,如果在第三步你使用的是test modules那你就使用app.RunTestModules();如果你加入的是TestConfiguration,那就使用app.RunTestConfigs();在执行完该步骤后,你就真正的能够看到你的自动化脚本跑起来了。

这里启动我们就能看到脚本框黄色的被启动了,也是很大的箭头!!!

# 启动test modules
app.RunTestModules()# 启动TestConfiguration
app.RunTestConfigs()

注意:一定要跟第三步加入的脚本配置同步,只选择其中的一种。

六、执行完成,关闭CANoe软件

这里我们依然使用demo中的,等待运行结束(不过这里需要某些配置,建议直接使用time.sleep,更加好用点,如果真的想实时监测测试执行状态,那就关注后面的文章吧!!!),然后关闭CANoe软件。

# wait for a keypress to end the program
print("Press any key to exit ...")
while not msvcrt.kbhit():DoEvents()# 关闭CANoe软件
app.Stop()

如果你想更多的操作比如:删除dbc、添加dbc、控制多个TestConfiguration、控制TestUnit、控制TestGroup、设置控制TestCase、自动配置执行脚本、执行项目等等,只要你能想到的都可以实现,都会在后面的文章一一为大家呈现更高阶的玩法,这个我也在文章什么是是真正的自动化有聊过,都是可以实现的;当然如果你想合作,也欢迎联系我!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73065.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构—堆(完全解析)

数据结构—堆&#xff08;完全解析&#xff09; 数据结构——堆&#xff08;Heap&#xff09;大根堆、小根堆 详解数据结构——堆 堆的基本存储 【从堆的定义到优先队列、堆排序】 10分钟看懂必考的数据结构——堆 【堆/排序】堆排序的两种建堆方法 【算法】排序算法之堆排序 C…

Mybatis学习记录

Mybatis学习记录一、MyBatis简介1.1、MyBatis历史1.2、MyBatis特性1.3、MyBatis下载1.4、和其他持久化层技术对比二、MyBatis框架搭建2.1、加入依赖2.2、创建MyBatis的核心配置文件2.3、创建Mapper接口2.4、 创建MyBatis的映射文件2.5、 测试环境2.6、 加入Log4j日志功能三、核…

Array.apply(null,{length: 99}) 逻辑解析

一、基础概述 vue 教程中有一段 demo code&#xff0c;如下&#xff1a; render: function (createElement) {return createElement(div,Array.apply(null, { length: 20 }).map(function () {return createElement(p, hi)})) }这个表达式Array.apply(null, { length: 20 })有…

Leetcode第450题删除二叉搜索树中的结点|C语言

题目&#xff1a; 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤…

【python】用plotly绘制正二十面体

文章目录顶点棱实现正二十面体plotly 的 Python 软件包是一个开源的代码库&#xff0c;它基于 plot.js&#xff0c;而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库&#xff0c;名叫 cufflinks&#xff0c;能让你更方便地使用 plotly 和 Pandas 数据表协同工作…

最新文件快递柜系统网站源码-Fastapi+Sqlite3+Vue2+ElementUI-简洁好用

## 主要特色 - [x] 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI - [x] 轻松上传:复制粘贴,拖拽选择 - [x] 多种类型:文本,文件 - [x] 防止爆破:错误次数限制 - [x] 防止滥用:IP限制上传次数 - [x] 口令分享:随机口令,存取文件,自定义次数以及有效期 - [x] 匿名分享:无…

BurpSuite实战教程02-BurpSuite+夜神模拟器抓包教程

工具介绍 BurpSuite BurpSuite是用于“攻击”web 应用程序的集成平台&#xff08;java编写&#xff09;&#xff0c;包含了许多工具。Burp Suite为这些工具设计了许多接口&#xff0c;以加快攻击应用程序的过程。所有工具都共享一个请求&#xff0c;并能处理对应的HTTP 消息、…

使用Autoware标定工具包联合标定相机和激光雷达

前面文章介绍了&#xff0c;安装autoware标定工具包、ros驱动usb相机、robosense-16线激光雷达的使用&#xff0c;本文记录使用Autoware标定工具包联合标定相机和激光雷达的过程。1.ros驱动相机&#xff0c;启动相机&#xff1b;启动激光雷达2.联合录制bag包rosbag record -a 参…

k8s1.23.0+ubuntu20.04+docker23+hyperv

问题 k8s node节点加入到集群时卡住 “[preflight] Running pre-flight checks” # master节点重新生成加入命令 kubeadm token create --ttl 0 --print-join-command参考 注意 k8s1.24使用containerd而不再使用docker&#xff0c;因此使用k8s1.23版本 环境 k8s: 1.23.0 u…

TestNG和Junit的区别,测试框架该如何选择?

要想知道两个框架的区别&#xff0c;首先分别介绍一下两个框架。 TestNG是一个java中的开源自动化测试框架&#xff0c;其灵感来自JUnit和NUnit&#xff0c;TestNG还涵盖了JUnit4整个核心的功能&#xff0c;但引入了一些新的功能&#xff0c;使其功能更强大&#xff0c;使用更…

记一次docker虚拟机横向移动渗透测试

本次渗透在几个docker虚拟机间多次横向移动&#xff0c;最终找到了一个可以进行docker逃逸的出口&#xff0c;拿下服务器。渗透过程曲折但充满了乐趣&#xff0c;入口是172.17.0.6的docker虚拟机&#xff0c;然后一路横向移动&#xff0c;最终在172.17.0.2出实现了docker逃逸&a…

【vue2每日小知识】实现store中modules模块的封装与自动导入

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;省去我们store仓库中分模块时的需要每次导入index的问题 目录 【前言】在store中如何简…

ELK日志分析--Filebeat

ELK架构 Filebeat简介 Filebeat安装 Filebeat简单使用 专用日志搜集模块 案例模块-Nginx 模块 重读日志文件 使用Processors(处理器)过滤和增强数据 1.ELK架构 2.Filebeat简介 可以使用 Filebeat 收集各种日志&#xff0c;之后发送到指定的目标系统上&#xff0c;但是同…

软件测试面试题 —— 整理与解析(1)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

【华为OD机试真题】用 C++ 实现 - 数字加减游戏

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示&#xff0c;虽然月薪一两万&#xff0c;但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境&#xff0c;焦虑就会逐步放大&#xff0c;这时候副业赚钱的重要性就体现出来了。 发展第二职业&#xff0c;可以让程序员们增加抗风险能力&#xf…

数据结构-考研难点代码突破(树型查找 - 红黑树(RBT)插入流程图,删除)

文章目录1. 红黑树的定义和性质红黑树的插入操作流程红黑树的删除&#xff08;了解&#xff09;1. 红黑树的定义和性质 红黑树查找与删除的效率和AVL树相同。 但是因为AVL树在插入或删除节点可能破坏AVL树结构&#xff0c;而重新调整树的开销大。所以引出了红黑树。 红黑树的…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值&#xff0c;来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量&#xff0c;也可以是从前面接口请求中提取到需要的数据&#xff0c;然后进行遍历循环。 二、ForEach控制器相关…

技能提升:Python技术应用工程师职业技能提升

职业技术培训-Python技术应用工程师分为高级培训班、中级培训班及初级培训班。 Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的语言。最初被设计用于编写自动化脚本Shell&#xff08;适用于Linux操作系统&#xf…

Linux PWM 开发指南

Linux PWM 开发指南 1 概述 1.1 编写目的 介绍 PWM 模块的详细设计方便相关人员进行 PWM 模块的代码设计开发。 1.2 使用范围 适用于 Linux-3.10&#xff0c;linux-4.4 和 Linux-4.9 内核&#xff0c;Linux-5.4 内核。 1.3 相关人员 PWM 驱动的开发人员/维护人员等 2 术…