apple/Testing, Xcode, Environment

UseCase와 Repository를 테스트하면서 느낀 점.

lgvv 2024. 9. 20. 19:36

UseCase와 Repository를 테스트하면서 느낀 것들

 

해당 형태의 구조의 프로젝트에서 테스트코드를 작성하면서 학습하고 느낀점들을 정리.

 

글의 순서

  • UseCase 테스트 목적
  • Repository 테스트 목적
  • Repository 테스트 하기
  • SearchSubwayUseCaseTests 실패 후 로직 보완
  • 테스트에 대한 생각 정리

 

안드로이드 공식 앱 아키텍처 가이드를 확인하면서 UseCase 영역에 해당하는 Domain이 Optional로 되어 있음을 확인할 수 있었음.

개인 경험에 의하면 실제로 UseCase에서 특별한 처리 없이 사실상 래핑에만 해당하는 경우도 많긴 함.

 

일반적인 상황에서는 Domain Optional 이어도 나쁘지 않겠지만, 기능이 하나 둘 추가되면서 Repository가 두꺼워지고

결국은 UseCase를 분리하는 과정에서 오는 피로를 생각하면 처음에 분리해두는 것도 좋다고 생각.


근데 개인적으로는 적절한 Repository 인터페이스와 각 Feature에서 구현하고 FeatureInterface를 통해서 적절하게 제공하는 형태로 래핑 없이도 잘 사용하고 있음.

 

아무튼 테스트 상황에서 UseCase와 Repository 테스트의 목적은 각각의 역할과 책임에 따라 다름.


UseCase 테스트 목적

  • 비즈니스 로직 검증: 내가 작성한 로직이 제대로 작성되었는지 검증
    • 예시: 캐싱 로직을 도입했으나, 캐싱 값 갱신을 실수로 누락
  • 입력 및 출력 검증: 주어진 입력에 대해 예상된(올바른) 결과가 나오는지 검증
    • 예시: 특정 실패하는 상황을 입력으로 주었을 때, 해당 상황에 대한 정확한 에러가 나타나는지 확인
  • 상태 관리 검증: 상태 혹은 캐싱 값이 올바른지 검증
    • 예시: 캐싱되어 있는 값이 정확한지 확인
  • 통합 테스트: 주입받은 의존성 등과 전체 흐름이 올바르게 동작하는지 검증.
    • 예시: 시나리오 테스트

 

Repository 테스트 목적

  • API 통신 검증: API와 통신할 때 실제로 요청한 값에 대해 제대로 응답을 받는지 검증
    • 예시: 요청에 대해 호출이 정확하게 되는지
  • 에러 처리 검증: API 호출에 대한 실패 케이스 검증
    • 예시: 타임아웃, 서버에서 내려주는 실패 등 검증
  • 데이터 검증: 데이터베이스 CRUD가 제대로 되는지 검증
    • 예시: DB가 올바르게 동작하는지 검증

 

Repository 테스트 하기

이전에 작업했던 사이드 프로젝트에서 지하철 검색 기능을 통해 작성

 

레포지토리 테스트 코드 전체

 

 

 

서버 통신이 잘 되는걸 확인하기 위한 테스트

고민 포인트

  • 데이터 응답 값이 향후 서비스가 운영됨에 따라서 서버가 내려주는 값이 달라질 탠데, 어떻게 검증하는 것이 좋을지
  • 이거 가지고 API 모니터링 시스템 만들면 서버 입장에서 모바일 코드 까보지 않고도 태그 기반으로 버전별로 직접 돌려볼 수 있어서 장점이 매우 크다고 함
    • 규모가 클수록 모바일에 특정 버전에 특정 지역에 ... 보안에 의하여 정책적으로 DTO가 다르다거나 등등 너무 케이스가 다양해서 서버를 위해서 제공하는 목적도 크다고 보임.

 

테스트 코드

 

 

서버 통신이 실패시 에러를 잘 뱉어내는지 테스트

고민 포인트

  • 에러 메시지 나타낼 때 명령형으로 나타내는 것과 한글 쓸 지 영어 쓸지에 대한 고민

 

서버 통신 실패시 케이스

 

 

 

테스트에 대한 생각 정리

  • 결국은 핵심 로직을 테스트 하는게 좋음. 맹목적으로 커버리지 올려봐야 꺠지기 쉬운 테스트는 서비스 생산성을 떨어뜨리고 테스트를 신뢰하지 않게 되는거 같음.
  • private 메서드를 어떻게 테스트하지? 이런 생각을 했던 적도 있었지만 결과론적으로 걱정할 필요가 없었음
  • 테스트는 결국 인풋에 대한 아웃풋이 올바른지 점검하는게 제일 중요하다고 생각함. 
    • 이렇게 작성해야 테스트가 잘 안 깨지고 신뢰할 수 있다고 느낌.
  • private 메서드도 결국 인풋이 들어갔을 때 해당 함수를 호출하면서 커버리지 내에 포함시킬 수 있음
  • 이런 형태로 가면 테스트 커버리지가 높아질 것 같다는 생각이 듦.

 

 

 

 

 

 

(참고)

https://developer.android.com/topic/architecture?hl=ko&_gl=1*1hv0qkx*_up*MQ..*_ga*MzEzMDI0NjUwLjE3MjY4MjcyNjY.*_ga_6HH9YJMN9M*MTcyNjgyNzI2Ni4xLjAuMTcyNjgyNzI3OS4wLjAuMTE0ODE3MTg0OQ

 

앱 아키텍처 가이드  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱 아키텍처 가이드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드에는 고품질의 강력한

developer.android.com