Unit Test 연동

Xcode에서는 iPhone의 Unit Test를 지원하기 위해 OCUnit이라는 Unit Testing framework를 xcode 3.0 버전부터 공식적으로 지원하고 있다. 따라서, Xcode의 OCUnit을 통해 생성된 프로젝트에 UnitTest Case를 쉽고 빠르게 생성하고 테스트할 수 있다.
Xcode에서는 Logic Test와 Application Test라는 두 가지 타입의 Unit Test를 지원한다.
Logic Test는 App에서가 아닌 Build Phase에서 Test를 진행하며 소프트웨어의 Logic이나 Algorithm을 테스트하기 위한 방식이다.
단순 메소드나 한개 혹은 여러 개 클래스를 테스트 할 수 있다. 기능의 정상적인 동작을 확인하는 테스트 외에 실제 application과 다른환경을 설정하여 테스트하는 Stress Test도 수행할 수 있다. 
Application Test는 동작하는 application에서 기능을 테스트하는 방식이다. 실제 Device 상에서 테스트가 이루어지기 때문에 iPhone에 있는 Resource를 이용하는 모듈에 대한 Test가 가능하며 User Interface Control의 연결이 잘 설정되었는지 여부도 확인할 수 있다. 
 
 iPhone Unit Test를 위해 사용하는 Logic Test와 Application Test의 설정방법은 다음과 같다.
  • Logic Test 설정방법
    • Xcode에서 Project > New Target메뉴나 Groups & files의 Targets그룹에서 마우스 오른쪽 버튼을 클릭하여 Add> New Target으로 새로운 Target Bundle을 생성함.

                          u1.jpg

    • New Target 템플릿 윈도우에서 Cocoa Touch > Unit Test Bundle을 선택한 후 Next 버튼 클릭함.

                           u2.jpg

    • Target Bundle명을 넣고 finish를 클릭하여 Group and Files의 Targets그룹에 새로 추가된 Target Bundle을 확인함.

                           u3.jpg



 

  • Application Test 설정방법
    • Xcode에서 Group & files의 Targets그룹에 현재 생성된 Target Application을 선택한 후 마우스 오른쪽 버튼을 클릭하여 Duplicate를 선택한 후 새로운 Target Application을 생성함.
    • Application Test는 실제 실행을 위한 Executable Target이 필요함. Duplicate 기능을 이용하면 기존의 프로그램 설정을 그대로 적용하여 실행할 수 있는 Executable Target을 생성할 수 있음.
    • 새로 생성된 Target Application 명 규칙은 <Application_name> + Testing의 형태로 설정함. Target Application 명은 자유롭게 설정이 가능하나 마지막에(suffix) 반드시 Testing을 포함시켜야 함. ex) ApplicationTesting

                          u4.jpg 

    • Xcode에서 Project > New Target메뉴나 Groups & files의 Targets그룹에서 마우스 오른쪽 버튼을 클릭하여 Add > New Target으로 새로운 Target Bundle을 생성함.

                              u5.jpg

    • New Target 템플릿 윈도우에서 Cocoa Touch > Unit Test Bundle을 선택한 후 Next 버튼 클릭함.

                          u6.jpg

 

    • Target Bundle명을 넣고 finish를 클릭하여 Group and Files의 Targets그룹에 새로 추가된 Target Bundle을 확인함.
    • 새로 생성되는 Target Bundle명 규칙은 <Application_name> + Tests의 형태로 설정함. 이름은 자유롭게 설정이 가능하나 마지막에는(suffix) 반드시 Tests을 포함시켜야 함. ex) ApplicationTests

                          u7.jpg

 

 

  • TestCase Class생성방법
    • Group and Files 목록에 그룹을 추가하기 위해서 프로젝트 명에서 마우스의 오른쪽을 클릭하여 Add > New Group 메뉴를 선택하고 Test 클래스가 있을 Group을 생성하고 Group 명을 설정함. Group명은 특별한 규칙이 없이 자유롭게 작성이 가능함.

                          u8.jpg

 

    • 새로 생성한 Group에 마우스 오른쪽 버튼을 클릭하여 Add > New File을 실행하면 New File 템플릿 윈도우에서 Objective-C test case class형식의 파일을 선택 후 Next 버튼을 클릭함.

                         u9.jpg

 

    • 생성할 Test case의 파일 명과 파일 명 바로 아래에 있는 Also create XXX.h 옵션도 함께 선택함. 이때 Targets은 Executable Target이 아닌 Target Bundle (ApplicationTests)만 선택한 후 Finish 버튼을 클릭함.

                          u10.jpg

 

    • 생성한 Test class Group에 새로 생성된 Test Case Class 코드가 추가된 것을 확인할 수 있음.

                          u11.jpg

 

  • Target Dependency 설정
    • Target 그룹의 Target Bundle (ApplicationTests)을 더블 클릭한 후 Target Info 윈도우에서 General 탭을 선택함.

                          u12.jpg

    • Direct Dependencies의 ‘+’ 버튼을 클릭하여 원 Application Target 'OCT'을 선택하여 추가함

                          u13.jpg

 

    • Target 그룹의 Target Application (ApplicationTesting)을 더블 클릭한 후 Target Info 윈도우에서 General 탭을 선택함.

                          u14.jpg

 

    • Direct Dependencies의 ‘+’ 버튼을 클릭하여 Target Bundle 'ApplicationTests'을 선택하여 추가함 

                          u15.jpg

 

    • Products 폴더에서 생성된 Target Bundle 이름의 octest파일(ApplicationTests.octest)을 Target Application(ApplicationTesting)> Copy Bundle Resource로 dragging하여 Copy시켜 생성함.

<Products 폴더에 octest 파일이 빨강색인 경우>
octest 파일의 글자 색이 빨강색으로 나올 경우 Build가 진행되지 않았기 때문으로 Build를 진행시키면 빨강색은 사라짐.

 

 

                        

 

                         u16.jpg

 

    • Xcode 좌측 상단에 있는 설정버튼을 클릭하여 Active Target을 Target Application (ApplicationTesting)으로 선택함.
    • Active Executable 은 Target Application(ApplicationTesting – iPhone Simulator3.1.3)선택함.

                        u17.jpg

 

  • Build 환경 설정 및 Unit Test결과확인
    • Group&files에서 Project와 Target을 더블클릭하면 빌드설정 창이 나타나고, BaseSDK 설정을 Device 모드로 변경함. 
    • UnitTest 코드가 생성되면 소스코드 안에 LigicTest와 ApplicationTest를 수행할 수 있는 샘플 테스트코드가 기본적으로 제공됨. 실제 새로운 테스트코드를 작성할 경우 이 샘플코드는 지우고 사용함.  
    • 샘플코드의 헤더파일에서 정의된 USE_APPLICATION_UNIT_TEST 값을 '1'로 설정하면 testAppDelegate함수가 호출되면서 ApplicationTest 방식의 테스트가 수행됨.
    •  USE_APPLICATION_UNIT_TEST 값을 '0'으로 설정하면 testMath 함수를 호출되며 LogicTest 방식의 테스트가 수행됨.
    • Device가 연결되지 않은 경우에는 USE_APPLICATION_UNIT_TEST 값 설정을 '0'으로 변경하고 Simulator로 logicTest를 수행하고 결과를 확인할 수 있음. 

u29.jpg

 

    • 설정을 모두 마치고 Xcode에서 Build > Build를 수행하여 결과를 확인함.
    • Xcode에서는 Build 시 Unit Test 결과를 Xcode 하단에 함께 표시하고 있음.
      Test 성공 시 ‘Succeeded’라는 메시지가 표시되고 Test 실패 시 ‘Failed’라는 메시지가 표시됨.

                          u20.jpg

    • 표시된 결과 메시지를 클릭하여 Unit Test의 수행된 총 테스트 케이스와 어떤 테스트 케이스에서 성공 및 실패 여부, 테스트케이스 소요시간 등의 상세정보를 확인함.

                          u21.jpg

 

                          u22.jpg

 

 

  •  Unit Test 결과의 CI 연동
    • OCUnit 결과를 JUnit 형태의 xml파일로 변경시켜주는 ocunit2junit.rb 파일을 /usr/bin/ 디렉터리에 추가함
    • xcodebuild clean 명령어를 설정하고 Target은 LogicTest Target Bundle 명으로 설정함.

                         u23.jpg

xcodebuild clean -target "LogicTest Target bundle 명” -configuration Debug

 

    • Target 대상 프로젝트를 수행시키는 xcodebuild 명령어 설정함.

                          u24.jpg

 

                                    xcodebuild -target "LogicTests" -configuration Debug

                                    -sdk /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/

 

    • Hudson CI Build의 Execute Shell에서 xcode build설정 다음에 | /usr/bin/ocunit2junit.rb 으로 설정함. 
      ocunit2junit.rb는 OCunit의 결과파일을 JUnit 형태의 xml 파일로 변경하여 Hudson CI의 JUnit Plug- in을 통해 설정할 수 있는 스크립트 파일임. 

                          u25.jpg

    • Hudson CI의 Publish JUnit test result report을 선택하고 test-reports/*.xml 로 설정함.

                         u26.jpg

    • Build Now를 실행하면 해당 Unit Test 결과 그래프를 확인함.


                   u27.jpg


'iOS' 카테고리의 다른 글

메모리릭 현상(1)  (0) 2011.01.31
Custom UINavigationController  (0) 2011.01.24
NSOperation  (0) 2011.01.11
NSOperationQueue  (0) 2011.01.10
NSNotificationCenter  (0) 2011.01.05

+ Recent posts