티스토리 뷰

TestStand API는 다수의 객체와 수 백개의 프로퍼티와 함수를 제공합니다. 이는 TestStand API에 익숙해 지기 위해서는 많은 노력이 필요한 것처럼 보여질 수도 있습니다. 그러나 사용자가 API 사용에 대한 기술의 기본적인 내용(OOP, Containment, Inheritance)만 숙지를 하게 되면, 사용자는 PropertyObject와 아래의 섹션에서 포함하고 있는 일반적으로 사용되는 객체 사용에 친숙해질 수 있습니다.


이 글에서는 TestStand 에서 자주 사용되는 일반적인 객체에 대해서 알아보도록 하겠습니다. 


자주 사용되는 일반적인 객체

 

엔진 객체


TestStand 엔진은 TestStand 아키텍처의 주요 부분이며, 이는 테스트 실행에 필요한 다수의 함수와 프로퍼티를 제공합니다. 사용자는 TestStand의 기능 사용을 위해 프로세스 당 싱글톤 개념으로 TestStand를 반드시 초기화 해야 합니다. 이 엔진은 메모리 내의 객체에 대한 레퍼런스를 가지고 있으며, 실행을 설정하고 제어하고, 글로벌 값이나 사용자 정보와 같은 내용을 TestStand의 세션을 위해 저장합니다. 이 엔진을 이용하는 것은 모든 상위레벨의 객체를 생성하고 관리할 수 있음을 나타냅니다.


엔진은 Engine.ComputerName, Engine.CurrentUser, Engine.Globals, and Engine.LicenseType 와 같은 다수의 프로퍼티를 가지고 있습니다. Engine.NewStep, Engine.NewSequence, Engine.NewSequenceFile, Engine.NewPropertyObject, Engine.NewExecution, Engine.CurrentUserHasPriviledge와 같은 함수도 보유하고 있습니다. 사용자는 또한 다이얼로그 박스를 실행하기 위해서 엔진을 사용할 수 있습니다.  


ApplicationManager 객체가 모든 엔진의 초기화와 종료 루틴을 캡슐화 하고 있기 때문에 ApplicationManager 객체는 이 섹션에서 설명하는 TestStand 엔진 초기화, 파일 읽기, 실행, 로깅과 같은 많은 태스크를 처리할 수 있습니다. 

 

SequenceContext 객체


SequenceContext 객체는 TestStand API에서 가장 많이 사용되는 객체중 하나입니다. 이는 특정 실행중인 시퀀스 내부의 모든 데이터의 런타임 스탭샷과 같은 스퀜스의 실행 상태를 표시하는 기능을 제공합니다. SequenceContext는 일정 시간내의 특정 시점에서 특정한 시퀀스의 Context, State을 가지고 있습니다. 각 실행 중인 시퀀스는 자신의 SequenceContext를 보유하고 있습니다. 그러므로 만약 사용자가 4개의 시퀀스를 병렬적으로 실행하고 있으면, 적어도 4개의 SequenceConext 객체가 유효합니다. 


SequenceContext는 SequenceContext를 사용할 때 사용자는 모든 객체, 변수, 프로퍼티를 포함하고 있는 시퀀스 내부의 모든 정보에 접근을 할 수 있기 때문에 이해해야하는 핵심 요소입니다. 아래의 그림에 나와 있는 것처럼, SequenceContxt가 트리 구조의 최 상단이라는 것을 확인할 수 있습니다. 




게다가 SequenceContext는 메모리에 로딩되어 있는 주요 객체에 대한 레퍼런스를 제공합니다. 추가적으로 사용자는 SequenceContext를 TestStand 개발 환경에서 바로 사용할 수 있습니다. 또한 사용자는 스텝으로부터 사용자가 호출하는 모듈을 개발하기 위해서 현재 시퀀스 컨텍스트 혹은 이 객체가 소유한 하위 프로퍼티를 전달할 수 있습니다. 


SequenceContext 객체는 다양한 레벨과 프로퍼티들을 포함하고 있습니다. 아래의 테이블은 SequenceContext 프로퍼티의 가장 첫번째 레벨을 보여줍니다. 


Sequence Context 의 하위 프로퍼티

설명

Locals

현재 시퀀스 호출을 위한 일련의 지역 변수에 대한 런타임 복사본

Parameters

현재 시퀀스 호출을 위한 시퀀스 파라미터의 런타임 복사본

FileGlobals

현재 실행에 대한 시퀀스 파일의 글로벌 변수에 대한 런타임 복사본

StationGlobals

엔진 실행에 대한 스테이션 글로벌을 포함하고 있다. TestStand는 메모리에 스테이션 글보벌에 대한 단일 복사본을 유지한다.

ThisContext

현재 시퀀스 컨텍스트에 대한 레퍼런스를 보유하고 있다. 일반적으로 사용자는 하위 시퀀스나 스텝 모듈에 전달되는 매개변수로 전체 시퀀스 컨텍스트를 전달한다.

RunState

시퀀스 실행 중에 실행에 대한 상태를 표현하기 위한 프로퍼티를 포함하고 있다..

Step

현재 시퀀스 실행에 대해 현재 실행중인 스텝에 있는 프로퍼티에 대한 런타임 복사본

이 스텝 프로퍼티는 스텝이 실행 중에만 보유하고 있다. 이 프로퍼티는 브레이크 포인트와 같이 스텝 사이의 실행에서는 존재하지 않는다.


사용자가 SequenceContext 객체에 대한 프로퍼티와 함수를 공부할 때, 사용자는 이 객체로부터 유용한 정보를 획득할 수 있다는 점을 확인할 수 있습니다. 예를 들어 사용자는 현재 실행 중인 스텝, 쓰레드, 스텝 그룹등에 대한 레퍼런스를 획득할 수 있습니다. 사용자는 또한 사용자가 프로그래밍 적으로 실행의 흐름을 변경하고자 한다면 다은 스텝에 대한 스텝 인덱스를 가져와서 설정할 수도 있습니다. 


아래 그림은 SequenceContext에 대한 예를 보여줍니다. 이 그림에 대한 내용은 NI TestStand Help의 Sequence Context에서도 확인이 가능합니다. 그림 안에 있는 점은 컬럼이 왼쪽으로 더 갈 수 있다는 것을 나타냅니다.  

 



시퀀스의 실행이 완료되면, 실행 시간에 사용자가 변경하기를 원하는 SequenceContext 객체에 대한 변경 내역이 사라집니다. 예를 들어, 런타임시에 사용자가 프로그래밍 적으로 새로운 Local 변수를 만들고, 특정 시퀀스에 대한 Local 컨테이너에 이에 대한 값을 넣게 되면, 새로운 변수는 시퀀스가 실행 중일 때 까지만 유효하고 접근이 가능합니다. 실행이 종료되는 즉시, 이 변화에 대한 값을 사라집니다. 사용자가 런타임 시에만 존재하는 가상 데이터를 만들고자 한다면 이 기술을 사용할 수 있습니다. 만약 사용자가 이러한 변화에 대해서 지속성을 요구한다면, Sequencefile이나 Gloabal 오브젝트와 같은 지속성 있는 객체에 변화를 주어야 합니다. 

 

이러한 규칙에 대한 하나의 예외 사항은 PropertyObjectFile 클래스입니다. 이 클래스는 실행 완료 이후에도 이러한 변화를 유지하기 위해서 파일에 변화에 대한 저장을 하게 됩니다. 

 

RunState 하위 프로퍼티


RunState 객체는 SequenceContext 객체의 하위 프로퍼티로 시퀀스 실행에 대한 런타임 실행 상태를 표현하기 위한 프로퍼티를 가지고 있습니다. 이 객체 내에 있는 몇몇의 프로퍼티는 런타임 시에만 유효합니다. 아래의 그림은 TestStand의 시퀀스 에디터 상에 SequenceContext RunState의 객체를 보여줍니다. 




시퀀스 동적 생성 및 실행


TestStand 시퀀스 에디터는 테스트 시퀀스 생성 및 실행을 위한 일반적인 어플리케이션 입니다. 사용자들에게 시퀀스 에디터는 필요한 시퀀스 생성을 위해 필요한 모든 기능을 직접적으로 제공합니다. 그러나 실제상황에서 시퀀스 에디터는 TestStand 엔진의 최상이 프리젠테이션 레이어의 일부분입니다. 사용자가 New Sequence File 버튼을 눌렀을 때, 시퀀스에서 오른쪽 마우스 버튼을 통해서 스텝을 추가하거나 시퀀스 파일 저장합니다. 또한 시퀀스 에디터는 해당 엔진 함수와 프로퍼티를 처리하고, 조직적인 방법을 통해서 결과를 제공합니다. 

 

엔진으로부터 GUI를 구분하는 것은 사용자에게 시퀀스의 생성, 수정, 실행을 가능하게 해줍니다. 예를 들어 TestStand가 제공하는 사용자 기반의 사용자 인터페이스는 다른 컨텍스트 기반에서 시퀀스 에디터와 비슷한 기능을 제공하고 있습니다. 테스트 개발자와 엔지니어는 시퀀스 에디터의 모든 기능이 필요하지만, 공장에서 사용하는 사용자는 시퀀스를 실행하고 리포트만 보고자 할 것입니다. 실제 사용자에게 필요한 기능만 노출하는 방법을 이해하는 것은 개발자가 요구조건을 충족시키는 사용자 인터페이스를 만드는데 도움을 줄 수 있습니다. 많은 기능을 실제 사용자에게 노출하는 것은 이상적인 해결방안이 될 수 없습니다. 몇몇의 사용자는 동적 시퀀스 생성과 실행에 대한 최상위 기능을 제공하는 간단한 인터페이스를 원할 것입니다. 


아래의 예제는 시퀀스 파일이 생성 될 때 시퀀스 에디터가 호출하는 API 객체에 대한 간략히 정리된 리스트를 제공을 통해서 동적 시퀀스 생성에 대한 개념을 나타냅니다. 그림의 시퀀스 에디터에서처럼 TestFile에 대한 생성이 필요한 상황이라 가정을 해보겠습니다. TestFile이라 명명된 시퀀스 파일은 TestSeq 시퀀스를 포함하고, 이 시퀀스는 TestStep이라는 이름을 가진 스텝을 포함하고 있습니다. 



 

이 태스크를 완료하기 위해서, 사용자는 아래와 같은 객체를 알고 있어야 합니다.

  • Engine
  • SequenceFile
  • Sequence
  • Step
  • PropertyObject

 

아래의 pseudocode는 위의 그림에서 시퀀스 파일을 동적으로 생성하기 위해서 호출해야 하는 함수와 프로퍼티를 보여줍니다.:

 

myStep = Runstate.Engine.NewStep (adapterKeyNameVal, stepTypeName)

myStep.Name = “TestStep”

mySequence = Runstate.Engine.NewSequence

mySequence.Name = “TestSeq”

mySequence.InsertStep (myStep , index, stepGroupParam)

mySequenceFile = Runstate.Engine.NewSequenceFile

mySequenceFile.InsertSequenceEx (index, sequenceToInsert)

mySequenceFile.Save (pathString)

 

시퀀스 파일을 생성하기 위해서 SequenceView와 SequenceFileViewManager 사용자 인터페이스 컨트롤 또한 사용해야 합니다. TestStand UI 컨트롤은 일반 사용자의 이벤트를 처리하게 끔 구현되어 있습니다. 


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.




댓글