python通过COM接口调用CANoe工具实现相关操作以及使用API接口跑CAPL的自动化脚本

使用Python来操作CANoe(一个用于汽车总线系统设计、分析、仿真和测试的强大工具),你可以借助win32com库来实现。这涉及到使用COM接口来控制CANoe。以下是一个示例,演示了如何使用Python通过win32com库来操作CANoe。

一、前提条件
安装Python和win32com库:

确保你已经安装了Python环境。
安装pywin32库,可以通过pip install pywin32来安装。
确保CANoe已安装并配置了COM接口。

示例代码
下面的代码展示了如何启动CANoe,打开一个CANoe工程,并开始仿真。

import win32com.client

def main():
    # 创建CANoe应用程序对象
    canoe = win32com.client.Dispatch('CANoe.Application')

    # 打开一个CANoe工程
    project_path = r"C:\Path\To\Your\CANoe\Project\YourProject.cfg"
    canoe.Open(project_path)

    # 检查工程是否成功打开
    if canoe.Configuration is None:
        print("Failed to open CANoe project.")
        return

    # 启动仿真
    canoe.Measurement.Start()

    # 等待仿真运行
    while not canoe.Measurement.Running:
        pass

    print("Simulation started.")

    # 进行一些操作,示例中等待10秒
    import time
    time.sleep(10)

    # 停止仿真
    canoe.Measurement.Stop()

    # 关闭CANoe应用程序
    canoe.Quit()
    print("Simulation stopped and CANoe application closed.")

if __name__ == "__main__":
    main()

二、详细步骤解释
导入库:

import win32com.client: 导入win32com.client库,用于与COM对象进行交互。
创建CANoe应用程序对象:

canoe = win32com.client.Dispatch(‘CANoe.Application’): 创建CANoe应用程序对象,这相当于启动CANoe。
打开CANoe工程:

canoe.Open(project_path): 打开指定路径的CANoe工程文件。请确保替换project_path为你实际的工程文件路径。
检查工程是否成功打开:

if canoe.Configuration is None: 检查工程是否成功打开,如果未成功打开,输出错误信息并返回。
启动仿真:

canoe.Measurement.Start(): 启动CANoe仿真。
while not canoe.Measurement.Running: 等待仿真开始运行。
执行操作:

在仿真运行期间,可以执行一些操作,例如发送消息、记录数据等。示例代码中只是等待10秒。
停止仿真:

canoe.Measurement.Stop(): 停止CANoe仿真。
关闭CANoe应用程序:

canoe.Quit(): 关闭CANoe应用程序。
三、注意事项
确保CANoe的COM接口已正确配置并可以被外部程序访问。
路径和文件名应根据你的实际项目进行调整。
可以添加更多的功能,例如发送和接收CAN消息、记录日志等,具体取决于你的需求。
通过上述步骤,你可以使用Python脚本来自动化和控制CANoe的操作,极大地提高了测试和仿真的效率。

四、CANoe API Code
工作中由我自己开发的脚本源码,用于CANoe的工具开发,欢迎大家借鉴!!!

# -*- coding:utf8 -*-

import time
import os
import subprocess
import chardet
from win32com.client import *
from win32com.client.connect import *

def DoEvents():
    pythoncom.PumpWaitingMessages()
    time.sleep(.5)

def DoEventsUntil(cond):
    t= time.perf_counter()
    while not cond():
        DoEvents()
        if time.perf_counter() -t > 180:
            print(time.perf_counter() -t)
            break

def KILL_CANOE():
    # command = 'taskkill /F /IM CANoe64.exe'
    # os.system(command)
    # time.sleep(3)
    killcanoeprocess_cmd = "taskkill /F /IM CANoe64.exe"
    stdout, stderr = subprocess.Popen(killcanoeprocess_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    stdout_e = chardet.detect(stdout)["encoding"]
    stderr_e = chardet.detect(stderr)["encoding"]
    if stdout_e is None:
        stdout_s = ""
    else:
        stdout_s = stdout.decode(stdout_e).strip()
    if stderr_e is None:
        stderr_s = ""
    else:
        stderr_s = stderr.decode(stderr_e).strip()
    # stderr_s = str(stderr, encoding="UTF-8").strip()
    # stdout_s = str(stdout, encoding="UTF-8").strip()
    if stderr_s == "" and ("SUCCESS" in stdout_s or "成功" in stdout_s):
        return True
    else:
        return False

class CanoeSync(object):
    """Wrapper class for CANoe Application object"""
    AppOpened = False
    AppStopped = False
    Started = False
    Stopped = False
    Report_Generate = False
    ConfigPath = ""

    def __init__(self):
        app = DispatchEx('CANoe.Application')
        # app.Configuration.Modified = False
        ver = app.Version
        print('Loaded CANoe version ',
              ver.major, '.',
              ver.minor, '.',
              ver.Build, '...', sep='')
        self.App = app
        self.Measurement = app.Measurement
        self.Running = lambda: self.Measurement.Running
        self.WaitForStart = lambda: DoEventsUntil(lambda: CanoeSync.Started)
        self.WaitForStop = lambda: DoEventsUntil(lambda: CanoeSync.Stopped)
        self.WaitForAppStart = lambda: DoEventsUntil(lambda: CanoeSync.AppOpened)
        self.WaitForAppStop = lambda: DoEventsUntil(lambda: CanoeSync.AppStopped)
        # self.WaitForGenReport = lambda: DoEventsUntil(lambda: CanoeSync.Report_Generate)
        WithEvents(self.App.Measurement, CanoeMeasurementEvents)
        WithEvents(self.App, CanoeAppEvents)

    def Load(self, cfgPath):
        # current dir must point to the script file
        cfg = os.path.join(os.curdir, cfgPath)
        cfg = os.path.abspath(cfg)
        print('Opening: ', cfg)
        self.ConfigPath = os.path.dirname(cfg)
        self.Configuration = self.App.Configuration
        self.App.Open(cfg)
        self.WaitForAppStart()

    def LoadTestSetup(self, testsetup):
        self.TestSetup = self.App.Configuration.TestSetup
        path = os.path.join(self.ConfigPath, testsetup)
        testenv = self.TestSetup.TestEnvironments.Add(path)
        testenv = CastTo(testenv, "ITestEnvironment2")
        # TestModules property to access the test modules
        self.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 = testcfgname
        tus = CastTo(tc.TestUnits, "ITestUnits2")
        for tu in testunits:
            tus.Add(tu)
        # TestConfigs property to access the test configuration
        self.TestConfigs = [CanoeTestConfiguration(tc)]

    def Start_bak(self):
        if not self.Running():
            self.Measurement.Start()
            self.WaitForStart()

    # def CANOE_WriteWindows(self,path):
    #     app = DispatchEx('CANoe.Application')
    #     # app.UI.Write.Output("Hello world!")
    #     # path = "D:\System.TXT"
    #     app.UI.Write.EnableOutputFile(path),0
    #     # print(1421,app.UI.Write.Copy())
    def Start(self):
        if not self.Running():
            self.Measurement.Start()
            self.WaitForStart()
            # print(110)
        if not self.Running():
            # command = 'taskkill /F /IM CANoe64.exe'
            # os.system(command)
            print(open('CANOE 启动失败,请检查工程和环境配置是否报错'))
            # sys.exit(1)

    def Stop(self):
        if self.Running():
            # self.WaitForGenReport()
            # self.Measurement.Stop() #Canoe old stop interface
            self.Measurement.StopEx()

            self.WaitForStop()
        # self.App.Configuration.Modified = False
        # self.App.Quit()

    def savecanoecfg(self):
        self.App.Configuration.Save()

    def savetestenvironment(self,testenvindex=1):
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvindex)
        testenvironment = CastTo(testenvironment, "ITestEnvironment")
        testenvironment.Save()

    def app_quit(self):
        # self.App.Configuration.Modified = False
        self.App.Quit()
        self.WaitForAppStop()

    def checkTestModulesorTestConfigs(self):
        testmodule_tag = False
        testconfig_tag = False
        testenvs = self.App.Configuration.TestSetup.TestEnvironments
        testenvs_count = testenvs.Count
        for c in range(1,testenvs_count+1):
            testenvironment = testenvs.Item(c)
            if testenvironment.Enabled is True:
                print("testenvironment:%s enabled" % testenvironment.Name)
                testenvironment = CastTo(testenvironment, "ITestEnvironment2")
                testmodules = testenvironment.TestModules
                testmodules_count = testmodules.Count
                for m in range(1,testmodules_count+1):
                    testmodule = testmodules.Item(m)
                    if testmodule.Enabled is True:
                        print("testmodule:%s enabled" % testmodule.Name)
                        testmodules_Modules = testmodule.Modules
                        testmodules_Modules_Count = testmodules_Modules.Count
                        # print("testmodules_Modules_Count:",testmodules_Modules_Count)
                        for m in range(1, testmodules_Modules_Count + 1):
                            testmodules_Modules_item = testmodules_Modules.Item(m)
                            if testmodules_Modules_item.Enabled is True:
                                print("testmodules_Modules_item:%s enabled" % testmodules_Modules_item.Name)
                                testmodule_tag = True
                                break
                        if testmodule_tag is True:
                            break
                        testmodules_Sequence = testmodule.Sequence
                        # if testmodules_Sequence:
                        testmodules_Sequence_Count = testmodules_Sequence.Count
                        # print("testmodules_Sequence_Count:",testmodules_Sequence_Count)
                        # if testmodules_Sequence_Count != 0:
                        for ss in range(1, testmodules_Sequence_Count + 1):
                            testmodules_Sequence_item = testmodules_Sequence.Item(ss)
                            if testmodules_Sequence_item.Enabled is True:
                                print("testmodules_Sequence_item:%s enabled" % testmodules_Sequence_item.Name)
                                testmodule_tag = True
                                break
                        if testmodule_tag is True:
                            break
                        testmodule = CastTo(testmodule, "ITSTestModule7")
                        testmodules_SequenceEx = testmodule.SequenceEx
                        testmodules_SequenceEx_Count = testmodules_SequenceEx.Count
                        # print("testmodules_SequenceEx_Count:",testmodules_SequenceEx_Count)
                        for s in range(1, testmodules_SequenceEx_Count + 1):
                            testmodules_SequenceEx_item = testmodules_SequenceEx.Item(s)
                            if testmodules_SequenceEx_item.Enabled is True:
                                print("testmodules_SequenceEx_item:%s enabled" % testmodules_SequenceEx_item.Name)
                                testmodules_SequenceEx_item_sequence_count = testmodules_SequenceEx_item.SequenceEx.Count
                                if testmodules_SequenceEx_item_sequence_count != 0:
                                    testmodule_tag = True
                                    break
                        if testmodule_tag is True:
                            break
        tstconfigurations = self.App.Configuration.TestConfigurations
        tstconfigurations_count = tstconfigurations.Count
        for c in range(1,tstconfigurations_count+1):
            tstconfiguration = tstconfigurations.Item(c)
            if tstconfiguration.Enabled is True:
                print("%s enabled" % tstconfiguration.Name)
                tstunits = tstconfiguration.TestUnits
                tstunits_count = tstunits.Count
                for t in range(1,tstunits_count+1):
                    tstunit = tstunits.Item(t)
                    if tstunit.Enabled is True:
                        print("%s enabled" % tstunit.Name)
                        testconfig_tag = True
                        break
                if testconfig_tag is True:
                    break
        return [testmodule_tag,testconfig_tag]

    def EnableTestModuleTestcasebak(self, testcases, testsequencename, testmoduleindex=1, testenvindex=1):
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvindex)
        testenvironment = CastTo(testenvironment, "ITestEnvironment2")
        testmodule = testenvironment.TestModules.Item(testmoduleindex)
        testmodule = CastTo(testmodule, "ITSTestModule7")
        testmodules_SequenceEx = testmodule.SequenceEx
        if testsequencename is None:
            testmodules_SequenceEx_item = testmodules_SequenceEx.Item(1)
        else:
            testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequencename)
        testmodules_SequenceEx_item.Enabled = False
        print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
        testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
        testcase_except = []
        for i in testcases:
            try:
                testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
                testcaseinfos.Enabled = True
                print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
                    testcaseinfos.Name, testcaseinfos.Ident,
                    testcaseinfos.Type, testcaseinfos.Enabled,
                    testcaseinfos.Verdict))
            except:
                testcase_except.append(i)
        return testcase_except

    def EnableTestModuleTestcase(self, testcases, testsequencename, testmoduleindex=1, testenvindex=1):
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvindex)
        testenvironment = CastTo(testenvironment, "ITestEnvironment2")
        testmodule = testenvironment.TestModules.Item(testmoduleindex)
        # testmodules_Sequence = testmodule.Sequence
        testmodule = CastTo(testmodule, "ITSTestModule7")
        testmodules_SequenceEx = testmodule.SequenceEx
        testmodules_SequenceEx_Count = testmodules_SequenceEx.Count
        for i in range(1, testmodules_SequenceEx_Count + 1):
            testmodules_SequenceEx.Item(i).Enabled = False
        if testsequencename is None:
            testmodules_SequenceEx_item = testmodules_SequenceEx.Item(1)
        else:
            testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequencename)
        print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
        testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
        testcase_except = []
        for i in testcases:
            try:
                testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
                testcaseinfos.Enabled = True
                print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
                testcaseinfos.Name, testcaseinfos.Ident,
                testcaseinfos.Type, testcaseinfos.Enabled,
                testcaseinfos.Verdict))
            except:
                testcase_except.append(i)
        return testcase_except

    def EnableTestModuleTestcase_test(self, testcases, testsequencename, testmoduleindex=1, testenvindex=1):
        #testenvironment_name = self.App.Configuration.TestSetup.TestEnvironments.Name   error:no Name attribute
        # testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvindex)
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item("Test Environment")
        testenvironment = CastTo(testenvironment, "ITestEnvironment2")
        # testmodule_name = testenvironment.TestModules.Name  error:no Name attribute
        # print("testmodule_name:",testmodule_name)
        testmodule = testenvironment.TestModules.Item("Test 24")
        # testmodule = testenvironment.TestModules.Item(testmoduleindex)
        # testmodules_Sequence = testmodule.Sequence
        testmodule = CastTo(testmodule, "ITSTestModule7")
        testmodules_SequenceEx = testmodule.SequenceEx
        testmodules_SequenceEx_Count = testmodules_SequenceEx.Count
        print("testmodules_SequenceEx_Count:",testmodules_SequenceEx_Count)
        for i in range(1, testmodules_SequenceEx_Count + 1):
            testmodules_SequenceEx.Item(i).Enabled = False
            print("name:",testmodules_SequenceEx.Item(i).Name)
            print("count:",testmodules_SequenceEx.Item(i).SequenceEx.Count)

        # if testsequencename is None:
        #     testmodules_SequenceEx_item = testmodules_SequenceEx.Item(1)
        # else:
        #     testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequencename)
        # print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
        # testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
        # testcase_except = []
        # for i in testcases:
        #     try:
        #         testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
        #         testcaseinfos.Enabled = True
        #         print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
        #         testcaseinfos.Name, testcaseinfos.Ident,
        #         testcaseinfos.Type, testcaseinfos.Enabled,
        #         testcaseinfos.Verdict))
        #     except:
        #         testcase_except.append(i)
        # return testcase_except

    def EnableTestModuleTestcaseV2(self, testcases, testsequencename, testmodulename, testenvname):
        try:
            testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvname)
            testenvironment = CastTo(testenvironment, "ITestEnvironment2")
            testmodule = testenvironment.TestModules.Item(testmodulename)
            if (testsequencename is None) or (testcases is None):
                testmodule.Enabled = True
                return True
            else:
                # testmodules_Sequence = testmodule.Sequence
                testmodule = CastTo(testmodule, "ITSTestModule7")
                testmodules_SequenceEx = testmodule.SequenceEx
                testmodules_SequenceEx_Count = testmodules_SequenceEx.Count
                for i in range(1, testmodules_SequenceEx_Count + 1):
                    testmodules_SequenceEx.Item(i).Enabled = False
                if testsequencename is None:
                    testmodules_SequenceEx_item = testmodules_SequenceEx.Item(1)
                else:
                    testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequencename)
                print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
                if testcases == "*":
                    testmodules_SequenceEx_item.Enabled = True
                    return True
                elif isinstance(testcases,list):
                    testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
                    testcase_except = []
                    for i in testcases:
                        try:
                            testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
                            testcaseinfos.Enabled = True
                            print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
                            testcaseinfos.Name, testcaseinfos.Ident,
                            testcaseinfos.Type, testcaseinfos.Enabled,
                            testcaseinfos.Verdict))
                        except:
                            testcase_except.append(i)
                    return testcase_except
                else:
                    return False
        except:
            return False

    def GetTestModuleTestcase(self, testcases, testenvindex=1, testmoduleindex=1, testsequenceindex=1):
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvindex)
        testenvironment = CastTo(testenvironment, "ITestEnvironment2")
        testmodule = testenvironment.TestModules.Item(testmoduleindex)
        testmodule = CastTo(testmodule, "ITSTestModule7")
        testmodules_SequenceEx = testmodule.SequenceEx
        testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequenceindex)
        print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
        testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
        for i in testcases:
            testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
            testcaseinfos.Enabled = True
            print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
                testcaseinfos.Name, testcaseinfos.Ident,
                testcaseinfos.Type, testcaseinfos.Enabled,
                testcaseinfos.Verdict))

    def GetTestModuleTestcaseV2(self, testcases, testsequencename, testmodulename, testenvname):
        testenvironment = self.App.Configuration.TestSetup.TestEnvironments.Item(testenvname)
        testenvironment = CastTo(testenvironment, "ITestEnvironment2")
        testmodule = testenvironment.TestModules.Item(testmodulename)
        testmodule = CastTo(testmodule, "ITSTestModule7")
        testmodules_SequenceEx = testmodule.SequenceEx
        testmodules_SequenceEx_item = testmodules_SequenceEx.Item(testsequencename)
        print("testmodules_SequenceEx_item enable:", testmodules_SequenceEx_item.Enabled)
        testmodules_SequenceEx_item_sequence = testmodules_SequenceEx_item.SequenceEx
        for i in testcases:
            testcaseinfos = testmodules_SequenceEx_item_sequence.Item(i)
            testcaseinfos.Enabled = True
            print("Name:%s,Ident:%s,Type:%s,Enabled:%s,Verdict:%s" % (
                testcaseinfos.Name, testcaseinfos.Ident,
                testcaseinfos.Type, testcaseinfos.Enabled,
                testcaseinfos.Verdict))

    def RunTestModules(self):
        testenvs = self.App.Configuration.TestSetup.TestEnvironments
        self.TestModules = []
        for c in range(1, testenvs.Count + 1):
            testenv = CastTo(testenvs.Item(c), "ITestEnvironment2")
            self.TraverseTestItem(testenv, lambda tm: self.TestModules.append(CanoeTestModule(tm)))
        """ starts all test modules and waits for all of them to finish"""
        # start all test modules
        for tm in self.TestModules:
            tm.Start()
        # wait for test modules to stop
        # while not any([not tm.Enabled or tm.IsDone() or tm.ReportGenerate() for tm in self.TestModules]):
        #     DoEvents()

        # wait for test modules to stop and report generated succeed
        while not any([not tm.Enabled or tm.IsDone() and tm.ReportGenerate() for tm in self.TestModules]):
            DoEvents()

        for tm in self.TestModules:
            tm.Report_Generate()

    def RunTestModules_test(self):
        self.TestSetup = self.App.Configuration.TestSetup
        testenv_count = self.TestSetup.TestEnvironments.Count
        print("testenv_count:",testenv_count)
        testenv = self.TestSetup.TestEnvironments.Item(1)
        testenv = CastTo(testenv, "ITestEnvironment2")
        testmodules = testenv.TestModules
        testmodules_count = testmodules.Count
        print("testmodules_count:",testmodules_count)
        ts_testmodule = testmodules.Item(1)
        print("fullname:",ts_testmodule.FullName)
        print("name:",ts_testmodule.Name)
        print("path:",ts_testmodule.Path)
        '''
        testenv = self.TestSetup.TestEnvironments.Item(1)
        testenv = CastTo(testenv, "ITestEnvironment2")
        # TestModules property to access the test modules
        self.TestModules = []
        self.TraverseTestItem(testenv, lambda tm: self.TestModules.append(CanoeTestModule(tm)))
        """ starts all test modules and waits for all of them to finish"""
        # start all test modules
        for tm in self.TestModules:
            tm.Start()
        # wait for test modules to stop
        while not any([not tm.Enabled or tm.IsDone() for tm in self.TestModules]):
            DoEvents()
        '''

    def RunTestConfigs(self):
        """ starts all test configurations and waits for all of them to finish"""
        # start all test configurations
        for tc in self.TestConfigs:
            tc.Start()

        # wait for test modules to stop
        while not all([not tc.Enabled or tc.IsDone() for tc in self.TestConfigs]):
            DoEvents()

    def RunTestConfigs_SaveLast(self):
        tstconfigurations = self.App.Configuration.TestConfigurations
        self.TestConfigs = []
        for c in range(1, tstconfigurations.Count + 1):
            self.TestConfigs.append(CanoeTestConfiguration(tstconfigurations.Item(c)))
        """ starts all test configurations and waits for all of them to finish"""
        tcs = list(filter(lambda i: i.Enabled == True, self.TestConfigs))
        """ starts all test configurations and waits for all of them to finish"""
        # start all test configurations
        for tc in tcs:
            tc.Start()

        # wait for test modules to stop
        # while not all([not tc.Enabled or tc.IsDone() for tc in tcs]):
        #     DoEvents()

        # wait for test modules to stop and report generated succeed
        while not all([not tc.Enabled or tc.IsDone() and tc.ReportGenerate() for tc in tcs]):
            DoEvents()

        for tc in tcs:
            tc.Report_Generate()

    def RunTestConfigs_CheckCANoeStop(self):
        tc = self.App.Configuration.TestConfigurations.Item(1)
        # tc.Name = testcfgname
        # TestConfigs property to access the test configuration
        self.TestConfigs = [CanoeTestConfiguration(tc)]

        for tc in self.TestConfigs:
            tc.Start()

        # wait for test modules to stop
        while self.Running():
            DoEvents()

    def TraverseTestItem(self, parent, testf):
        for test in parent.TestModules:
            testf(test)
        for folder in parent.Folders:
            found = self.TraverseTestItem(folder, testf)

    def VTSystem(self, vtcfg):
        self.vts = self.App.Configuration.VTSystem
        # Get the VT System configuration instance
        # Export and import a configuration
        # self.vts.ExportConfiguration("D:\MyConfiguration.vtcfg")
        self.vts.ImportConfiguration(vtcfg, 0)  # Appends to the current config
        # self.vts.ImportConfiguration("D:\MyConfiguration.vtcfg", 1)  # Replace current config
        # Create a new configuration based on the connected hardware
        # self.vts.NewConfigurationFromHardware()
        # Adapt the existing configuration to the connected hardware
        self.vts.AdaptToHardware()
        # Import a module description into CANoe
        # vts.ImportModuleDescription("D:\MyModuleDescription.xml")
        # Switch all modules offline/online
        self.vts.SetAllModulesOffline()
        self.vts.SetAllModulesOnline()
        # Access a module or channel by its name
        # myModule = vts.GetModuleByName("M1_VT1004")
        # myChannel = vts.GetChannelByName("M1_Ch1")
        self.App.Configuration.Save()

class CanoeAppEvents(object):
    """Handler for CANoe Application events"""
    def OnOpen(self,fullname):
        CanoeSync.AppOpened = True
        print("*** < CANoe Application CFG:%s Opened > ***" % fullname)

    def OnQuit(self):
        CanoeSync.AppStopped = True
        print("*** < CANoe Application closed > ***")

class CanoeMeasurementEventsbak(object):
    """Handler for CANoe measurement events"""

    def OnStart(self):
        CanoeSync.Started = True
        CanoeSync.Stopped = False
        print("< measurement started >")

    def OnStop(self):
        CanoeSync.Started = False
        CanoeSync.Stopped = True
        print("< measurement stopped >")

class CanoeMeasurementEvents(object):
    """Handler for CANoe measurement events"""

    def OnStart(self):
        CanoeSync.Started = True
        CanoeSync.Stopped = False
        print("< measurement started >")

    def OnStop(self):
        CanoeSync.Started = False
        CanoeSync.Stopped = True
        print("< measurement stopped >")


class CanoeTestModule:
    """Wrapper class for CANoe TestModule object"""

    def __init__(self, tm):
        self.tm = tm
        self.Events = DispatchWithEvents(tm, CanoeTestEvents)
        self.Name = tm.Name
        self.IsDone = lambda: self.Events.stopped
        self.ReportGenerate = lambda: self.Events.Report_Generate
        self.Enabled = tm.Enabled

    def Start(self):
        if self.tm.Enabled:
            self.tm.Start()
            self.Events.WaitForStart()

    def Report_Generate(self):
        if self.IsDone():
            self.Events.WaitForReportGenerate()

class CanoeTestConfiguration:
    """Wrapper class for a CANoe Test Configuration object"""

    def __init__(self, tc):
        self.tc = tc
        self.Name = tc.Name
        self.Events = DispatchWithEvents(tc, CanoeTestEvents)
        self.TestConfigureportGeneratEvents = DispatchWithEvents(tc.Report,CanoeTestConfigureportEvents)
        self.IsDone = lambda: self.Events.stopped
        self.ReportGenerate = lambda: self.TestConfigureportGeneratEvents.Report_Generate
        self.Enabled = tc.Enabled

    def Start(self):
        if self.tc.Enabled:
            self.tc.Start()
            self.Events.WaitForStart()

    def Report_Generate(self):
        if self.IsDone():
            self.TestConfigureportGeneratEvents.WaitForReportGenerate()

class CanoeTestEvents:
    """Utility class to handle the test events"""

    def __init__(self):
        self.started = False
        self.stopped = False
        self.Report_Generate = False
        self.WaitForStart = lambda: DoEventsUntil(lambda: self.started)
        self.WaitForStop = lambda: DoEventsUntil(lambda: self.stopped)
        self.WaitForReportGenerate = lambda: DoEventsUntil(lambda: self.Report_Generate)

    def OnStart(self):
        self.started = True
        self.stopped = False
        print("<", self.Name, " started >")

    def OnStop(self, reason):
        self.started = False
        self.stopped = True
        print("<", self.Name, " stopped >")

    def OnReportGenerated(self, success, sourceFullName, generatedFullName):
        if success:
            self.Report_Generate = True
            print("<", self.Name, " report Generated succeed. >")
            print("sourceFullName:", sourceFullName)
            print("generatedFullName:", generatedFullName)
        else:
            print("<", self.Name, " report Generated Failed. >")

class CanoeTestConfigureportEvents:
    """Utility class to handle the test configure report generate event"""

    def __init__(self):
        self.Report_Generate = False
        self.WaitForReportGenerate = lambda: DoEventsUntil(lambda: self.Report_Generate)

    def OnGenerated(self, success, sourceFullName, generatedFullName):
        if success:
            self.Report_Generate = True
            print("[INFO]<", self.FullPath, " report Generated succeed. >")
            print("sourceFullName:", sourceFullName)
            print("generatedFullName:", generatedFullName)
        else:
            print("[ERROR]<", self.FullPath, " report Generated Failed. >")

if __name__ == "__main__":
    app = CanoeSync()
    app.Stop()
    cfg_path = r"D:\jenkins_home\workspace\ZEEKR\ZEEKR_718BE028_ZECU_1_SMOKE_Level2\LIN_Interface\LIN_Interface\CANoeConfig\LIN_Interface.cfg"
    # cfg_path = r"D:\test\test01.cfg"
    app.Load(cfg_path)
    # app.LoadTestSetup(r"D:\test\b1.tse")
    # app.Start()
    # testcase_except = app.EnableTestModuleTestcase_test(["test091911"],None)
    # testcase_except = app.EnableTestModuleTestcaseV2(["LIN1_0x1C_sig_tx_CcvmCmdVlvCalibReq_ZCL_LIN1_ZCL_LIN1_startvalue"],"LIN1_TX_Sig_startvalue","Test 24","Test Environment")
    # print(testcase_except)
    testcase_except = app.EnableTestModuleTestcaseV2("*", "LIN1_TX_Sig_startvalue", "Test 24", "Test Environment")

    # app.GetTestModuleTestcaseV2(["LIN1_0x1C_sig_tx_CcvmCmdVlvCalibReq_ZCL_LIN1_ZCL_LIN1_startvalue"],"LIN1_TX_Sig_startvalue","Test 24","Test Environment")
    # app.RunTestModules()
    # app.Stop()
    # app.GetTestModuleTestcase(["test0919"])
    # app.savetestenvironment()
    # app.savecanoecfg()
    # app.app_quit()
    print("finished")

五、对CANoe API的使用【源码】

 def runCANoeScript()
        for i in range(3):
            executeflag = True
            notexecutestcases = []

            try:
                app = CanoeSync()
                app.Stop()
                app.Load(cfg_path)
                if os.path.exists(vtcfg_path):
                    print("Import CANoe VT Cfg:%s"%vtcfg_path)
                    app.VTSystem(vtcfg_path)
                    time.sleep(.3)
                if executeflag is True:
                    print("[INFO]:%s:All testcases are enabled succeed." % (fc_type))
                    if "_Release" in fc_is_tags:
                        record_fcresult(ctresult_infos, "%s_testcase" % tags_name, "AllEnable")
                    else:
                        record_fcresult(ctresult_infos, "%s_testcase" % fc_type, "AllEnable")
                else:
                    print("[ERROR]:%s:Not all testcases are enabled,please check!!!" % (fc_type))
                    if "_Release" in fc_is_tags:
                        record_fcresult(ctresult_infos, "%s_testcase" % tags_name, "AllEnable")
                    else:
                        record_fcresult(ctresult_infos, "%s_testcase" % fc_type, "AllEnable")

                time.sleep(.10)
                testmodule, testconfig = app.checkTestModulesorTestConfigs()
                print("testmodule:%s,testconfig:%s" % (testmodule, testconfig))
                if testconfig is True:
                    build_vts_log = r"%s\%s_vtestudio_build.log" % (j_workspace, fc_type)
                    vts_pro = r"%s\TestConfiguration\%s.vtsoproj" % (pro_path, fc_type)
                    build_cmd = r"%s\CT_TOOLS\thirdpart_tools\TestUnitBuildCLI\Exec64\TestUnitBuildCLI.exe -v --tu=%s %s > %s" % (
                    j_workspace, fc_type, vts_pro, build_vts_log)
                    os.system(build_cmd)
                    time.sleep(.1)
                    # with open(build_vts_log,"r",encoding="UTF-8") as fp:
                    with open(build_vts_log, "r") as fp:
                        f_content = fp.read()
                    fp.close()

                    if "Compilation succeeded" in f_content and "Build succeeded" in f_content and "0 errors" in f_content:
                        print("[SUCCESS]: Compile %s" % vts_pro)
                    else:
                        print("[ERROR]: Compile %s,please check!!!!" % vts_pro)
                        if "_Release" in fc_is_tags:
                            record_fcresult(ctresult_infos, tags_name, "Except")
                        else:
                            record_fcresult(ctresult_infos, fc_type, "Except")
                        exit(-1)
                    app.Start()
                    time.sleep(.2)
                    app.RunTestConfigs_SaveLast()
                if testmodule is True:
                    app.Start()
                    time.sleep(.2)
                    app.RunTestModules()
                time.sleep(.2)

            except Exception as e:
                print(f"dddd{e}")
希望对大家有帮助!!!!!!!!!!!
  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值