[Swift] 타입의 인스턴스, 이니셜라이저를 테스트 해야할까?

Ryan (Geonhee) Son·2021년 5월 1일
0

오늘의 고민

목록 보기
6/10

결론
Swift에 존재하는 타입의 인스턴스는 생성과 초기화가 이니셜라이저에 의해 보장되므로 테스트하지 않아도 된다. 반면 init?()과 같은 실패 가능한 이니셜라이저는 테스트 대상이다.

유닛 테스트를 학습하면서 어떤 것이 테스트의 대상이 되는지 고민했습니다. 예를 들어 타입의 인스턴스가 성공적으로 생성되었는지를 확인하는 것도 하나의 테스트라고 생각했었지요. 유닛 테스트 번들에서 아래와 같이 테스트해보았습니다.

// MARK: - Person class
class Person {
    let name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
}

// MARK: - Test method for initailizing person class
func testInitializingPerson_whenNameAndAgeAreGiven_hasGivenNameAndAge() {
    let ryan: Person = Person(name: "Ryan", age: 3)
    
    XCTAssertEqual(ryan.name, "Ryan")
    XCTAssertEqual(ryan.age, 3)
}

결과는 당연히 성공! 이때까지 저는 당연한 것은 없다고 생각하고 모든 것을 테스트해야 한다고 생각했습니다. 하지만 코드 리뷰를 받고 init?()과 같은 실패 가능한 이니셜라이저가 아니라면 이니셜라이저 자체를 테스트하지는 않아도 된다는 결론을 얻었어요.

리뷰 내용:
음.. 스위프트 인스턴스의 가장 큰 장점 중 하나는 init이 되면 인스턴스의 생성과 초기화가 보장된다는 것이에요. 그래서 아예 init에 대해서는 검증할 필요가 없습니다.
init? 등에 대해서는 검증할 필요가 있겠지만, init 자체에는 테스트 하지 않아도 됩니다.
Swift 언어 가이드의 Initialization 내용을 보면 왜 그런지 나와있을 것 같아요.

그러면 바로 찾아봐야죠!

Source: The Swift Programming Language (Swift 5.4) - Initialization

공식 문서 Initialization 문서에 있네요. 생성된 새로운 인스턴스가 최초에 사용되기 전에 올바르게 이니셜라이즈(초기화)하는 것이 이니셜라이저의 역할이라고 하고 있습니다. 이제는 실패 가능한 이니셜라이저를 제외하고는 인스턴스 생성에 대한 테스트는 생략해도 되겠습니다!

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글