woong's

Xcode Unit Test 하기 본문

Develop/IOS

Xcode Unit Test 하기

dlsdnd345 2016. 3. 14. 12:41

Xcode Unit Test 하기


이전 포스트에서 Android Unit Test 관련해서 정리를 하였습니다.

최근에 IOS 개발도 하고 있어서 Unit Test 같이 도입 하면 좋을 것 같아서 이번에

정리 해보려 합니다 . Xcode Unit Test 도 Android 와 거의 비슷해서 쉽게 작성해

볼수 있었습니다.


사전 준비 작업

Unit Test 를 하기 위해서 몇가지 사전 작업이 필요 합니다.


1. 프로젝트 UnitTest Include

   프로젝트 생성 시점에서 Include Unit Tests 를 선택 해야 합니다.



위와 같이 프로젝트를 생성하면 프로젝트 폴더구조를 보면 기존에 없던 UnitTests 폴더가 생성됩니다.




2. coverage 옵션 활성화

    coverage 활성화는 할 필요는 없지만 , test 코드가 된부분 , 안된부분을 표시해주기때문에

    유용하게 사용할수 있습니다. 사용하기 위해서는 옵션을 추가해야 합니다.







Edit Scheme < Test < Code Coverage 를 선택합니다.

여기까지 옵션 설정을 했으면 사전 준비작업은 모두 완료되었습니다.

이제 코드 작성을 통해서 Test과정에 대해 작성해 보겠습니다.


코드 작성

1. 테스트할 코드 작성

   프로젝트 루트에 테스트할 클래스를 작성 합니다. 간단하게 

   더하기 , 나누기 코드를 작성 했습니다.

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import "Calculator.h"
 
@implementation Calculator
 
 
/**
 * 더하기
 */
- (int) sum :(int) a :(int)b {
    return a + b;
}
 
 
/**
 * 나누기
 */
- (int) divide :(int) a :(int)b {
    return a / b;
}
 
@end
 
cs



2. 테스트 코드 작성

    uintTests 폴더에 Unit Test Case Class 를 생성 합니다.

    


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#import <XCTest/XCTest.h>
 
@interface CalculatorTestCase : XCTestCase
 
@end
 
@implementation CalculatorTestCase
 
- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}
 
- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}
 
- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}
 
- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}
 
@end
 
cs


그럼 위와 같은 템플릿 코드가 나타 납니다. 여기서 간단한 설명을 드리겠습니다.


setUp : 초기화 코드를 작성

tearDown : 해제 코드를 작성

setUp , tearDown 함수가 있습니다. 이함수는 Test 함수 앞,뒤로 실행이 됩니다. test 함수가 두개존재하면

setUp , test 함수 1 , tearDown / setUp , test 함수 2 , tearDown 이렇게 동작 합니다.


testPerformanceExample 함수는 퍼포먼스 테스트에 이용이 된다고 합니다.


이포스트를 통해서는 UnitTest 를 목적으로 사용되기 때문에 필요없는 코드를 제거 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#import <XCTest/XCTest.h>
#import "Calculator.h"
 
@interface CalculatorTestCase : XCTestCase
 
@end
 
Calculator *calculator;
 
@implementation CalculatorTestCase
 
 
 
- (void)setUp {
    [super setUp];
    
    calculator = [[Calculator alloc] init];
}
 
 
- (void)tearDown {
    [super tearDown];
}
 
 
- (void)testSum {
    
    int result = [calculator sum: 6 : 7];
    XCTAssertEqual(result, 13);
}
 
 
@end
 
cs


위와 같이 코드를 작성 했습니다.

테스트할 코드를 import 하고 초기화 하였습니다, 초기화는 setUp에서 진행하고

testSum 함수를 통해서 sum 함수를 테스트 하였습니다.


XCTAssert 문법에는 여러 비교 함수가 존재 합니다. 입맛이 따라 골라서 사용하면 되겠습니다.







위와 같이 작성하고 왼쪽 프로젝트 인스펙터에서 다섯번재 탭을선택 합니다.

마우스 커서를 올리면 테스트 런을 할수 있는 아이콘이 나타 납니다. 테스트 코드를 작성하고





왼쪽에 보면 초록색으로 테스트 코드가 통과 되었다고 표시가 되었습니다. 이런방식으로 Unit Test를 할수 있습니다.

하지만 여기서 의문이 있어야 합니다. 내가 그럼 테스트 하지 않은 코드가 무엇이고 , 테스트한 코드는 무엇이며,

내가 놓친것이 무엇인지를 알아야 합니다. 위에서 coverage 옵션을 설정한것이 위와같은 의문을 해결하기 위한 것입니다.


결과 화면


7번째 탭을 선택합니다.



7번째 탭을 선택 < Test < Coverage 선택

위와 같이 선택 하면 클래스의 테스트 퍼센트가 나타납니다.

어떤 클래스가 테스트가 되었고 안되었는지 한눈에 확인 할수 있습니다.

저희가 테스트한 Calculator 를 선택하면

테스트 코드가 통과한 코드는 초록색

테스트 코드가 없는 코드는 빨간색

으로 표시가 됩니다. 이제 어떤코드가 테스트가 되었고 안되었는지 분명해졌습니다.






결론


이와 같이 테스트 코드를 통해서 비지니스 로직을 미리 테스트 해볼수 있고 ,

예외 상황의 값을 미리 대입해서 놓칠수 있는부분을 채울수 있을것 같습니다.

테스트 코드를 통해서 시간이 낭비된다고 생각할수있지만 , 적절히 잘 사용하면

품질 높은 코드를 작성하면서 시간을 단축 할수도 있다고 생각합니다.




Comments