티스토리 뷰

안녕하세요 Hani입니다.

이번에는 Dummy에 대한 생각을 말할 거예요.

 

 

 

//when

sut.calculate(birth: Birth(year: 2000, month: 2, day: 29))

//then
...

SUT의 메서드를 호출할 때 전달인자로 값을 넘겨주곤 합니다.

 

해당 전달인자를 볼 때는 몇 가지 생각이 이어집니다.

 

a) 2000년은 2월 29일이 있을까.

b) then 구절이 윤년에 대하여 테스트하고 있는 걸까.

c) 전달인자의 변화가 테스트 결과에 영향을 줄까.

 

즉, 테스트를 추적하는 입장에선 전달인자가 dummy값인지 아니면 테스트에 필요한 값인지 구별할 수 없습니다.

물론 소스 코드를 보거나 테스트 코드의 description을 보면 알 수도 있겠지만 추적하는데 시간이 소요됩니다.

 

전부 0으로 두면 되지 않느냐라고 할 수 있으니 다음 예시를 보겠습니다.

 

 

 

 

//when
sut.foo(q: false, p: true, x: X(y: false, z: true))

//then

고의로 메서드명과 전달인자의 의미를 숨겼습니다.

이 때의 bool값은 foo의 결과에 영향을 줄 것인지 아닌지 판단할 수 없습니다.

 

 

 

extension State {
    static func dummy(count: Int) -> Self {
        return .init(
            isLoading: false,
            isLogined: false,
            url: nil,
            ...
            
            count: count,
            
            ...
            modelName: "ChatGPT"
        )
    }
}

전달인자가 많거나 자주 생성해야 하는 것은 dummy라는 네이밍으로 감싸서 사용할 수도 있지만 

값이 완전히 테스트와 관련이 없는지 알 수 없습니다. 

 

(테스트가 name이 ChatGPT일 때 통과하는지, 빈 문자열이 아닐 때만 성공하는지..)

 

 

 

 

enum D {
    static let int = 0
    static let bool = false
    static let string = ""
}


//when
sut.foo(q: false, p: true, x: X(y: false, z: true))       (A)
sut.foo(q: D.bool, p: true, x: X(y: false, z: D.bool))    (B)
sut.foo(q: D.bool, p: true, x: X(y: D.bool, z: D.bool))   (C)


//then

테스트를 읽는 사람 관점에서 값이 Dummy인지 아닌지 판단하는 시간을 줄이기 위해

기본자료형도 Dummy로 사용하는 방법이 어떨까 생각합니다.

 

(p, y만 테스트에 영향을 준다고 가정)

 

 

q와 z처럼 Dummy를 사용한 것에는 어떤 bool이더라도

테스트에 영향을 주지 않는 진정한 의미의 Dummy임을 알 수 있습니다.

z는 의미가 없기 때문에 D.bool로 변하더라도 결과에 영향을 주지 않습니다. (B가 A보다 의도를 잘 드러냄)

 

 

p의 true와 y의 false는 테스트 의도가 있는, 테스트 결과에 영향을 주는 전달인자임을 알 수 있습니다. 

하지만 테스트 의도가 있는 false를 D.bool로 치환해서는 안됩니다 (B에서 C로 변환해서는 안됨) 

 

 

 

 

extension State {
    static func dummy(count: Int) -> Self {
        return .init(
            isLoading: D.bool,
            isLogined: D.bool,
            url: D.nil,
            ...
            
            count: count,
            
            ...
            modelName: "ChatGPT"
        )
    }
}

Dummy 기본자료형으로 구성된 Dummy만이 그 의도를 확실히 드러낼 수 있고

(ex.. count는 주입하여 테스트 할 것이고, 서버에 항상 ChatGPT라는 문자열을 넘겨줄 것이니 테스트 의도가 없다. )

 

테스트 코드를 분석할 시간을 줄일 수 있습니다.

 

 

댓글