【CANOE范例程序讲解】--- Python调用CANOE运行

【CANOE范例程序讲解】--- Python调用CANOE运行

1. 概述

本期讲解的是Python调用CANOE的范例程序。

工程路径:

C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 14.0.83\Programming\Python

2. 调用演示

打开工程路径文件夹显示如下。

在当前文件夹下打开cmd窗口。

在窗口中输入python RunAllTests.py。

按回车键运行。在cmd窗口中可以看到测试用例开始执行和执行完成的打印。

在cmd调用python脚本运行期间,canoe窗口自动打开,并自动运行测试用例脚本。执行如下所示。执行了TestModule和TestUnit两种类型的测试脚本。TestModule是canoe自带的测试脚本开发方式;TestUnit是使用vTESTstudio开发的测试脚本,可以在canoe中调用运行。

3. 程序讲解

3.1 类定义

程序中主要定义了5个类,分别CanoeSync、CanoeMeasurementEvents、CanoeTestModule、CanoeTestConfiguration、CanoeTestEvents。逐个讲解下关键代码。


CanoeSync类

主要建立与canoe的通信,执行打开canoe工程、执行测试用例等操作。
def __init__(self): 类初始化函数self.Running、self.WaitForStart、self.WaitForStop:创建了3个匿名函数,用于监测canoe 运行状态、开始和停止;WithEvents(self.App.Measurement, CanoeMeasurementEvents):将canoe的Measurement 属性与回调函数 CanoeMeasurementEvents 绑定。这个回调函数主要用于赋值运行的变量和状态打印。
def Load(self, cfgPath): 打开指定路径canoe工程COM调用链:Application->Open()
def LoadTestSetup(self, testsetup): 在canoe工程中添加 Test Environment,后缀为tseTraverseTestItem 函数:将添加的Test Environment 中所有 Test Module 提取到一个列表里,其中可能有嵌套文件夹的,这个函数可以对文件里的嵌套Module都遍历出来。
def LoadTestConfiguration(self, testcfgname, testunits): 在canoe工程中添加单个 Test Configuration,并将输入的 测试单元添加到这个Configuration中,测试单元后缀为vtuexe
def Start(self)、def Stop(self): 控制canoe工程的启停COM调用链:Application->Measurement->Start()COM调用链:Application->Measurement->Stop()WaitForStart() : 在初始化中定义的匿名函数,函数会阻塞等待,等待canoe工程启动完成后,继续向后运行WaitForStop() : 在初始化中定义的匿名函数,函数会阻塞等待,等待canoe工程停止完成后,继续向后运行启动完成和停止完成的状态值由“CanoeMeasurementEvents”类中的回调函数来配置。
def RunTestModules(self)、def RunTestConfigs(self): 控制测试模块、测试单元的启动控制所有测试模块、测试单元都运行,然后100ms周期检测,所有模块运行完成后再继续执行后续操作。
def TraverseTestItem(self, parent, testf): 遍历获取Test Environment中的所有Test Module

CanoeMeasurementEvents类

作为 CanoeSync 类中的 Measurement 属性的回调。
def OnStart(self)、def OnStop(self) : Measurement的COM回调方法,检测到canoe运行和停止时会自动调用这两个函数。COM调用链:Application->Measurement->OnStartCOM调用链:Application->Measurement->OnStop
这里的 CanoeSync 是直接调用的类名然后调用它的属性,是合法的。因为CanoeSync的属性 Started 和 Stopped 都是类级别的(定义在类中而非实例中),可直接通过类名访问。

CanoeTestModule类

封装 Test Module 对象,绑定回调函数。
DispatchWithEvents 将Test Module 与 CanoeTestEvents 事件类绑定。在测试用例开始和停止运行时触发。

CanoeTestConfiguration类

封装 Test Configuration 对象, 绑定回调函数。绑定同CanoeTestModule类。

CanoeTestEvents类

创建 Test Module 和 Test Configuration 对象的回调事件。
def OnStart(self)、def OnStop(self) : TSTestModule 和 TestConfiguration 的COM回调方法,检测到测试用例运行和停止时会自动调用这两个函数。COM调用链:Application->Configuration->TestSetup->TestEnvironments->TestEnvironment->TestModules->TSTestModule->OnStartCOM调用链:Application->Configuration->TestSetup->TestEnvironments->TestEnvironment->TestModules->TSTestModule->OnStopCOM调用链:Application->Configuration->TestConfigurations->TestConfiguration->OnStartCOM调用链:Application->Configuration->TestConfigurations->TestConfiguration->OnStop

3.2 调用序列

定义完成类之后,开始实际的调用canoe步骤。

1实例化了一个CanoeSync对象 app = CanoeSync()
2CanoeSync对象加载cfg工程app.Load...
3在cfg工程中添加tseapp.LoadTestSetup...
4在cfg工程中添加vtuexeapp.LoadTestConfiguration...
5启动canoeapp.Start() 
6运行所有TestModuleapp.RunTestModules()
7运行所有TestConfigurationapp.RunTestConfigs()
8运行完成等待键盘操作while not msvcrt.kbhit()...
9停止canoeapp.Stop()

原始序列代码如下:

# ----------------------------------------------------------------------------- # main # ----------------------------------------------------------------------------- app = CanoeSync() # loads the sample configuration app.Load('CANoeConfig\PythonBasicEmpty.cfg') # add test modules to the configuration app.LoadTestSetup('TestEnvironments\Test Environment.tse') # add a test configuration and a list of test units app.LoadTestConfiguration('TestConfiguration', ['TestConfiguration\EasyTest\EasyTest.vtuexe']) # start the measurement app.Start() # runs the test modules app.RunTestModules() # runs the test configurations app.RunTestConfigs() # wait for a keypress to end the program print("Press any key to exit ...") while not msvcrt.kbhit(): DoEvents() # stops the measurement app.Stop()

4. 总结

以上就是 vector 官方的 python 调用 canoe 范例的代码讲解,对于我们实际项目应用中可以对这些范例代码进行借鉴,比如实际中的 canoe 工程不需要通过代码添加测试用例,那么就可以跳过用例添加的步骤,取而代之的是识别当前已有的测试用例,然后直接执行。具体的用法大家可以根据实际情况来调整,欢迎评论区讨论。

Read more

【算法刷题】二叉树前中后序遍历(递归+迭代)详解

【算法刷题】二叉树前中后序遍历(递归+迭代)详解

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * 一、二叉树的前序遍历🥝 * 1. 递归写法🍂 * 核心思路 * 步骤拆解 * 示例说明 * 代码🍋‍🟩 * 2. 迭代写法🍂 * 核心思路 * 步骤拆解 * 关键逻辑解析 * 示例说明 * 代码🍋‍🟩 * 二、二叉树的中序遍历🥝 * 1. 递归写法🍂 * 思路 * 代码🍋‍🟩 * 迭代写法🍂 * 核心思路 * 步骤拆解 * 关键逻辑解析 * 示例说明 * 代码🍋‍🟩 * 三、二叉树的后序遍历🥝 * 递归写法🍂 * 思路 * 代码🍋‍🟩 * 迭代写法1🍂🐦‍🔥 * 关键难点👏👏👏 * 解决方案 * 步骤拆解

By Ne0inhk
五大经典排序算法:插入、希尔、冒泡、选择、堆排序全攻略

五大经典排序算法:插入、希尔、冒泡、选择、堆排序全攻略

目录 --------------插入排序------------- 1、插入排序思想 2、示例代码 3、效率分析 --------------希尔排序------------- 1、希尔排序思想 2、示例代码 3、效率分析 --------------选择排序------------- 1、选择排序思想 2、示例代码 3、效率分析 ---------------堆排序-------------- 1、堆排序思想 2、示例代码 3、效率分析 --------------冒泡排序------------- 1、冒泡排序思想 2、示例代码 3、效率分析 上述五大排序性能对比: --------------插入排序------------- 1、插入排序思想 插入排序的核心思想是逐步构建有序序列: 将数组分为 “已排序” 和 “未排序” 两部分,初始时已排序部分只包含第一个元素。 每次从未排序部分取出第一个元素,将其向前插入到已排序序列中的正确位置,使得插入后的序列依然保持有序。

By Ne0inhk
【C语言】排序算法——快速排序详解(含多种变式)!!!

【C语言】排序算法——快速排序详解(含多种变式)!!!

【C语言】排序算法——快速排序详解(含多种变式)!!! * 前言 * 一 、快速排序(初阶) * 1. 视频演示 * 2. 算法思想 * 3. 实现思路 * (1)定key值 * (2)大小交换 * (3)循环 * (4)交换key * (5)分割区间 * (6)结束 * 4. 实现代码 * 二 、快速排序(中阶) * 1. 存在的问题 * 2. 优化(三数取中) * 3. 实现代码(中阶) * 三 、快速排序(高阶) * 1. 仍存在的问题 * 2. 优化(小区间优化) * 3. 实现代码(高阶)

By Ne0inhk
计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例 * 一、前言 * 二、三维人体姿态估计概述 * 2.1 定义与目标 * 2.2 应用场景 * 2.3 面临的挑战 * 三、前沿算法介绍 * 3.1 基于深度学习的方法 * 3.2 多视角方法 * 3.3 结合传感器的方法 * 四、算法对比与分析 * 4.1 不同算法的性能比较 * 4.2 适用场景分析 * 五、数据集介绍 * 5.1 常用数据集概述 * 5.2 数据集特点与应用 * 六、未来发展趋势 * 6.1 算法优化方向 * 6.2 新兴技术融合

By Ne0inhk