Unit Test를 돌리다 보면 테스트 통과여부를 아는 것 만으로는 부족할 때가 있다.

테스트가 fail이 되었는데 도대체 왜 그랬는지 도통 감이 오지 않을 때에는,
디버깅을 해 보는 것이 많은 도움이 된다.

OCUnit에서 디버깅을 하려면, 다음과 같이 설정해 주면 된다.

1. Project - New Custom Executable을 클릭한다.






















2. 다음과 같이 입력하고 Finish 버튼을 누르면 'otest' 라는 이름의 Executable이 하나 만들어 진다.























3. 새로 만든 Executable 'otest' 의 Info 창을 띄우고 다음과 같이 Arguments와 Variables 를 설정한다. 2번째 Argument인 "Unit Test.octest" 에서 "Unit Test" 는 앞서 추가한 UnitTest bundle의 이름이다. Xcode 최신 버젼(3.1.2)에서는 세 번째 variable인 OBJC_DISABLE_GC를 YES로 설정해 주어야 한다.






































4. Active Executable을 방금 추가한 otest로 바꾼다.











5. break point를 설정하고, Debug 버튼을 눌러 마음껏 디버깅을 해 보자!



















P.S)
1. 참고사이트
http://beatworm.co.uk/blog/computers/tracing-unit-tests-with-the-xcode-3-debugger/
http://chanson.livejournal.com/119578.html

2. iPhone OS 2.2 / 2.2.1 에서는 몇몇 Framework( ex)UIKit.framework )를 추가하면 디버깅이 되지 않는다. 다행히도, Foundation.framework은 잘 돌아간다. UIKit을 사용하는 부분을 테스트 할 일은 그리 많지 않을 것이니 사용하는 데 큰 지장은 없을 것이다(하지만 찝찝한 건 어쩔 수 없다...) iPhone OS 3.0에서는 이 문제가 해결되었기를...

OCUnit은 Cocoa/Cocoa touch용 유닛 테스트 도구이다.
unit test용 bundle을 추가한 후, test 메소드를 몇 개 추가하여 간단하게 유닛테스트를 수행할 수 있다.

Cocoa에서는 간단하게 사용할 수 있으나 Cocoa touch(iPhone OS 2.2 / 2.2.1)에서는 제대로 동작하지 않아서 설정값 몇 개를 변경해 주어야 한다. iPhone OS 3.0에서는 제대로 동작하기를...

OCUnit을 사용하는 법은 다음과 같다.

1. 새로운 target을 추가한다.













2. Cocoa / Unit Test Bundle 을 선택하여 추가한다. 적절한 Target Name을 입력한 후 Finish 버튼을 누르면 Unit Test Bundle이 추가된다.






















3. 새로 추가된 Unit Test Bundle의 Info 창을 연다.(iPhone OS 2.2 / 2.2.1(이하 iPhone OS)관련 내용)













4. Build tab에서, User-Defined Settings’ 과 ‘Other Linker Flags' 항목을 삭제한다.(iPhone OS 관련 내용)



































5. General 탭의 'Linked Library' 란에 다음 경로의 프레임웍을 추가한다: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.2.sdk/Developer/Library/Frameworks/SenTestingKit.framework  (iPhone OS 관련내용)



















6. 기존 Application target의 Info 창을 연 후에, 'Direct dependencies' 란에 생성한 Unit test bundle을 추가한다. Application 빌드 시에 Unit Test bundle도 같이 빌드되도록 하여 , test bundle을 빌드하기 위해 Active Target을 바꿀 필요가 없도록 하기 위한 작업!




















7. Unit Test target에 다음과 같이 필요한 framework을 추가한다. Foundation.framework은 기본적으로 추가하는 것이 좋다.

















8. Unit Test target에 다음과 같이 Objective-C test class 를 추가한다.










































9. 추가한 testcase class(여기서는 UnitTest.m)를 열고 다음과 같이 testSample 메소드를 추가한 후 빌드한다. 모든 유닛 테스트 메소드(testSample과 같은)가 성공한 경우에는  'Build succeeded' 메시지가 나온다. OCUnit에서는 테스트 케이스 실행 = 빌드 인 것이다.

10. test가 실패한 경우에는 다음과 같이 에러메시지가 뜬다. 유닛 테스트 실패 = 빌드 에러 인 것이다. 빌드만으로 유닛 테스트를 실행시킬 수 있어서 킹왕짱 편리하다.


















11. test case에 다음과 같이 추가하여 시뮬레이터 상에서만 테스트가 실행되도록 한다.




















p.s)
1. 참고 URL
http://www.sente.ch/s/?p=535&lang=en

2. OCUnit 관련 정보. 사용할 수 있는 assert 목록 등의 유용한 정보가 들어 있다.
http://developer.apple.com/mac/articles/tools/unittestingwithxcode3.html