2023. 11. 25. 19:38ㆍSoftware Architecture/Software design
- 목차
테스트 방식
데트스 방식에는 크게 sociable tests와 solitary tests가 있습니다.
Sociable Test
Sociable tests는 테스트하고자 하는 대상이 아래 그림처럼 '모델'인 경우 모델이 의존하고 있는 Repository와 SMSNotifier를 모두 함께 테스트하는 방식입니다.
Solitary Test
그런데 의존관계가 복잡하고 무거우며 변경 가능한 경우 위와 같은 테스트는 의존 대상들에 의해 실패하던가 매우 많은 시간이 걸릴수 있습니다. 혹은 의존 관계의 deploy 등에 의해 불필요한 시간이 많이 소요될 수 있습니다.
이에 '모델' 부분만 테스트를 하는 것을 Solitary Test라고 합니다.
Solitary Test에서는 의존 관계를 가짜의존 관계로 바뀌치는 접근을 취합니다.
여기서 테스트 대상을 SUT(System Under Test)라고 하며, 의존대상을 DOC(Dependend-on Component)라고 합니다.
소프트웨어를 테스트할때 의존하는 대상이 있으면 제대로 테스트 하기가 어렵습니다. 이에 의존 대상을 interface로 정의해 의존하여 즉, 추상화된 것에 의존하게 하여 의존 대상을 가짜 대상으로 바꿔칠 수 있습니다. 이렇게 테스트 할때 이 가짜 대상을 테스트더블이라고 합니다.
데트스 더블이라는 용어의 유례는 영화 촬영 시 배우를 대신해서 위험한 연기를 수행하는 스턴트 더블(Stunt Double)이라는 용어에서 유래했습니다.
테스트 더블의 종류
테스트 더블에는 크게 5가의의 종류가 있습니다.
각각 Dummy, Fake, Stub, Spy, Mock 입니다.
종류 | 설명 | ex. |
Dummy | 아무동작을 하지 않음 | |
Stub | 가장 간단한 반응 | random한 값을 제공 혹은 기본값을 제공 |
Fake | 동일한 동작을 하는 것처럼 속이는 테스트 더블 가장 기본적인 꼭 필요한 기능만을 제공 (부수적인 복잡한 연쇄 동작은 제공하지 않음) |
DB에 저장하는 것을 대신하여 메모리 상에 저장 |
Spy | API 상으로 동작의 정상 여부를 확인할 수 없는 경우 동작을 검사하는 spy 객체를 사용하는 테스트 더블 | log.write의 경우 반환값이 void라 동작의 정상 여부를 확인할 수 없음 test 시 이런것의 동작의 정상 여부까지 확인 가능한 테스트더블을 만들어서 사용해야 하는 경우, 다음과 같이 spy 객체를 DI 하고 val spy = SpyTarget() val log = Dlog(spy) 기능의 수행 뒤에 spy를 통해 값의 정상 여부를 확인 log.write("A") assertTrue(spy.received("A")) class SpyTarget : Logger { ..write(msg: String) { 저장 } ... received에서 확인 } |
Mock | 특수한 형태의 테스트 스파이 특정 조건 시 미리 약속된 행동을 취함 보다 정교한 테스트를 위해 사용 |
시뮬레이션에 가까운 응답을 제공 |
'Software Architecture > Software design' 카테고리의 다른 글
도메인 주도 개발 (DDD) (0) | 2024.04.20 |
---|---|
entity vs. object (0) | 2023.11.01 |
DIP Dependency Inversion Principle 의존성 역전 원칙 (0) | 2023.05.29 |
UML (0) | 2022.05.06 |
Memento pattern (0) | 2022.02.28 |