首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CANoe:如何使用CANoe COM接口从CANoe测试模块中选择和启动测试用例?

CANoe:如何使用CANoe COM接口从CANoe测试模块中选择和启动测试用例?
EN

Stack Overflow用户
提问于 2020-01-30 14:57:40
回答 2查看 2.9K关注 0票数 0

目前,我能够:

  • 启动CANoe应用程序
  • 加载CANoe配置文件
  • 加载测试设置文件

def load_test_setup(self,canoe_test_setup_file: str = None) -> None: logger.info( f‘’Loading测试设置文件<{canoe_test_setup_file}>‘)如果self.measurement.Running: logger.info( f‘模拟当前正在运行,那么新的测试设置就不能加载!)返回self.test_setup.TestEnvironments.Add(canoe_test_setup_file) test_environment = self.test_setup.TestEnvironments.Item(1) logger.info(f‘加载的测试环境为<{test_environment.Name}>’)。

如何访问带有测试设置(tse)文件的XML测试模块并选择要执行的测试?

EN

回答 2

Stack Overflow用户

发布于 2020-03-14 02:35:03

代码片段中的最后一行很可能是造成问题的原因。我已经尝试了很长一段时间来解决这个问题,并最终找到了解决办法。

当您执行行self.test_setup.TestEnvironments.Item(1)

win32com创建一个类型为TestSetupItem的对象,该对象不具有访问测试用例所需的属性或方法。相反,我们希望访问集合类型为TestSetupFoldersTestModules的对象。win32com创建TestSetupItem类型的对象,即使我在测试环境中有一个XML (称为AutomationTestSeq),就像您可以请看这里一样。

我找到了三种可能的解决方案。

  1. 每次运行前手动清除生成的缓存。

使用win32com.client.DispatchWithEventswin32com.client.gencache.EnsureDispatch生成一堆描述独木舟对象模型的python文件。

如果您以前使用过这两种方法,TestEnvironments.Item(1)将始终返回TestSetupItem,而不是更合适的类型对象。

要删除缓存,需要删除C:\Users\{username}\AppData\Local\Temp\gen_py\{python version}文件夹。

当然,每次这样做都不是很实际。

  1. 强制win32com始终使用动态调度。您可以使用以下方法来完成此操作:

从现在起,使用canoe = win32com.client.dynamic.Dispatch("CANoe.Application")创建的任何对象都将被动态分派。

强制动态分派比每次手动清除缓存文件夹更容易。这一直给我很好的结果。但是这样做不会让你对物体有任何洞察力。您将无法看到对象的可接受属性和方法。

  1. TestSetupItem转换为TestSetupFoldersTestModules

这样做的风险是,如果键入错误,就会得到意想不到的结果。但到目前为止对我来说效果很好。简而言之:win32.CastTo(test_env, "ITestEnvironment2")。这将确保您按照CANoe技术参考使用推荐的对象层次结构。

请注意,您还必须将TestSequenceItem类型转换为TestCase,才能访问测试用例判决并启用/禁用测试用例。

下面是一个不错的示例脚本。

代码语言:javascript
复制
"""Execute XML Test Cases without a pass verdict"""
import sys
from time import sleep
import win32com.client as win32

CANoe = win32.DispatchWithEvents("CANoe.Application")
CANoe.Open("canoe.cfg")

test_env = CANoe.Configuration.TestSetup.TestEnvironments.Item('Test Environment')

# Cast required since test_env is originally of type <ITestEnvironment>
test_env = win32.CastTo(test_env, "ITestEnvironment2")
# Get the XML TestModule (type <TSTestModule>) in the test setup
test_module = test_env.TestModules.Item('AutomationTestSeq')

# {.Sequence} property returns a collection of <TestCases> or <TestGroup>
# or <TestSequenceItem> which is more generic
seq = test_module.Sequence
for i in range(1, seq.Count+1):
    # Cast from <ITestSequenceItem> to <ITestCase> to access {.Verdict}
    # and the {.Enabled} property
    tc = win32.CastTo(seq.Item(i), "ITestCase")
    if tc.Verdict != 1: # Verdict 1 is pass
        tc.Enabled = True
        print(f"Enabling Test Case {tc.Ident} with verdict {tc.Verdict}")
    else:
        tc.Enabled = False
        print(f"Disabling Test Case {tc.Ident} since it has already passed")


CANoe.Measurement.Start()
sleep(5)   # Sleep because measurement start is not instantaneous
test_module.Start()
sleep(1)
票数 2
EN

Stack Overflow用户

发布于 2020-01-31 08:45:07

继续你所做的。

TestEnvironment包含TestModules。每个TestModule都包含一个TestSequence,而后者又包含TestCases。

请记住,您不能单独使用TestCases,而只能使用TestModule。但是您可以在执行之前通过使用COM-API启用和禁用单个TestCases。

(从我的头顶上输入这个,可能不会100%起作用)

代码语言:javascript
复制
test_module = test_environment.TestModules.Item(1) # of 2 or whatever
test_sequence = test_module.Sequence
for i in range(1, test_sequence.Count + 1):
    test_case = test_sequence.Item(i)
    if ...:
        test_case.Enabled = False # or True

test_module.Start()

您必须记住,TestSequence也可以包含其他TestSequences (即TestGroup)。这取决于TestModule的设置方式。如果是这样的话,您必须在循环中处理这个问题,并在搜索感兴趣的TestGroups时下降到这些TestCase中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59988764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档