잘 설계된 모듈식 테스트 아키텍처는 상당한 가치를 제공합니다. 일반화된 적응식 아키텍처를 다양한 테스트 시스템에서 재사용하면 테스트 시스템의 수명을 연장하고 테스트 개발 비용을 절감할 수 있습니다. TestStand는 테스트 시스템 및 해당 시스템에 대한 테스트 개발을 간소화하는 모듈식 플랫폼을 제공합니다. TestStand의 강력한 기능은 복잡하고 유연한 테스트 솔루션을 만드는 데 사용할 수 있는 개방형 아키텍처를 기반으로 합니다.
TestStand 엔진은 TestStand API를 통해 엔진과 통신하는 TestStand 구성요소를 위한 기능을 제공합니다.
TestStand에서는 프레젠테이션 레이어(사용자가 보는 것)와 비즈니스 로직 레이어(사용자 작업 뒤에 있는 처리 과정)가 명확히 구분됩니다. 이러한 레이어는 TestStand API를 사용하여 서로 통신합니다. 이 방식은 맞춤형 사용자 인터페이스 만들기, 테스트 흐름의 동적 제어, 즉석에서 시퀀스 만들기, 기타 고급 솔루션 개발하기와 같이 TestStand API를 통해 TestStand 엔진을 사용하는 추가적인 구성요소를 구축하여 TestStand를 확장할 수 있도록 지원합니다.
TestStand 엔진은 API를 통해 기능을 노출하는 ActiveX/COM 자동화 서버입니다. Microsoft는 어플리케이션 간의 통신 방법을 제공하기 위해 ActiveX 어플리케이션 통신 표준을 개발했습니다. 업계에서 오랜 기간 널리 사용되어 온 ActiveX는 COM 기술을 기반으로 설계되었습니다. TestStand는 COM을 기반으로 하므로 ActiveX의 수명이 다한 후에도 이후 버전의 Windows OS에서 계속해서 작동하게 됩니다.
ActiveX는 클라이언트/서버 방식을 사용합니다. ActiveX 서버는 ActiveX 표준을 따르는 클라이언트에 특정 기능을 노출하는 어플리케이션입니다. 또한 ActiveX 어플리케이션은 객체 지향 프로그래밍(OOP)을 사용합니다.
ActiveX 서버 아키텍처는 LabVIEW, LabWindows™/CVI™, C#, VB .NET 또는 C++와 같이 ActiveX 코드를 호출할 수 있는 모든 프로그래밍 언어가 TestStand 엔진과 상호 작용할 수 있도록 지원합니다. TestStand API로 프로그래밍할 때는 사용하는 언어에 따라 구현 형태가 달라집니다. 예를 들면 다음과 같습니다.
어떤 방법을 사용하여 API에 액세스하든, 사용하는 인터페이스와 관계없이 기능이 TestStand 엔진 내에 구현되어 있으므로 모든 환경에서 결과 동작은 동일합니다.
TestStand API는 SequenceFile 클래스나 Execution 클래스와 같이 TestStand 객체 타입을 나타내는 몇 가지 클래스를 정의합니다. 각 클래스는 관련 데이터에 액세스하거나 작업을 수행하는 데 필요한 프로퍼티와 메소드를 정의합니다. 예를 들어, SequenceFile 클래스는 디스크에 있는 시퀀스 파일의 경로를 저장하는 Path 프로퍼티와 시퀀스 파일을 저장하는 Save 메소드를 정의합니다.
TestStand API에 정의된 클래스의 전체 목록은 TestStand API 참조 도움말 토픽을 참조하십시오. 특정 클래스를 클릭하면 해당 클래스에 대한 자세한 정보와 해당 클래스가 정의하는 프로퍼티 및 메소드를 볼 수 있습니다.
TestStand의 여러 클래스는 상속을 통한 관계를 갖습니다. 보다 구체적인 클래스는 보다 일반적인 클래스로부터 프로퍼티 또는 메소드를 상속받을 수 있습니다. 예를 들어, SequenceFile 클래스는 PropertyObject 클래스의 보다 구체적인 버전입니다. TestStand API는 보다 구체적인 클래스의 객체가 보다 일반적인 클래스의 프로퍼티 및 메소드에 액세스할 수 있도록 이러한 클래스 간의 상속 관계를 정의합니다.
SequenceFile 클래스는 보다 일반적인 PropertyObjectFile 클래스와 PropertyObject 클래스로부터 프로퍼티 및 메소드를 상속받습니다.
거의 모든 TestStand API 클래스는 기본 PropertyObject 클래스를 상속합니다. PropertyObject 클래스는 TestStand 객체들이 공유하는 공통적인 메소드와 프로퍼티를 포함합니다. PropertyObject 클래스는 Name 및 Numeric Format과 같은 일반적인 프로퍼티를 정의하며, 복제, 값의 설정 및 가져오기, 객체 생성 및 삭제, 배열 조작과 같은 객체 관리를 위한 공통적인 메소드를 제공합니다. 대부분의 TestStand API 클래스가 PropertyObject 클래스를 상속하므로 이러한 일반적인 프로퍼티 및 메소드에 액세스할 수 있습니다. 예를 들어, PropertyObject.Clone() 메소드를 사용하여 단계, 시퀀스 또는 시퀀스 파일 객체의 복사본을 만들 수 있습니다.
많은 개발 환경에서 사용자는 상위 클래스의 프로퍼티에 직접 접근할 수 없습니다. 마찬가지로, TestStand에서도 SequenceFile 객체에서 Clone() 메소드를 직접 호출할 수 없습니다. 그러나 TestStand API는 보다 일반적인 클래스의 프로퍼티 및 메소드에 액세스할 수 있도록 객체를 캐스트하는 메소드를 제공합니다. PropertyObject 클래스에 정의된 프로퍼티 및 메소드에 액세스하려면 AsPropertyObject 메소드를 호출하여 객체를 그 상위 클래스로 캐스트할 수 있습니다. 예를 들어, 시퀀스 파일 객체에서 Clone() 메소드에 액세스하려면
SequenceFile.AsPropertyObject.Clone()을 사용할 수 있습니다.
API 상속과 PropertyObject 클래스 프로퍼티 및 메소드에 대한 자세한 정보는 NI TestStand 도움말을 참조하십시오.
TestStand 객체에는 두 가지 타입의 프로퍼티가 있습니다.
스텝 객체에는 스텝 유형에 따라 다를 수 있는 다이나믹 프로퍼티와 TestStand API의 Step 클래스에 의해 정의되는 정적 프로퍼티가 있습니다.
두 가지 모두 TestStand 식에서 “.” 연산자를 사용하여 액세스할 수 있으므로 두 유형을 혼동하기 쉽습니다. 그러나 다른 프로그래밍 언어에서 API를 사용할 때는 내장 프로퍼티만 직접 액세스를 통해 사용 가능합니다(예: LabVIEW에서 프로퍼티 노드 사용).
다이나믹 프로퍼티에 액세스하려면 LookupString을 사용하여 다이나믹 프로퍼티의 이름을 지정하여 PropertyObject API 메소드(예: GetValString(), GetValNumber())를 사용하십시오.
경우에 따라 다이나믹 프로퍼티나 내장 프로퍼티를 사용하여 여러 방법으로 프로퍼티에 액세스할 수 있습니다. 코드 모듈에서 TestStand API를 사용할 때는 룩업 문자열을 유지하지 않고도 직접 액세스할 수 있는 내장 프로퍼티를 사용하는 것이 좋습니다.
TestStand 객체는 다른 클래스의 다른 객체를 포함할 수 있습니다. 이를 API 포함이라고 합니다. 예를 들어, SequenceFile 객체는 시퀀스 파일에 정의된 시퀀스에 대한 Sequence 객체를 포함합니다. 각각의 Sequence 객체는 Step 객체를 포함합니다.
TestStand API의 객체는 다른 클래스의 다른 객체를 포함하는 경우가 많습니다.
객체 간의 포함 관계를 이해하는 것은 각 객체를 살펴볼 때 유용합니다. 상위 객체가 특정 클래스의 여러 하위 객체를 포함하는 경우, 프로퍼티 이름이나 인덱스를 제공하여 원하는 하위 객체를 지정하십시오. 대부분의 하위 객체의 경우, 특정 getter 메소드를 사용하여 상위 객체에 포함된 객체에 액세스하십시오. getter 메소드는 객체 이름이나 인덱스를 파라미터로 받습니다. 예를 들어, 시퀀스 파일에 포함된 단계에 액세스하려면 다음을 사용하십시오.
SequenceFile.getSequenceByName(“MainSequence”).GetStepByName(“RAM Test”, StepGroup_Main)
또한 하위 객체는 API를 통해 상위 객체에 액세스할 수 있습니다. 하위 객체는 항상 하나의 상위만 가질 수 있으므로 getter 메소드가 아닌 프로퍼티를 사용하여 상위에 직접 액세스합니다. 예를 들어, SequenceContext 객체에서 상위 실행에 액세스하려면 다음을 사용할 수 있습니다.
ThisContext.Thread.Execution
대부분의 경우, 더 높은 상위에 액세스할 수 있도록 내장 프로퍼티가 제공됩니다. 예를 들어, 다음과 같이 SequenceContext 객체에서 실행 객체에 직접 액세스할 수 있습니다.
ThisContext.Execution
포함 관계를 사용한 탐색 방법 외에도 많은 클래스에서는 기타 관련 객체에 액세스하기 위한 프로퍼티나 메소드를 제공합니다. 예를 들어, Module 클래스는 현재 실행 중인 대응되는 어댑터에 액세스할 수 있도록 Adapter 프로퍼티를 제공합니다.
TestStand API 참조 도움말 항목에서 제공하는 차트를 참고하여 현재 객체에서 원하는 객체에 액세스할 방법을 확인할 수 있습니다. 다음은 이 차트의 일부입니다.
SequenceContext 객체에서 객체 관계를 탐색하여 다른 객체에 액세스할 수 있습니다.
사용자가 만들려는 어플리케이션 유형에 따라 일반적으로 두 가지 방법을 사용하여 API에 액세스할 수 있습니다.
새 어플리케이션에서 TestStand API를 사용하려면 먼저 TestStand 엔진의 인스턴스를 만드십시오. TestStand 어플리케이션 또는 프로세스(예: TestStand 사용자 인터페이스, Sequence Editor 또는 사용자 정의 유틸리티)는 모두 TestStand 함수를 수행하기 위해 엔진의 단일 인스턴스(싱글톤)를 유지하십시오. 엔진은 모든 메모리 내 객체에 대한 참조를 유지하고, 실행을 설정 및 제어하고, TestStand 세션의 컨텍스트 데이터와 스테이션 글로벌 및 사용자 정보를 저장하십시오.
TestStand 엔진은 다른 TestStand 객체를 만들 때 사용할 수 있는 메소드를 제공하는데, 여기에는 다음 메소드와 같이 “new”라는 키워드가 표시되어 있습니다.
엔진 객체에서 사용 가능한 프로퍼티 및 메소드의 전체 목록은 TestStand 엔진 항목을 참조하십시오.
어플리케이션이 완료되면 어플리케이션을 종료하기 전에 먼저 TestStand 엔진을 종료하십시오. 이처럼 2단계 종료 프로세스가 요구되는 이유는 TestStand 도움말의 Shutting Down the Engine 토픽에서 설명하는 것처럼 사용자에게 현재 진행 중인 실행을 종료할 기회를 제공하기 위한 것입니다.
NI에서는 프로그램의 복잡성을 줄이기위해 TestStand 엔진 객체를 직접 만드는 대신 TestStand UI 컨트롤을 사용하여 TestStand 어플리케이션 및 사용자 인터페이스를 개발하도록 권장합니다. TestStand UI 컨트롤은 TestStand API 위에 추상 레이어를 제공하므로 독립형 TestStand 어플리케이션을 보다 쉽게 개발할 수 있습니다. UI 컨트롤을 사용하는 방법에 대한 자세한 내용은 이 문서의 UI 컨트롤 API 섹션을 참조하십시오.
다른 TestStand 어플리케이션에서 호출한 코드 모듈 또는 도구에서 API를 사용할 때는 최상위 어플리케이션에 의해 생성된 TestStand 엔진을 사용하십시오. 코드가 현재 실행 중인 시퀀스(예: 코드 모듈)에서 호출된 경우, SequenceContext에 대한 입력 파라미터를 사용하는 것이 가장 좋습니다. 시퀀스 컨텍스트는 TestStand 엔진 객체에 더해 실행의 현재 상태에 대한 액세스를 제공하기 때문에 이렇게 하는 것이 TestStand 엔진으로 직접 전달하는 것보다 더 바람직합니다.
SequenceContext는 시퀀스의 현재 실행 상태를 나타내며, 실행 중인 특정 시퀀스의 모든 데이터의 스냅샷에 대한 액세스를 제공합니다. 스레드에 포함된, 실행 중인 각 시퀀스는 자체 SequenceContext를 갖습니다.
변수 보기를 탐색할 때 표시되는 목록은 Sequence Context 첫 번째 레벨 프로퍼티로, 여기에는 모든 변수 유형, 현재 단계 및 RunState 프로퍼티가 포함됩니다. SequenceContext는 다른 여러 객체에 대한 참조를 내장 프로퍼티로 제공하기도 합니다.
RunState 프로퍼티와 SequenceContext는 둘 다 현재 실행, 스레드, 시퀀스 파일, 시퀀스와 같은 여러 동일한 객체에 대한 액세스를 제공합니다. 그러나 RunState 프로퍼티는 이러한 객체를 다이나믹 프로퍼티로 포함하는 반면 SequenceContext는 이를 내장 프로퍼티로 노출합니다.
따라서 TestStand 표현식에 대한 정보에 액세스할 때는 RunState 프로퍼티를 사용하는 것이 좋고, 다이나믹 프로퍼티에 직접 액세스할 수 없는 코드 모듈의 경우에는 SequenceContext를 사용하는 것이 더 적절합니다.
SequenceContext는 내장 프로퍼티와 다이나믹 프로퍼티를 통해 실행 상태 정보를 제공하고, RunState 프로퍼티는 다이나믹 프로퍼티를 통해서만 상태 정보를 제공합니다.
시퀀스 내의 단계를 실행하기 전에, TestStand는 시퀀스의 런타임 복사본을 생성하여 각 시퀀스 호출의 개별 로컬 변수와 단계 프로퍼티 값을 관리하십시오. 대부분의 경우 실행 중인 시퀀스 내의 Runstate 또는 SequenceContext에서 객체에 액세스할 경우 해당 객체는 이러한 런타임 복사본입니다. 즉, 이러한 객체를 변경해도 실행이 완료되면 변경 사항이 지속되지 않습니다. 예를 들어, 로컬 변수의 값을 변경하거나 파라미터의 하위 프로퍼티를 프로그래밍 방식으로 생성해도 이는 디스크에 있는 시퀀스 파일에 영향을 주지 않습니다.
Locals.SetValString("RuntimeVariable",1, "value")
PropertyObjectFile 클래스에서 상속된 객체(예: SequenceFile 객체)는 별도의 런타임 복사본을 갖지 않으므로 이러한 객체를 통해 수행한 변경 사항은 실행이 완료된 후에도 유지됩니다. 예를 들어, SequenceFile 객체를 통해 Locals 프로퍼티에 액세스하면 영구 로컬 변수를 만들 수 있습니다.
RunState.sequencefile.GetSequenceByName("MainSequence").Locals.SetValString("PersistantVariable",1, "value")
TestStand API는 모든 TestStand 기능을 자동화하는 기능을 제공합니다. 이 밖에도 API의 일반적인 어플리케이션은 다음과 같습니다.
TestStand API를 사용하여 런타임에 사용자 정의 프로퍼티를 동적으로 생성할 수 있습니다. 예를 들어, 특정 구성요소에 대해 테스트가 실패할 경우 테스트 결과에 특정 진단 데이터를 추가하거나 보고서 헤더에 사용자 정의 데이터를 추가할 수 있습니다.
API를 통해 사용자 정의 프로퍼티를 만드는 방법에는 여러 가지가 있습니다. 원시 데이터 형식의 경우, “SetVal” 메소드를 InsertIfMissing 옵션과 함께 사용하면 가장 간단하게 새 프로퍼티를 만들 수 있습니다. 예를 들어, 다음 표현식을 사용하여 숫자 제한 테스트 단계에 새 프로퍼티를 추가할 수 있습니다.
RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetValString(
"Result.extraResult",
PropOption_InsertIfMissing,
"이 문자열은 추가 결과입니다")
리포트에 사용자 정의 프로퍼티를 추가하려면 해당 객체에 대해 IncludeInReport 플래그도 설정하십시오. 리포트 생성기는 이 플래그를 사용하여 어느 프로퍼티를 기록할지 선택합니다.
RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetFlags(
"Result.extraResult",
0,
PropFlags_IncludeInReport)
API를 사용하여 테스트 리포트에 데이터를 추가하는 방법에 대한 자세한 내용은 리포트에 사용자 정의 데이터 추가하기 예제를 참조하십시오.
컨테이너와 같이 보다 복잡한 프로퍼티의 경우에는 컨테이너, 데이터 형식 인스턴스 및 배열을 만드는 데 사용할 수 있는 NewSubProperty() 메소드를 사용하여 프로퍼티를 직접 만드십시오. 예를 들어, Error 유형을 갖는 새 로컬 변수를 만들려면 다음 표현식을 사용합니다.
Locals.NewSubProperty("ComplexContainer.Error",PropValType_NamedType, False, "Error",0)
API를 사용하여 프로퍼티를 만드는 방법에 대한 자세한 내용은 [API를 사용하여 새 프로퍼티 만들기] 예제를 참조하십시오.
사용자 입력을 기반으로 시퀀스 파일을 만드는 프로세스를 자동화하려면 TestStand API를 사용하여 새 시퀀스 파일을 생성하거나 기존 파일의 수정된 복사본을 만들 수 있습니다. 예를 들어, 특정 사용자 입력을 기반으로 시작점 시퀀스 파일을 생성하는 도구나 기존 시퀀스 파일의 단계에 대해 특정 수정을 수행하는 도구를 만들 수 있습니다.
API를 사용하여 새 시퀀스 파일을 만드는 방법에 대한 자세한 내용은 API를 사용하여 시퀀스 구축하기 예제를 참조하십시오.
TestStand API를 사용하여, 사용자 정의 파일 형식을 사용하여 시퀀스 파일을 생성하는 시퀀스 파일 변환기를 개발할 수도 있습니다. 시퀀스 파일 변환기를 만들 때는 TestStand API를 사용하여 지정된 파일에 있는 데이터를 기반으로 시퀀스 파일, 시퀀스, 단계 및 프로퍼티를 생성하십시오. 변환기 프레임워크는 이 코드를 TestStand에 통합하고 파일을 곧바로 사용자 정의 형식으로 열 수 있도록 지원합니다.
시퀀스 파일 변환기를 사용하는 방법에 대한 자세한 내용은 TestStand 도움말의 시퀀스 파일 변환기 토픽을 참조하십시오.
수정을 수행하는 데 사용하는 사용자 정의 도구에서 TestStand API를 사용하여 기존 시퀀스 파일에 대해 수정을 수행할 수 있습니다. 예를 들어, 절대 경로로 지정된 코드 모듈을 검사하고 이를 상대 경로로 대체하는 도구를 만들 수 있습니다.
자세한 정보는 시퀀스 파일 반복 도구 만들기를 참조하십시오.
TestStand는 코어 TestStand API 외에도 기능을 확장하고 추가 기능을 제공하는 다음과 같은 API를 제공합니다.
이러한 API는 코어 TestStand API와 달리 표현식을 통해 직접 액세스할 수 없으며, ActiveX 단계 또는 별도의 코드 모듈을 통해서 사용해야 합니다.
TestStand에는 TestStand 사용자 인터페이스를 빠르게 개발할 수 있는 사용자 인터페이스 컨트롤이 포함되어 있습니다. 이러한 컨트롤에는 Steps View 또는 Variables View와 같이 TestStand 데이터 표시에 사용되는 보이는 컨트롤과 TestStand 사용자 인터페이스에서 TestStand Engine API와의 통신을 처리하는 Invisible Manager 컨트롤이 포함됩니다.
독립형 TestStand 어플리케이션을 개발하는 경우 NI에서는 TestStand 엔진의 인스턴스를 직접 만드는 대신 UI 컨트롤을 사용하여 어플리케이션을 개발하도록 권장합니다.
UI 컨트롤 API를 사용하면 시퀀스 파일 열기 및 실행하기, UI 메시지에 응답하기, 어플리케이션 종료 처리하기와 같은 일반적인 사용자 인터페이스 작업을 관리자 컨트롤을 통해 구현할 수 있습니다. UI 컨트롤 API는 UI 컨트롤을 구성하는 데 사용되는 연결 방법도 제공합니다.
사용자 인터페이스 컨트롤 및 UI 컨트롤 API를 사용하는 방법에 대한 자세한 내용은 다음 도움말 항목을 참조하십시오.
TestStand UI 컨트롤은 TestStand 엔진 API 위에 있는 소프트웨어 레이어라고 생각하면 됩니다. 이러한 컨트롤은 시퀀스 열기, 테스트 실행하기, 테스트 진행 상황 표시하기와 같이 사용자 인터페이스에 필요한 다양한 기능을 캡슐화합니다. TestStand UI 컨트롤은 다양한 기능을 제공하며, 자체 API를 포함합니다. 사용자 인터페이스 컨트롤의 기능을 설명하는 것은 이 문서의 범위를 벗어나지만, 이러한 컨트롤은 TestStand 엔진 API를 기반으로 다양한 기능을 제공한다는 사실은 언급하고 넘어가겠습니다.
어댑터 API는 TestStand에 포함된 여러 어댑터를 위한 클래스를 제공합니다. 어댑터 API는 일반적으로 코어 API에서 어댑터 또는 모듈 클래스를 사용할 때 어댑터 관련 정보나 기능을 위해 사용합니다. 이때 객체를 적절한 어댑터 API 클래스로 타입 캐스트해야 합니다. 예를 들어, LabVIEWModule 클래스를 사용하여 LabVIEW 단계에 포함된 모듈 객체의 LabVIEW 관련 프로퍼티 및 메소드에 액세스할 수 있습니다.
어댑터 API를 사용하여 Module 클래스나 Adapter 클래스의 어댑터 관련 프로퍼티 및 메소드에 액세스하십시오.
어댑터 API에서 제공하는 클래스 목록은 TestStand 어댑터 API 참조를 참조하십시오.
동기화 서버 API는 대기열, 잠금, 알림과 같은 TestStand 동기화 객체에 대한 직접 액세스를 제공합니다. 이 API를 사용하려면 먼저 Engine.GetSyncManager 메소드를 사용하여 Synchronization 관리자에 대한 참조를 얻으십시오. 이 객체를 동기화 서버 API에 정의된 Synchronization 관리자 클래스로 캐스트한 후에 이를 사용하여 새 동기화 객체에 액세스하거나 만들 수 있습니다.
SyncManager 및 동기화 서버 API를 사용하여 코드에 포함된 TestStand 동기화 객체를 만들고 액세스하십시오.
이 API는 TestStand 테스트와 나란히 실행되는 어플리케이션을 개발할 때 상태 모니터 어플리케이션과 같은 실행의 상태에 관한 정보에 액세스해야 하는 경우에 유용합니다.
사용 가능한 클래스에 대한 자세한 정보는 동기화 서버 API 참조 항목을 참조하십시오.