본문 바로가기
Programming/iOS

xcode 4.0에서 gh-unit을 이용해서 unittest 하기..

by 신규하 2011. 3. 3.
xcode 4.0으로 넘어 가면서.. 이래저래 익숙하지 않아서 난감한게 많네요.

코드를 작성하다가.. unittest를 하려고 하다 보니.. 4.0에서는 또 다른 일이네요 -_-;;
적용하다가.. 알게된  gh-unit이라는 라이브러리가 있어서.. 4.0용에서 사용 하는 과정을 정리해 봤습니다.
이게 ui도 잘 되어 있고, 훨씬 좋더라구요 ^^;



시작 하시기 전에 기존 프로젝를 띄우시거나, 빈 프로젝트를 띄어 줍니다.

1. target 추가 하기.

File > New > New Target... 으로 타겟을 추가해 줍니다.
Application > Window-based Application 을 선택해 줍니다.
여기선  tests라는 이름으로 타겟을 작성했습니다.
Unit Tests는 다른걸로 할꺼니까.. 꺼줬습니다.

Tests의 Build Phases에서 Link Binary With Libraries에 보시면, 이렇게 4개가 추가되어 있으면 정상적으로 추가 된겁니다.


2. 프레임워크 추가하기

https://github.com/gabriel/gh-unit/downloads
이 주소로 가셔서 최신의
여기서 사용한건 GHUnitIOS-0.4.27.zip 이 파일 입니다.
(0.4.28도 있는데.. 이건 오류가 나서 실행이 안 됩니다.. ^^;;)

다운로드 받은 파일의 압축을 푸시고, 프로젝트 폴더에 복사해서 넣습니다. (프로젝트를 끌어 오는 과정에 copy로 해서 옮겨 오셔도 상관은 없습니다.)
복사한 폴더를 UnitTest를 할 타겟(여기서는 Tests)에 드레그 해서 추가해 줍니다.

추가 할때  Add to targets에 Tests만 키고.. 원래 있던 프로젝트의 체크 박스는 꺼 줍니다.

혹시 다른 폴더에 있는 프레임워크를 추가하신 분은 "Tests"의 Build Settings에서 'Framework Search Paths'에 해당 폴더를 추가해 주세요.

그리고 "Tests" Build Settings에서 'Other Linker Flags'에
  • -ObjC
  • -all_load
이렇게 2개를 추가해 줍니다.

혹시, 위 설정이 안 보이시는 분들은 중간에 보시면, Basic이라고 되어 있는 거 옆에 All이라는 버튼이 있습니다. 그걸 누르시면 보일 겁니다.

3. info.plist 변경하기.
각 프로젝트 마다.. 프로젝트-Info.plist 파일이 있을 겁니다.
여기서는 Tests-Info.plist인데.. 여기서  Main nib file base nameMainWindow라고 있을 겁니다.
이 필드를 지워 줍니다.

이걸 지워 주지 않고 실행 하면, 흰색 빈 화면만 나오게 됩니다.

4.Unit Test 코드 넣기.

Tests의 밑에 보시면 main.m이라는 파일이 있습니다.
이 파일의 내용을 모두 지우고, 아래와 내용을 붙여 넣기 합니다.
원본은 좀 긴데.. 블로그에 쓰기 길어서 주석을 좀 제외 했습니다.

원본 : https://github.com/gabriel/gh-unit/blob/master/Project-IPhone/GHUnitIOSTestMain.m
#import <UIKit/UIKit.h>
#import <GHUnit/GHUnit.h>

void exceptionHandler(NSException *exception) {
    NSLog(@"%@\n%@", [exception reason], GHUStackTraceFromException(exception));
}

int main(int argc, char *argv[]) {
        NSSetUncaughtExceptionHandler(&exceptionHandler);
   
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   
    int retVal = 0;

    if (getenv("GHUNIT_CLI")) {
        retVal = [GHTestRunner run];
    } else {
        retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");
    }
    [pool release];
    return retVal;
}
main.m이 2개 있어서 찝찝하신 분은 main.m을 지우고, 원본 파일을 사용하셔도 괜찮습니다.
다만 그 다른 이름의 파일이 컴파일될 파일 목록에 있는지만 체크 하세요.
그리고 2번째 줄에서 #import <GHUnitIOS/GHUnit.h> 에서 IOS를 빼 주고 넣어 주시면 됩니다.

그리고 테스트 할 파일을 추가해 줍니다.
파일을 새로 만드시고, h와 m 파일에 아래와 같이 넣어 줍니다.
ExampleTest.h
#import <Foundation/Foundation.h>
#import <GHUnit/GHUnit.h>

@interface ExampleTest : GHTestCase { }
@end

ExampleTest.m
#import "ExampleTest.h"

@implementation ExampleTest

- (BOOL)shouldRunOnMainThread { // By default NO,
// but if you have a UI test or test dependent on running on the main thread return YES
return NO;
}

- (void)setUpClass {
// Run at start of all tests in the class
}

- (void)tearDownClass {
// Run at end of all tests in the class
}

- (void)setUp {
// Run before each test method
}

- (void)tearDown {
// Run after each test method
}

- (void)testFoo {
NSString *a = @"foo";
GHTestLog(@"I can log to the GHUnit test console: %@", a);
// Assert a is not NULL, with no custom error description
GHAssertNotNULL(a, nil);
// Assert equal objects, add custom error description
NSString *b = @"bar";
GHAssertEqualObjects(a, b, @"A custom error message. a should be equal to: %@.", b);
}

- (void)testBar {
// Another test
}


@end


3.Unit Test 실행해 보기
여기까지 잘 마치셨다면, xcode 4.0의 상단에 보시면, run, stop 옆에 선택상자가 있을 겁니다.
여기서 Tests | iPhone 4.2 Simulator 를 선택하고 run 버튼을 누릅니다.
그러면, 아래와 같이 Unit Test가 실행이 됩니다.


run을 눌러서.. 제작한 함수가 정상적으로 잘 동작하는지 확인해 보시면 됩니다.




댓글