2015년 6월 11일 목요일

Swift 2.0 + Xcode 7 에서 Internal Class의 유닛테스트

Xcode 6 하에서 Swift 코드로 만들어진 프로젝트의 유닛테스트를 하려면 해당 모듈을 public으로 선언해야만 가능했다. (관련글: Swift 프로젝트의 유닛테스트(Unit Test)) 이는 Swift의 엑세스 컨트롤의 구현 의도와 Xcode에서 테스트 코드가 구성되는 방식의 의도가 다르다는 차이 때문에 발생하는 문제였다.

당연히 이렇게 되면 해당 모듈을 public 으로 선언해야 하는데 테스트 때문에 public 으로 풀어야 한다는 건 이상하다, 아니 문제가 있다. 애플에서도 이걸 느꼈는지 Swift 2.0대와 Xcode 7에 들어서는 이걸 수정하였다.

참고로 이 글은 Xcode 7 Beta1 을 기준으로 쓰여졌다. 상황에 따라 내용이 업데이트 될 수도 있다.

testable

Swift 2.0 에 들어서 새로 추가된 명령어로 '@testable'이 있다. 테스트 타겟에서 internal 모듈을 임포트 할 수 있도록 도와주는 키워드라고 생각하자. 아래와 같은 식으로 사용 할 수 있다.
@testable import ModuleProjectName
기존과 비슷하긴 한데 앞쪽에 @testable 이 붙는 것이 좀 다르다.

Xcode 7 Beta1에서 실제로 테스트 해 본 스크린샷을 보자.
TestApp 이라는 프로젝트를 만들고 여기다 MyClass.swift 파일을 추가해서 MyClass 라는 internal class를 추가하였다. 참고로, 별 다른 액세스 컨트롤 지시어가 없으면 internal 이라는 점을 잊지 말자. 위의 코드에는 이 엑세스 컨트롤 지시어가 없기 때문에 자동으로 internal 이 된다.

이제 테스트 타겟의 테스트 파일을 보자. 상단에 testable을 이용해 import를 하는 코드와, MyClass의 인스턴스를 이용해 테스트를 하는 단순한 코드를 구현하였다.

이렇게 코딩을 하면 앞서 이야기 한 대로 internal class 임에도 그대로 문제없이 빌드도 되고 테스트도 가능하다.
아무런 문제 없이 의도되로 테스트가 잘 되었다.

지금까지 만들어둔 개인용 모듈의 코드를 잔뜩 수정하라고 애플이 엿을 먹여주고 있다. 아아 괴롭다. 하지만 정상화 과정이라고 생각하고 노가다를 준비해야겠다. =_=

[관련글] Swift 프로젝트의 유닛테스트(Unit Test) - Xcode 6 버전 전용
[관련글] 스위프트(Swift) 가이드

댓글 없음 :