CANoe: Как выбрать и запустить тестовые случаи из XML Тестовый модуль из Python с использованием интерфейса CANoe COM? - PullRequest
0 голосов
/ 30 января 2020


В настоящее время я могу:

  • запустить приложение CANoe
  • загрузить файл конфигурации CANoe
  • загрузить файл настройки теста

    def load_test_setup(self, canoe_test_setup_file: str = None) -> None:
        logger.info(
            f'Loading CANoe test setup file <{canoe_test_setup_file}>.')
    
        if self.measurement.Running:
            logger.info(
                f'Simulation is currently running, so new test setup could \
                not be loaded!')
            return
    
        self.test_setup.TestEnvironments.Add(canoe_test_setup_file)
    
        test_environment = self.test_setup.TestEnvironments.Item(1)
        logger.info(f'Loaded test environment is <{test_environment.Name}>.')
    


Как получить доступ к XML тестовому модулю, загруженному с настройкой теста (tse) файл и выбрать тесты для выполнения?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Последняя строка в вашем фрагменте, скорее всего, является причиной проблемы. Я пытался исправить эту проблему уже довольно давно и, наконец, нашел решение.

Каким-то образом при выполнении строки self.test_setup.TestEnvironments.Item(1)

win32com создает объект типа TestSetupItem, который не имеет необходимых свойств или методов для доступа к тестам. Вместо этого мы хотим получить доступ к объектам типов коллекции TestSetupFolders или TestModules. win32com создает объект типа TestSetupItem, хотя у меня есть один XML тестовый модуль (называемый AutomationTestSeq) в тестовой среде, поскольку вы можете увидеть здесь .

Существует три возможных решения. что я нашел.


  1. Очистка сгенерированного кэша вручную перед каждым запуском.

Использование 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)
0 голосов
/ 31 января 2020

Просто продолжите то, что вы сделали.

TestEnvironment содержит TestModules. Каждый TestModule содержит TestSequence, который, в свою очередь, содержит TestCases.

Помните, что вы не можете создавать отдельные TestCases, а только TestModule. Но вы можете включать и отключать отдельные TestCases перед выполнением, используя COM-API.

(, набрав это из головы, может не работать 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 также может содержать другие TestSequence (например, TestGroup). Это зависит от того, как настроен ваш TestModule. Если это так, вы должны позаботиться об этом в своем l oop и спуститься в эти TestGroups во время поиска интересующего вас TestCase.

...