<학습목표>
1. 왜 테스트가 중요한가?
2. 안드로이드 테스트 종류
3. 무엇을 테스트 해야할까? ( baby step )
4. 구글은 어떻게 테스트 하는가 ?
5. 좋은 테스트의 조건
6. 외부 의존성 처리의 원칙
7. 테스팅 안티패턴
1. 아키텍쳐 관점에서 테스트를 어떻게 구현 해야할지
2. 좋은 아키텍처를 구축하기 위해서는 전제조건으로 테스트를 어떻게 구현해야할지 알아본다
3. 테스트의 원칙
1. 왜 테스트가 중요한가?
1) 현실적인 필요성 : QA가 보다 생산적으로 일할 수 있다.
2) 좋은 설계를 촉진 : test case 를 통해서 api 를 변경시 사용성의 차이를 즉시 알 수 있다.
=> 개방폐쇄 원칙, 단일책임원칙 등 필요없는 의존성 문제를 해결 할 수있음.
3) 코딩 생산성 : 확신을 가지고 작업가능, 실제로 테스팅 구현하는 쪽이 개발시간이 짧음
=> 리펙토링의 경우에도 테스트는 중요하다. ( 함수의 변경 등.. )
4) 협업을 촉진 :
- 문서로서의 테스트 코드 : 테스트 케이스만 보면 api 의 기능과 의도 올바른 사용방법을 단번에 파악
- 코드담당자가 아니여도 수정이가능 : 원작자의 의도대로 하지 않으면 테스트에서 에러
- 더 효율적인 코드리뷰가 가능 : 테스트코드를 보고 의도대로 작성되었는지 원래 코드와 비교.
2. 안드로이드 테스트 종류
로컬테스트 ( test 폴더 )
- JVM 에서 동작 ( 디바이스에서 실행되는것이 아니다. )
- JUnit 라이브러리 사용
로컬테스트 ( with androidx test )
- 내부적으로 Roboletric(로블레트릭) 라이브러리르 사용하는 JVM 테스트
=> 에뮬레이션 된 Context, Application, Activity 등을 제공
- 보통의 상당수 Unit 테스트가 여기서 구현됨
- Big Local test : integration test도 여기서 구현 될 수 있음.
=> 여러개 클래스의 인터렉션을 통해서 실행되는 테스트
계측테스트 ( Instrumented Test , androidTest 폴더)
- 시뮬레이터 혹은, 실제 장치에서 동작
- Espresso 라이브러리를 함께 사용
- small instrumented test 단위가 여기에 구현될 수 있음 ( Room DB 같은거 )
* 언제 실제 기기에서 테스트를 해야하는가 ?
=> 안정성 / 호완성 테스트, 성능 테스트
=> 단위테스트는 할수 있는 한 JVM 에서 실행해야 한다.
3. 무엇을 테스트 해야할까?
- 바운더리 컨디션 : 예를 들어 어떤 함수가 1부터 100 까지 받을 수 있다고 할때 0 을 넣어본다.
- 네트워크 에러 : 404, 500 에러에 대한 대처 등 ( 기대한 결과가 되도록 )
- 데이터 포멧 관련문제 : 포멧이 틀린경우 처리
- 저장소 오버플로
- 설정변경시 처리
큰부분 부터 시작의 경우
=> 중요 비지니스 로직을 잘게 쪼개서 함수단위 / 기능 단위로 테스트를 해보는 것 .
=> 외부 의존성이 발생 할 수 있다.
외부 의존성이 생기는 경우
- 실제 서버로 보내고 받아보는 경우
- 페이크 서버를 보내고 받아보는 경우
- mock 오브젝트를 사용해서 받아보는 경우
* 왠만하면 실제코드를 사용하는 것이 좋다. 네트워크 관련된 경우, 인터넷이 끊기면 정상적인 테스트 코드도 fail이 날수 있기 때문이다
=> 목의 장점이다.
=> 하지만 목의 경우도 목킹중에 문제가 발생할 수 있다. 가능한한 실제 코드를 쓰다.
4. 구글은 어떻게 테스트 하는가 ?
=> 테스트 커버리지 : 테스크가 코드를 얼마나 커버를 하고 있는가 ?
=> 100줄의 코드가있는데 테스트 코드로 인해서 90 줄이상 실행되고 있다면 90퍼센트 커버를 하고 있다라고 본다.
비욘세 룰
=> 만약에 기능을 만든 사람이라면, 당연히 제대로 만들어야하고, 테스트도 제대로 만들어야 한다.
5. 좋은 테스트의 조건
1) 정확성 : 검증 대상의 행위가 , 실제 앱에서 동작할 것으로 기대되는 행위와 일치
2) 명확성 : 테스트케이스 코드는 사용법을 설명하듯이 구현되어야 한다.
=> 간결성과 완결성을 보장한다.
3) 안정성 (연관되지 않는 변경사항들에 대한) : 목적과, 행위가 변경되지 않는 한 테스트도 변경하지 않아야 함.
4) 유용성 : 실제의 동작이 테스트에 반영, 어떤 테스트가 실패한다면 반드시 앱도 실패한다는 것을 의미 해야함.
6. 외부 의존성 처리의 원칙
* 더 복잡한 경우의 테스트
'Android 공부 > Android 아키텍처' 카테고리의 다른 글
UI계층 (1) MVC, MVP - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(5) (0) | 2022.08.25 |
---|---|
테스트 구현 (2) - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(4) (0) | 2022.08.24 |
모바일 아키텍처 개론 - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(2) (0) | 2022.08.23 |
모바일 아키텍처 개론 - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(1) (0) | 2022.08.23 |
어플리케이션 설계 원칙 ( SOLID / 클린 아키 텍쳐 ) (0) | 2021.12.14 |