본문 바로가기

난 iOS개발자/UnitTest

Stub, Mock, Dummy

728x90

최근 회사 프로젝트에 테스트코드를 넣기 시작했다. 연습으로 테스트 코드를 작성했던것과 달리 조금 더 신경써야 할 부분들이 생겨났고, 나중에 다른 개발자가 보더라도 이해하기 쉬워야할텐데, 아무튼 테스트 코드를 작성하다보니 조금 헷갈리는 부분이 있어서 정리하려한다.

 

테스트 코드를 작성하면서 의존성이 생기는 경우가 허다하다.

A를 검증하기 위해서 B,C,D를 주입시켜줘야 하는 경우인데 B,C,D 가 실제로 동작하지 않아도 되거나 가짜 데이터를 즉시 반환하는 역할을 하기도 한다.

 

이렇게 검증에 필요한 거짓된 객체를 사용함에 있어서 어떤 경우에 Stub, Dummy, Mock같은 네이밍을 해줘야할지 정리한다.

 

 

Stub

Stub은 호출에 대해 정해진 응답을 하게 만든 객체이다.

아래는 팀원목록을 반환하는 레파지토리의 구현을 테스트 객체로 구현한 것이다. A유스케이스가 MemberRepository를 채택한 객체와 협력(의존)을 할때 미리 정의된 거짓 데이터를 반환함으로서 특정 데이터에 대한 검증을 진행할 수 있다. 

protocol MemberRepositoryStub: MemberRepository {
    var memberList: [Member] { get }
    var defaultMember: Member { get }
}

final class MemberRepositoryImplStub {
    let memberList: [Member] = [.init(id: "0", name: "팀원0", type: "default", avatar: "", welcomeMessage: "안녕0", suggestedQuestions: ["팀원0의 인사", "팀원0의 인사2"]),
                       .init(id: "1", name: "팀원1", type: "", avatar: "", welcomeMessage: "안녕1", suggestedQuestions: ["팀원1의 인사", "팀원1의 인사2"]),
                       .init(id: "2", name: "팀원2", type: "", avatar: "", welcomeMessage: "안녕2", suggestedQuestions: ["팀원2의 인사", "팀원2의 인사2"]),
                       .init(id: "3", name: "팀원3", type: "", avatar: "", welcomeMessage: "안녕3", suggestedQuestions: ["팀원3의 인사", "팀원3의 인사2"]),
                       .init(id: "4", name: "팀원4", type: "", avatar: "", welcomeMessage: "안녕4", suggestedQuestions: ["팀원4의 인사", "팀원4의 인사2"])
                      ]
    var defaultMember: Member {
        memberList.first!
    }
}

extension MemberRepositoryImplStub: MemberRepositoryStub {
    func getMemberList(completion: @escaping ([Member]) -> Void) {
        completion(memberList)
    }
}

MemberRepository에 대한 필수구현메서드 외로 테스트에 용이하도록 추가 구현을 넣었다. 

 

Mock

위 Stub처럼 반환되는 데이터에 대한 검증을 하기보다 메소드 호출이 정상적으로 이뤄졌는지, 상호작용 검증에 초점을 둔 개념이다. 

예를 들면 메서드 호출이 몇번 이뤄졌는지 Mock객체 내부에서 기록하고 이를 검증할 수 있다. 

 

Dummy

실제로 사용되지 않지만 다른 객체와의 호환성유지에 필요하다. 예를 들면 매개변수로 전달되거나 객체 초기화시 사용된다.

 

 

이 외 테스트더블에 속하는 다른 다른 개념들은 나중에 시간이되면 정리해보겠다.

728x90

'난 iOS개발자 > UnitTest' 카테고리의 다른 글

Code Coverage 확인하기  (0) 2022.01.30
Unit Test 작성해보기2  (0) 2022.01.30
Unit Test 작성해보기1  (0) 2022.01.30
Unit Test 파일 살펴보기  (0) 2022.01.30
FIRST 원칙  (0) 2022.01.30