-
[Swift] Swift로 유닛테스트를 하려면? How to Unit-test in Swift?앱등이에게 살충제를 뿌린다./Swift 2017. 1. 9. 19:11
<새해에는 나도 열심히 포스팅을>
Writing Tests with Swift
The Swift access control model prevents tests from accessing internal declarations in the app or framework. To access internal functions in Swift with Xcode 6, you need to make these entry points public for testing, reducing the benefits of Swift’s type safety.
Xcode 7 provides a two-part solution for this problem:
Swift internals are made accessible when building for testing by informing the compiler of the build’s intent. The changes to compilation are controlled via a new
-enable-testing
flag, emitted during the build when Xcode executes your test build action. This behavior is controlled by theEnable Testability
build setting, set toYes
by default for new projects; it requires no changes to your source code.The visibility of testable entry points is restricted to clients who ask for it via a modification to
import
statements. The modification is implemented by a new@testable
attribute toimport
, a one-time change to your test code that requires no changes to your app code.
Swift로 Test하기
Swift의 Access Control Model으로는 앱 또는 프레임워크의 내부 Declaration에 접근할 수 없다. 그래서 Swift6에서는 별도의 entry point를 만들어야 했는데, 이는 Swift의 타입안정성에 위반된다.
그래서 XCode7에서 2단계의 해결방안이 소개되었다.
1. Swift를 빌드할 때, 빌드옵션을 주어 컴파일러에게 이런 메시지를 전달한다. '테스트를 위한 빌드니까, internal declaration에도 접근할 수 있게 해줘.'
이 옵션은 빌드셋팅에 있는 Enable Testability이다. YES로 설정하면 위에서 설명했듯이 컴파일러가 테스트를 위한 빌드를 한다.
2. 테스트를 위한 entry point의 visibility를 특수한 import구문의 경우에만 visible하도록 제한한다. import구문에 @testable을 붙여준 경우가 이에 해당한다.
(그냥 import Target로 쓰면 안되고 @testable import Target으로 해주면 된다는 아주 간단한 말인데 뭘이리 어렵게 설명하는건지)
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[iOS/Swift] Equtable프로토콜의 == function은 override가 안되잖아. (0) 2017.04.22 [Swift3의 Access Control] - open Class가 뭐야? (0) 2017.01.11 [Raywenderlich] Swift3에서 달라진 점 ( What's new in Swift3? ) (0) 2017.01.01 [Swift] static 함수와 class 함수! static func vs class func (7) 2016.07.20 [Swift] String의 subString을 subscript로 구현해보자. (0) 2016.05.01