Программирование с помощью API TestStand

Overview

В этом документе рассказывается об использовании API NI TestStand, который дополняет мощь и гибкость TestStand. API TestStand предлагает для всех возможностей TestStand объектно-ориентированный интерфейс. Для большинства основных приложений нет необходимости напрямую взаимодействовать с объектной моделью. Но если Вы поймете внутреннюю работу TestStand, то получите представление о том, что можно сделать для быстрого создания расширенных решений для TestStand.

Contents

Архитектура TestStand и API TestStand


Хорошо спроектированная модульная архитектура тестирования обладает огромной ценностью. В ряде систем тестирования Вы можете повторно использовать обобщенную, адаптируемую архитектуру, чтобы продлить срок службы системы и снизить затраты на разработку тестов. TestStand предоставляет модульную платформу, позволяющую упростить разработку систем тестирования и соответствующих тестов. Преимущество TestStand заключается в его открытой архитектуре, которую Вы можете использовать для создания сложных и гибких решений для тестирования.

Механизм TestStand обеспечивает функциональность для компонентов TestStand, которые взаимодействуют с механизмом через API TestStand.


TestStand имеет четкое разделение между уровнем представления (то, что видит пользователь) и уровнем бизнес-логики (действия, стоящие за действиями пользователя). Эти уровни взаимодействуют с помощью API TestStand. Этот подход позволяет расширять TestStand путем создания дополнительных компонентов, использующих механизм TestStand через API TestStand. Это создание специализированных интерфейсов пользователя, динамическое управление потоком тестов, создание последовательностей "на лету" и разработка других расширенных решений.

 

Архитектура TestStand API

Механизм TestStand (TestStand Engine) - это сервер автоматизации ActiveX/COM, который предоставляет функционал через API. Чтобы обеспечить метод обмена данными между приложениями, Microsoft разработала стандарт связи приложений ActiveX. ActiveX широко используется в отрасли уже много лет и построен на основе технологий COM. Поскольку TestStand построен на основе COM, он будет продолжать работать в будущих версиях операционных систем Windows после окончания срока службы ActiveX. ActiveX использует клиент-серверный подход.

Сервер ActiveX - это приложение, предоставляющее клиентам, которые следуют стандарту ActiveX, определенные функциональные возможности. Кроме того, приложения ActiveX используют объектно-ориентированное программирование (OOP).

Архитектура сервера ActiveX позволяет любому языку программирования, способному вызывать код ActiveX, например LabVIEW, LabWindows™/CVI™, C#, VB.NET или C++, взаимодействовать с механизмом TestStand. При программировании с помощью API TestStand реализация зависит от используемого Вами языка. Например:

  • Для выполнения вызовов API LabVIEW использует узлы свойств (Property Node) и узлы вызова (Invoke Node).
  • LabWindows/CVI для вызовов API использует оболочку драйвера прибора.
  • C# или VB.NET вызывают API, используя сборку взаимодействия, предоставляемую TestStand.
  • Сам по себе TestStand для доступа к API предоставляет адаптер ActiveX/COM. Также для прямого доступа к API Вы можете использовать выражения.

Независимо от того, как вы получаете доступ к API, итоговое поведение одинаково в любой среде, поскольку, независимо от используемого вами интерфейса, функционал реализован в механизме TestStand.

Классы API

API TestStand определяет несколько классов для представления типов объектов TestStand, таких как класс SequenceFile или класс Execution. Каждый из этих классов определяет свойства и методы для доступа к соответствующим данным или выполнения действий. Например, класс SequenceFile определяет свойство Path для хранения на диске пути файла последовательности и метод Save для сохранения файла последовательности.

Для получения полного списка доступных классов, определенных в API TestStand обратитесь к разделу TestStand API reference help (справка по API TestStand). Чтобы увидеть больше информации о классе, а также свойства и методы, которые он определяет, выберите его.

 

Наследование классов

Многие классы в TestStand связаны через наследование: более узкий класс может наследовать свойства или методы от более широкого. Например, класс SequenceFile является более узкой версией класса PropertyObject. API TestStand определяет связь наследования между этими классами, что позволяет объектам более узкого класса иметь доступ к свойствам и методам более широких классов.

Класс SequenceFile наследует свойства и методы от более широких классов PropertyObjectFile и PropertyObject.

 

Почти все классы API TestStand наследуются от базового класса PropertyObject, который включает в себя общие методы и свойства, которыми обладают объекты TestStand. Класс PropertyObject определяет общие свойства, такие как Name (имя) и Numeric Format (числовой формат), и предоставляет общие методы для управления объектами, такие как клонирование, установка и получение значений, создание и удаление объектов или работа с массивами. Поскольку большинство классов API TestStand наследуют от класса PropertyObject, они также могут получить доступ к этим универсальным свойствам и методам. Например, Вы можете использовать метод PropertyObject.Clone() для создания копии шага, последовательности или объекта файла последовательности.

Многие среды разработки не позволяют Вам напрямую обращаться к свойствам родительского класса. Аналогично, в TestStand вы не можете вызывать метод Clone() непосредственно для объекта SequenceFile. Однако API TestStand предоставляет методы для приведения объекта к свойствам и методам более широкого класса. Чтобы получить доступ к свойствам и методам, определенным в классе PropertyObject, Вы можете привести объект к его родительскому классу, вызвав метод AsPropertyObject. Например, чтобы получить доступ к методу Clone() для объекта файла последовательности, используйте SequenceFile.AsPropertyObject.Clone().

Для получения дополнительной информации о наследовании API и свойствах и методах класса PropertyObject обратитесь к справке NI TestStand.


Динамические свойства и встроенные свойства

Объекты TestStand имеют два разных типа свойств:

  • Встроенные свойства (свойства API), которые определяются классом объекта, присутствуют для всех объектов определенного класса.
  • Динамические свойства (подсвойства), которые определяются объектом, могут различаться между объектами одного и того же класса.

Объект шага имеет динамические свойства, которые могут различаться в зависимости от типа шага, и статические свойства, которые определяются классом Step в API TestStand.


Эти два различных типа свойств легко перепутать, так как Вы можете получить доступ к обоим в выражении TestStand, используя «.» оператор. Однако при использовании API в других языках программирования через прямой доступ можно изменить только встроенные свойства. Примером является использование узла свойств в LabVIEW.


Чтобы получить доступ к динамическим свойствам, вы используете методы API PropertyObject, такие как GetValString() и GetValNumber(). Для указания имени динамического свойства используется LookupString:



В некоторых случаях Вы можете получить доступ к свойству несколькими способами, используя либо динамические, либо встроенные свойства. При использовании API TestStand в модуле кода предпочтительнее использовать встроенные свойства, поскольку к ним можно обращаться напрямую, не поддерживая строки поиска.

 

Связи объектов TestStand

Объекты TestStand могут содержать иные объекты другого класса, называемые API Containment(Включение API). Например, объект SequenceFile содержит объекты Sequence для последовательностей, определенных в специальном файле. Объекты Sequence (последовательность), в свою очередь, содержат объекты Step (шаг).

Объекты в API TestStand часто содержат иные объекты другого класса

Понимание отношений включения между объектами полезно при выборе конкретных объектов. Если родительский объект содержит несколько дочерних объектов определенного класса, то Вам необходимо указать либо имя свойства, либо индекс, чтобы указать на требуемый дочерний объект. Для большинства дочерних объектов вы получаете доступ к включенным объектам из родительского объекта, используя определенный метод получения, который допускает в качестве параметра имя объекта или индекс. Например, чтобы получить доступ к шагу в файле последовательности, Вы используете:

SequenceFile.getSequenceByName(“MainSequence”).GetStepByName(“RAM Test”, StepGroup_Main)

Кроме того, дочерние объекты могут обращаться к своим родительским объектам через API. Поскольку у дочернего объекта одномоментно может быть только один родительский объект, для прямого доступа к родительскому объекту Вы используете свойство, а не метод получения. Например, если у вас есть объект SequenceContext и вам нужен доступ к выполнению родительского объекта, Вы можете использовать:

ThisContext.Thread.Execution

Во многих случаях встроенные свойства позволяют получить доступ к более отдаленным родительским объектам. Например, Вы можете напрямую получить доступ к объекту выполнения из объекта Sequence Context:

ThisContext.Execution

 

Выбор объектов API TestStand

В дополнение к выбору с использованием отношений включения, многие классы предоставляют свойства или методы для доступа к другим связанным объектам. Например, класс Module для доступа к соответствующему используемому адаптеру предоставляет свойство Adapter.

Чтобы определить, как получить доступ к нужному объекту из текущего объекта, Вы можете использовать диаграмму, приведенную в разделе TestStand API Reference help. Часть этой диаграммы показана ниже.
 

Из объекта sequenceContext Вы можете перемещаться по связям между объектами для доступа к другим объектам

Доступ к API TestStand

Обычно есть два подхода в зависимости от типа создаваемого приложения, которые вы можете использовать для доступа к API:

  • Для автономных приложений Вы должны создать новый экземпляр механизма TestStand.
  • Для модулей кода или других средств, вызываемых из существующего приложения, вы должны передать на механизм TestStand существующую ссылку.

 

Создание автономного приложения TestStand

Чтобы использовать в новом приложении API TestStand, сначала необходимо создать экземпляр механизма TestStand. Любое приложение или процесс TestStand (например, интерфейс пользователя TestStand, редактор последовательностей или специализированная утилита) для выполнения любых функций TestStand поддерживает один экземпляр механизма, или singleton (объект-одиночка). Механизм поддерживает ссылки на все объекты в памяти, настраивает и контролирует выполнения, а также сохраняет данные контекста для сеанса TestStand, также как глобальные значения для станции и информацию о пользователях.

Механизм TestStand предоставляет методы, которые Вы используете для создания других объектов TestStand, которые обозначаются ключевым словом «new». Например, следующие:

  • Engine.NewSequenceFile()
  • Engine.NewStep()
  • Engine.NewExecution()
  • Engine.NewPropertyObject()

Для получения дополнительной информации, а также для просмотра полного списка свойств и методов, доступных в объекте Engine, см. раздел TestStand Engine.

После завершения приложения, прежде чем выходить из него, Вы должны выключить механизм TestStand. Чтобы дать пользователю возможность прекратить работу любых запущенных выполнений, требуется двухэтапный процесс завершения работы. Он описан в разделе Shutting Down the Engine (Выключение механизма) справки TestStand.

Для разработки приложений и интерфейсов пользователя TestStand, чтобы уменьшить сложность вашей программы, National Instruments рекомендует использовать элементы управления интерфейса пользователя TestStand, а не напрямую создавать объект механизма TestStand. Элементы управления TestStand UI обеспечивают уровень абстракции над API TestStand, который упрощает разработку автономных приложений TestStand. Для получения дополнительной информации об использовании элементов управления UI обратитесь к разделу [UI controls API] (API элементов управления UI) этого документа.


Вызов модуля кода или средства из существующего приложения

При использовании API в модуле кода или средстве, которые Вы вызываете из другого приложения TestStand, вы используете механизм TestStand, созданный приложением верхнего уровня. Вызов кода из выполняемой последовательности, такой как модуль кода, лучше всего выполнить с помощью входного параметра для SequenceContext. Это предпочтительнее, чем прямая передача механизма TestStand, поскольку контекст последовательности обеспечивает доступ к текущему состоянию выполнения в дополнение к объекту механизма TestStand.

SequenceContext представляет текущее состояние выполнения последовательности, предоставляя доступ к снимку всех данных для конкретной выполняемой последовательности. Каждая выполняемая последовательность в любом потоке имеет свой собственный SequenceContext.

При просмотре Variables view (Панель «Переменные») отображается список свойств первого уровня контекста последовательности, который включает все типы переменных, текущий шаг и свойство RunState. SequenceContext также предоставляет ссылки на многие другие объекты в качестве встроенных свойств.

 

RunState и SequenceContext


Свойство RunState и SequenceContext предоставляют доступ ко многим одним и тем же объектам, таким как текущее выполнение, поток, файл последовательности и последовательность. Однако в отличие от SequenceContext, который предоставляет эти объекты как встроенные свойства, свойство RunState содержит их в виде динамических свойств.

По этой причине при доступе к информации о состоянии в выражениях TestStand используйте свойство RunState, тогда как SequenceContext больше подходит для модулей кода, где Вы не можете напрямую получить доступ к динамическим свойствам.


SequenceContext предоставляет информацию о состоянии выполнения через встроенные и динамические свойства, а свойство RunState предоставляет информацию о состоянии только через динамические свойства.

Постоянство данных последовательности

Перед выполнением шагов последовательности для поддержания отдельных значений локальной переменной и свойства шага для каждого вызова последовательности TestStand создает копию последовательности времени выполнения (run-time copy). В большинстве случаев при обращении к объектам из Runstate или SequenceContext в пределах исполняемой последовательности объекты являются их копиями времени выполнения. Это означает, что любые изменения, внесенные в эти объекты, не будут сохраняться после завершения выполнения. Например, изменение значений локальных переменных или программное создание подсвойства параметра не повлияет на файл последовательности на диске:

Locals.SetValString("RuntimeVariable",1, "value")

Объекты, которые наследуются от класса PropertyObjectFile, такие как объекты SequenceFile, не имеют отдельной копии времени выполнения. Поэтому изменения, которые Вы вносите в эти объекты, сохранятся после завершения выполнения. Например, доступ к свойству Locals через объект SequenceFile позволяет создать постоянную локальную переменную.

RunState.sequencefile.GetSequenceByName("MainSequence").Locals.SetValString("PersistantVariable",1, "value")

 

Основные области применения API TestStand

Хотя API TestStand предоставляет возможность автоматизировать все функции TestStand, существует еще несколько распространенных областей применения API:

  • Создание специализированных свойств
  • Создание новых файлов последовательности
  • Модификация существующих последовательностей

 

Создание специализированных свойств

Вы можете использовать API TestStand для динамического создания специализированных свойств во время выполнения. Например, для добавления определенных диагностических данных к результатам теста, если для определенного компонента тест не пройден, или для добавления специализированных данных в заголовок отчета.

Существует множество способов создания специализированных свойств с помощью API. Использование методов «SetVal» с опцией InsertIfMissing обеспечивает самый простой способ создания новых свойств для простейших типов данных. Например, чтобы добавить новое свойство к шагу теста числового ограничения, Вы можете использовать следующее выражение:

RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetValString(
"Result.extraResult",
PropOption_InsertIfMissing,
"this string is an extra result")

Чтобы добавить специализированное свойство в отчет, Вы также должны установить для объекта, который генератор отчетов использует для выбора того, какие свойства результата логировать, флаг IncludeInReport:

RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetFlags(
"Result.extraResult",
0,
PropFlags_IncludeInReport)

Дополнительные сведения об использовании API для добавления данных в отчет о тестировании см. пример Adding Custom Data to a Report (Добавление в отчет специализированных данных).

Для более сложных свойств, таких как контейнеры, Вам нужно будет создать свойства напрямую, используя метод NewSubProperty(), который позволяет создавать контейнеры, экземпляры типов данных и массивы. Например, чтобы создать новую локальную переменную типа Error, Вам следует использовать выражение:

Locals.NewSubProperty("ComplexContainer.Error",PropValType_NamedType, False, "Error",0)

Подробнее об использовании API для создания свойств см. пример [Creating new properties using API] (Создание новых свойств с помощью API).

 

Создание новых последовательностей

Вы можете использовать API TestStand для создания новых файлов последовательности или создания измененных копий существующего файла, чтобы автоматизировать процесс создания файла последовательности на основе ввода пользователя. Например, вы можете захотеть создать средство, которое генерирует файл последовательности начальной точки на основе определенного ввода пользователя, или выполняет определенные изменения шагов в существующем файле последовательности.

Для получения дополнительной информации о создании новых файлов последовательности с помощью API см. пример Building a Sequence Using the API (Построение последовательности с использованием API).

Также Вы можете использовать API TestStand, чтобы разработать конвертор файлов последовательностей для генерации файлов в специализированном формате. При создании конвертора файлов последовательностей для генерации файлов последовательностей, последовательностей, шагов и свойств на основе данных в указанном вами файле Вы используете API TestStand. Шаблон Translator позволяет интегрировать этот код с TestStand и напрямую открывать файлы в специализированном формате.

Для получения дополнительной информации об использовании конверторов файлов последовательностей обратитесь к разделу Sequence File Translators (Конверторы файлов последовательностей) справки TestStand.


Изменение последовательностей

В специализированных средствах, которые Вы используете для внесения изменений в существующие файлы последовательностей, Вы можете использовать API TestStand. Например, Вы можете создать средство, которое проверяет наличие модулей кода, указанных абсолютными путями к файлам, и заменяет их относительными путями.

Для получения дополнительной информации обратитесь к примеру Creating a Sequence File Iteration Tool (Создание средства итерирования файла последовательности).

 

Дополнительные API TestStand

В дополнение к основному API TestStand, TestStand предоставляет другие API, которые расширяют функционал и предоставляют дополнительные функции:

  • UI Controls API (API элементов управления интерфейса пользователя)
  • Adapter API (API адаптера)
  • Synchronization Server API (API сервера синхронизации)

В отличие от основного API TestStand, эти API не доступны напрямую через выражения; Вы используете их через шаг ActiveX или отдельный модуль кода.


UI Controls API (API элементов управления интерфейса пользователя)

TestStand включает в себя набор элементов управления интерфейса пользователя, который позволяет быстро разрабатывать интерфейсы пользователя TestStand. Эти элементы управления включают в себя видимые элементы для отображения данных TestStand, таких как Steps View (Панель «Шаги») или Variables View(Панель «Переменные»), а также элементы управления Invisible Manager, которые обрабатывают большую часть взаимодействия с механизмом API TestStand в интерфейсе пользователя TestStand.

При разработке автономного приложения TestStand компания National Instruments рекомендует для разработки приложения вместо непосредственного создания экземпляра механизма TestStand использовать элементы управления интерфейса пользователя.

UI Controls API позволяет реализовывать общие задачи интерфейса, такие как открытие и выполнение файлов последовательности, ответ на сообщения интерфейса пользователя и обработка завершения работы приложения, с помощью элементов управления диспетчера. UI Controls API также предоставляет методы подключения, используемые для конфигурирования элементов управления интерфейса пользователя.

Для получения дополнительной информации об использовании элементов управления интерфейса пользователя и UI Controls API обратитесь к следующим разделам справки:


TestStand UI Controls можно рассматривать как уровень ПО выше API TestStand Engine. Эти элементы управления включают в себя многие функции, которые необходимы Вам в интерфейсе пользователя, такие как открытие последовательностей, выполнение тестов, отображение хода выполнения тестов и т. д. TestStand UI Controls обладают широкими возможностями и включают собственный API. Хотя охват функционала элементов управления интерфейса пользователя выходит за рамки этого документа, важно отметить, что эти элементы управления предоставляют функционал, основанный на API TestStand Engine.

 

Adapter API (API адаптера)

Adapter API предоставляет специальные классы для различных адаптеров, включенных в TestStand. Как правило, Adapter API используется для получения информации или функций, относящихся к адаптеру, при использовании классов адаптера или модуля в основном API. В этом случае Вы приводите объект к соответствующему классу Adapter API. Например, Вы можете использовать класс LabVIEWModule на шаге LabVIEW для объекта модуля при доступе к особым для LabVIEW свойствам и методам.

Используйте Adapter API для доступа к свойствам и методам адаптера для классов Module или Adapter.

 

Для получения списка классов, предоставляемых в Adapter API обратитесь к TestStand Adapter API reference (Справочник по API TestStand).

 

Synchronization Server API (API сервера синхронизации)

Synchronization server API обеспечивает прямой доступ к объектам синхронизации TestStand, таким как очереди, блокировки или уведомления. Чтобы использовать этот API, необходимо сначала получить ссылку на диспетчер синхронизации с помощью метода Engine.GetSyncManager. После приведения этого объекта к классу диспетчера синхронизации, определенному в Synchronization server API, Вы можете использовать его для доступа к объектам синхронизации или создания новых.


Используйте SyncManager и Synchronization Server API для создания и доступа к объектам синхронизации TestStand в коде

 

Этот API полезен при разработке приложений, которые запускаются вместе с тестом TestStand и нуждаются в доступе к информации о состоянии выполнения. Это, например, приложение монитора состояния.

Дополнительные сведения о доступных классах см. в разделе Synchronization Server API Reference (Справочник по API сервера синхронизации).