TDD
- 구현 목표를 테스트 코드를 통해 미리 설계를 해놓고, 테스트의 결과가 참이 되게 구현을 해나가는 방식
Testing Strategies For Readable Tests
assertEquals(result.completedTasksPercent, 0f)
asssertThat(result.completedTasksPercent, `is`(0f))
Test Scope
앱을 테스트 할 때 어느정도로 테스트를 할 것인지의 범위.
- Unit Test
- Integration Test
- End to End Test
Unit Test (70%)
- 함수, 클래스에 행해지는 테스트
- 기능 동작에 대한 검증
- 주로 Local Test로 수행
Integration Test (20%)
- 여러가지의 클래스로 이뤄진 하나의 기능을 테스트 할 때
- 여러가지의 클래스가 맞물려지는 형태에 대한 검증
- 상황에 따라서 Instrument 테스트, 로컬 테스트 모두 돌아갈 수 있다.
End to End Test (10%)
- 느리다, 모든 기능에 대해서 테스트를 한다
- 따라서 Instrument 테스트로 하는 것이 일반적이다.
Unit Test를 시행하기 좋은 곳
Integration Test
- Fragment+ViewModels
- Database
TDD의 궁극적인 목적은 결국 버그가 없는 프로덕트이기에 테스트가 없는 리팩토링 보다는 테스트 코드를 하나라도 작성하는 것이 유의미한 검증을 하는것.
Android 에서의 테스트
- 단순히 화면에 보여지지 않는 테스트
- UI 인터랙션이 정상적으로 이루어지는지 검증하기 위한 UI 테스트
We have Kotlin/Java Code (Pure Logic) with Android Framework
Finding unit in Android is complex
Having a good architecture helps in segregating Android Code from pure Kotlin/Java Code
Unit Test
유닛 단위 테스트. 함수, 클래스 등의 될 수 있다.
JUnit
, Mockito
, PowerMock
등을 사용할 수 있다.
UI Test
사용자와의 인터랙션을 검증
사용자 인터랙션이란 버튼 클릭, 텍스트 입력, 스크롤 등이 될 수 있다.
Espresso
, UIAutomator
, Robotium
, Calabash
, Robolectric
등의 툴을 사용하여 테스트 할 수 있다.
Android 프로젝트에서 테스트
기본적으로 JUnit
과 Espresso
등 Unit 테스트 툴과 UI 테스트 툴이 기본적으로 탑재되어있다.
androidTest
디렉토리 안에는 UI 테스트 관련 파일들이 있고,
test
디렉토리 안에는 Unit 테스트 관련 파일들이 있다.
UI 테스트
Annotation
- @Before : @Test를 시작하기 전 사전에 진행해야 할 사전 정의에 해당된다. @Test가 시작되기 전 항상 호출되게 된다.(단위 테스트 포함)
- @After : @After은 모든 테스트가 종료되면 호출된다. 메모리에서 resource를 release할 수 있다.
- @Test : @Before가 완료되면 실제 코드 테스트를 진행한다.
- @Rule : 해당 Test class에서 사용하게 될 ActivityTestRule과 ServiceTestRule에 대하여 정의하게 된다.
- @BeforeClass, @AfterClass : public static method로 정의하여야 하며, @Before, @After와 동일하게 한 번씩만 실행되게 된다.
- @Test(timeout=) : @Test 룰에 대한 timeout을 지정하게 된다. timeout 안에 테스트가 완료되지 않으면 fail이 되며, time은 milliseconds로만 사용할 수 있다.
- @RequiresDevice : 에뮬레이터를 사용하지 않고 기기만 사용할 수 있다.
- @SdkSupress : minSdkVersion을 지정할 수 있다.
- @SmallTest, @MediumTest, @LargetTest : 테스트 성격을 구분하여 테스트 할 수 있다.
![[Pasted image 20231207141828.png]]
실행 프로세스
- 먼저 저장소를 단위(Unit) 테스트 한다.
- 그런 다음 뷰 모델의 단위 테스트 및 통합(Integration) 테스트 에 필요한 테스트 더블을 뷰 모델에서 사용한다.(테스트 더블 사용법)
- 다음으로 프래그먼트 및 해당 뷰 모델 에 대한 통합 테스트를 작성한다.
- 마지막으로 탐색 구성요소를 포함하는 통합 테스트를 작성한다.
안드로이드 공식 Test예제 실행 가이드
가이드 1,2,3편을 통해 알수있는점
- JUnit4, Hamcrest, AndroidX의 Test Library, Mock, Mockito등의 기본 및 추가 라이브러리 사용법
- FakeRepository를 통한 의존성 주입및, Hilt를 사용했을때는 어떻게 구현할 것인가
- LiveData와 ViewModel, Coroutine을 어떻게 테스트에서 구현할 것인가
- Espresso를 사용해서 UI테스트는 어떻게 할 것인가
- 프래그먼트 테스트를 하는 방법 (추가 공식 문서)
- ... 등등
안드로이드 앱 테스트 공식문서
해결해야할 문제점
- UI 테스트는 어떻게 해야하는가?
- 예시로 나온것들이나 자료를 찾아보면 App 하나만 있을 경우 테스트하는 예제만 있다.
- 멀티 레이어에, 멀티 모듈을 사용할때는 어떻게 테스트를 거치는가?
참고 영상 링크
- The Ultimate Guide to Android Testing (Unit Tests, UI Tests, End-to-End Tests) - Clean Architecture / 2021.9.29 / 영어
- Android Unit Test Playlist - JUnit, Espresso, Mockito with kotlin / 2022.11.5 / 힌디어