目前,我能够:
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测试模块并选择要执行的测试?
发布于 2020-03-14 02:35:03
代码片段中的最后一行很可能是造成问题的原因。我已经尝试了很长一段时间来解决这个问题,并最终找到了解决办法。
当您执行行self.test_setup.TestEnvironments.Item(1)时
win32com创建一个类型为TestSetupItem的对象,该对象不具有访问测试用例所需的属性或方法。相反,我们希望访问集合类型为TestSetupFolders或TestModules的对象。win32com创建TestSetupItem类型的对象,即使我在测试环境中有一个XML (称为AutomationTestSeq),就像您可以请看这里一样。
我找到了三种可能的解决方案。
使用win32com.client.DispatchWithEvents或win32com.client.gencache.EnsureDispatch生成一堆描述独木舟对象模型的python文件。
如果您以前使用过这两种方法,TestEnvironments.Item(1)将始终返回TestSetupItem,而不是更合适的类型对象。
要删除缓存,需要删除C:\Users\{username}\AppData\Local\Temp\gen_py\{python version}文件夹。
当然,每次这样做都不是很实际。
从现在起,使用canoe = win32com.client.dynamic.Dispatch("CANoe.Application")创建的任何对象都将被动态分派。
强制动态分派比每次手动清除缓存文件夹更容易。这一直给我很好的结果。但是这样做不会让你对物体有任何洞察力。您将无法看到对象的可接受属性和方法。
TestSetupItem转换为TestSetupFolders或TestModules。这样做的风险是,如果键入错误,就会得到意想不到的结果。但到目前为止对我来说效果很好。简而言之:win32.CastTo(test_env, "ITestEnvironment2")。这将确保您按照CANoe技术参考使用推荐的对象层次结构。
请注意,您还必须将TestSequenceItem类型转换为TestCase,才能访问测试用例判决并启用/禁用测试用例。
下面是一个不错的示例脚本。
"""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)发布于 2020-01-31 08:45:07
继续你所做的。
TestEnvironment包含TestModules。每个TestModule都包含一个TestSequence,而后者又包含TestCases。
请记住,您不能单独使用TestCases,而只能使用TestModule。但是您可以在执行之前通过使用COM-API启用和禁用单个TestCases。
(从我的头顶上输入这个,可能不会100%起作用)
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中。
https://stackoverflow.com/questions/59988764
复制相似问题