TDD (Test Driven Development)

김재현·2023년 12월 8일
0

안드로이드

목록 보기
12/12

TDD

  • 구현 목표를 테스트 코드를 통해 미리 설계를 해놓고, 테스트의 결과가 참이 되게 구현을 해나가는 방식

Testing Strategies For Readable Tests

  • 테스트는 그 코드를 설명하는 하나의 문서이기도 하니, 테스트 코드를 작성한다면 잘 작성해야할 필요가 있다.

    • 테스트의 이름을 잘 짓기
      • 테스트의 목적_로직이나 입력값_결과상태
      • getActiveAndCompletedStats_noCompleted_returnsZeroHundred
    • 3개의 단계로 구분지어 테스트를 구조화 시키기 Given/When/Then
      • Given
        • 테스트 전에 필요한 객체나 데이터 준비
      • When
        • 객체, 데이터에 테스트를 할 함수를 사용하여 객체, 데이터에 상태 변화를 유도
      • Then
        • 변화된 값이 예상된 값과 맞는지 체크
      • Arrange / Act / Assert (AAA)라고 부르기도 한다.
    • Assertion Framework를 잘 사용하기
// JUnit
assertEquals(result.completedTasksPercent, 0f)
// Asswertion Framework(hamcrest, truth)
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를 시행하기 좋은 곳

  • ViewModel
  • Repository
  • DAO

Integration Test

  • Fragment+ViewModels
  • Database

TDD의 궁극적인 목적은 결국 버그가 없는 프로덕트이기에 테스트가 없는 리팩토링 보다는 테스트 코드를 하나라도 작성하는 것이 유의미한 검증을 하는것.


Android 에서의 테스트

  1. 단순히 화면에 보여지지 않는 테스트
  2. 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 프로젝트에서 테스트

기본적으로 JUnitEspresso등 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]]


실행 프로세스

  1. 먼저 저장소를 단위(Unit) 테스트 한다.
  2. 그런 다음 뷰 모델의 단위 테스트 및 통합(Integration) 테스트 에 필요한 테스트 더블을 뷰 모델에서 사용한다.(테스트 더블 사용법)
  3. 다음으로 프래그먼트 및 해당 뷰 모델 에 대한 통합 테스트를 작성한다.
  4. 마지막으로 탐색 구성요소를 포함하는 통합 테스트를 작성한다.

안드로이드 공식 Test예제 실행 가이드
가이드 1,2,3편을 통해 알수있는점

  • JUnit4, Hamcrest, AndroidX의 Test Library, Mock, Mockito등의 기본 및 추가 라이브러리 사용법
  • FakeRepository를 통한 의존성 주입및, Hilt를 사용했을때는 어떻게 구현할 것인가
  • LiveData와 ViewModel, Coroutine을 어떻게 테스트에서 구현할 것인가
  • Espresso를 사용해서 UI테스트는 어떻게 할 것인가
  • 프래그먼트 테스트를 하는 방법 (추가 공식 문서)
  • ... 등등

안드로이드 앱 테스트 공식문서


해결해야할 문제점

  1. UI 테스트는 어떻게 해야하는가?
    • 예시로 나온것들이나 자료를 찾아보면 App 하나만 있을 경우 테스트하는 예제만 있다.
    • 멀티 레이어에, 멀티 모듈을 사용할때는 어떻게 테스트를 거치는가?

참고 영상 링크

  1. The Ultimate Guide to Android Testing (Unit Tests, UI Tests, End-to-End Tests) - Clean Architecture / 2021.9.29 / 영어
  2. Android Unit Test Playlist - JUnit, Espresso, Mockito with kotlin / 2022.11.5 / 힌디어
profile
배운거 정리하기

0개의 댓글