Последняя строка в вашем фрагменте, скорее всего, является причиной проблемы. Я пытался исправить эту проблему уже довольно давно и, наконец, нашел решение.
Каким-то образом при выполнении строки self.test_setup.TestEnvironments.Item(1)
win32com создает объект типа TestSetupItem
, который не имеет необходимых свойств или методов для доступа к тестам. Вместо этого мы хотим получить доступ к объектам типов коллекции TestSetupFolders
или TestModules
. win32com создает объект типа TestSetupItem
, хотя у меня есть один XML тестовый модуль (называемый AutomationTestSeq) в тестовой среде, поскольку вы можете увидеть здесь .
Существует три возможных решения. что я нашел.
- Очистка сгенерированного кэша вручную перед каждым запуском.
Использование win32com.client.DispatchWithEvents
или win32com.client.gencache.EnsureDispatch
создает кучу файлов python которые описывают объектную модель CANoe.
Если вы использовали один из них ранее, TestEnvironments.Item(1)
всегда будет возвращать TestSetupItem
вместо более подходящих объектов типа.
Чтобы удалить кеш, вам нужно удалить папку C:\Users\{username}\AppData\Local\Temp\gen_py\{python version}
.
Делать это каждый раз, конечно, не очень удобно.
Заставить win32com всегда использовать динамическую c диспетчеризацию. Вы можете сделать это, используя:
canoe = win32com.client.dynamic.Dispatch("CANoe.Application")
Любые объекты, которые вы создаете с помощью canoe
, теперь будут динамически отправляться.
Форсировать Dynami c легче чем вручную очищать папку кеша каждый раз. Это дало мне хорошие результаты всегда. Но выполнение этого не позволит вам иметь представление о предметах. Вы не сможете увидеть приемлемые свойства и методы для объектов.
Typecast
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)