2009-06-22 2 views
6

내 코코아 애플리케이션의 GUI 부분에 대한 단위 테스트를 작성하고 싶습니다.Xcode에서 GUI의 자동화 된 단위 테스트를 작성하려면 어떻게해야합니까?

교과서 단위 테스트에는 테스트중인 단위를 호출하는 테스트 프레임 워크와 테스트 케이스가 있습니다. 그 단위 아래의 모든 코드가 조롱 당합니다. 따라서 입력과 출력 모두 제어되고 모니터링됩니다. 테스트중인 유닛의 코드 만 테스트됩니다.

테스트중인 유닛이 내 GUI 인 곳에서 동일한 작업을 수행하고 싶습니다.
1) GUI 컨트롤을 조작하고 검사 할 코드를 작성할 수있는 프레임 워크를 설정하십시오.
2) 내 GUI 컨트롤을 실제 인스턴스가 아닌 실제 코드의 mock에 연결하십시오.
3) 컨트롤을 조작하는 테스트를 실행 한 다음 mock 객체를 검사하여 올바른 매개 변수로 올바른 메소드가 호출되었는지 확인하고 GUI를 검사하여 mock 객체의 응답이 위젯에서 올바른 변경을하는지 확인합니다 .

누구든지이 작업을 수행합니까? 그렇다면 어떻게? 내가 어떻게이 일을 할 수 있을지에 대한 아이디어가 있니?

감사합니다,

(편집) 매우 구체적인 예제를 제공하기 위해

, 내가 할 :
1) '내 메뉴'메뉴 항목을 선택하는 테스트 케이스 작성 -> '를 MyItem '. 이 테스트 케이스에서는 [AppDelegate doMyItem] 메서드가 정확하게 한 번 호출되고 AppDelegate의 다른 메서드가 호출되지 않는지 확인하고 싶습니다.
2) AppDelegate의 모의 객체를 생성합니다. (나는 이것을하는 법을 알고있다.)
3) 어쨌든 (여기에 핸드 오버) AppDelegate의 mock 인스턴스가 실제 인스턴스 대신 연결되도록 내 애플리케이션을 연결한다.
4) 테스트를 실행하십시오. 조심해라. 1) MyMenu를 아직 만들지 않았기 때문이다. 2) 아직 MyItem을 만들지 않았습니다. 3) 아직 'doMyItem'메소드를 작성하지 않았으므로 MyItem을 [AppDelegate doMyItem]에 연결하는 IB 작업을 수행하지 않았습니다.
5) 위의 네 가지 문제를 해결하십시오 (그 날 정말 열정적이라면 한 번에 하나씩).
6) 테스트를 다시 실행하고 성공한 것으로 간주하십시오.

질문이 명확합니까?

답변

1

다음은 일반적으로이 작업을 수행하는 몇 가지 일반적인 방법입니다 (대부분의 경우 모든 코코아 언어와 호환 가능).

1 - 콜백 인터페이스를 만듭니다. GUI 요소를 작성할 때 입력 중 하나는이 인터페이스의 구현입니다. 사용자 상호 작용이있을 때 GUI 요소는 해당 인터페이스에서 업데이트 기능을 호출합니다. 실제 구현 및 테스트 구현이 필요합니다.

2 - 이벤트 처리기를 사용하십시오. 모든 GUI 요소를 하나 이상의 이벤트 핸들러에 등록하고 GUI가 사용자 상호 작용시 이벤트를 생성하도록하십시오. 실제 구현과 테스트를위한 두 개의 구현을 가진 이벤트 처리기 인터페이스를 갖습니다.

편집 : 누락 된 항목 # 1. OSX 특정 컨트롤을 사용하여이 작업을 수행하지는 않았지만 일반적으로 두 가지 접근 방법이 있습니다.

1 - 사용자와 유사한 입력을 생성하는 스크립트 또는 앱을 만듭니다. 실제로 GUI를 검사하기가 쉽지 않은 단점이 있습니다. 대신에 좋은 테스트 케이스를 생성하여 거기에 있어야하는 모든 것이 있는지, 그리고 여분의 것이 있는지 확인해야합니다.

2 - 렌더링 및 인터페이스 계층을 대체하는 테스트 구현으로 인터페이스를 생성합니다. SDL이나 directFB와 같은 라이브러리에서는 OSX API, win32 API 등과 같이 사용하기가 더 쉽습니다.

편집 : 문제의 편집에 응답합니다.

테스트 응용 프로그램이 GUI를 시작하는 간단한 응용 프로그램 또는 스크립트 다음 마우스/키보드를 생성 : 여기에 별도의 테스트 응용 프로그램 및 이벤트 핸들러를 사용하여 예제의 경우

, 그것은 보이는 것 방법 입력 파일을 기반으로하는 이벤트. 내가 말했듯이, OSX (QNX 만)에서는이 작업을 수행하지 않았습니다. 행운을 빌어 API로 마우스 및 키보드 이벤트를 생성 할 수 있지만 가능한 경우 다른 사람에게 요청해야합니다.

테스트 케이스에 대한 입력을 만드십시오. 테스트 응용 프로그램은이를 처리하여 무엇을해야하는지 알 수 있습니다. 다음과 같은 단순한 XML 일 수 있습니다.

<testcase name="blah"><mouseevent x="120" y="175" type="click"/></testcase> 

또는 실제로 마우스 시퀀스가 ​​무엇이든간에.

스크립트가 해당 명령을 실행하면 해당 버튼을 마우스로 클릭합니다. 귀하의 이벤트 처리기가 이것에 데리러 것입니다. 그러나 이제는 테스트 이벤트 처리기를 사용하기 위해 --test 플래그 또는 일부로 앱을 실행해야합니다. 앱이 일반적으로하는 일을하는 대신, 테스트 이벤트 핸들러는 맞춤 액션을 수행 할 수 있습니다. 예를 들어 정상 동작 중 일부 (응답하려면 GUI가 필요함)를 수행 한 다음 테스트 응용 프로그램에 (소켓, 파이프 등을 통해) 메시지를 보냅니다.

테스트 응용 프로그램이이 메시지를 받아서 예상과 비교합니다. 그래서 지금 어쩌면 당신의 테스트 케이스 XML은 다음과 같습니다

<testcase name="blah"> 
    <mouseevent x="120" y="175" type="click"/> 
    <response>doMyItem() called</response> 
</testcase> 

이벤트 처리기에서 발생하는 응답이 다른 경우, 다음 테스트 케이스가 실패했습니다. 디버깅에 도움이되는 실제 응답을 인쇄 할 수 있습니다.

+0

안녕 Patros, , 나는 확실히 그것을 '사용자와 같은 입력을 생성'에게 어떤 의미인지 표시되지 않습니다. 예를 들어 줄 수 있습니까? 감사합니다. Pat –

+0

보고 싶은 키보드 및 마우스 이벤트를 생성하기 만하면됩니다. API에 액세스하거나 사용자 정의 드라이버를 작성하여 원시 UI 클래스를 랩핑하고 이벤트를 하이재킹하여이를 수행 할 수 있습니다. – patros

3

두 원칙, 두 개의 링크 :

  • passive view 패턴, 가능한 한보기로 바보 확인이 쉽게 GUI는
  • Trust but verify을 테스트 할 수 있습니다 :, 버튼, 메뉴의 신뢰 코코아 구현을 .. 그러나 target and action이 올바르게 연결되어 있는지 확인하십시오. bindings은 예상대로입니다.
1

접근성 프레임 워크를 살펴 보셨습니까? 한 응용 프로그램이 다른 응용 프로그램의 UI를 검사하고 사용자와 같은 상호 작용 이벤트를 생성해야합니다. 두 번째 # 1의 경우

Accessibility Overview

관련 문제