한 번의 글로는 이해가 안 가는 안드로이드 테스트 ( 유닛 테스트 & 계측 테스트 )

2023. 4. 21. 16:26android

이번에는 유닛 테스트에 대해 알아보는 시간을 가져보겠습니다.

Q. 단위 테스트가 무엇인가요??

유닛 테스트는 소프트웨어 개발에서 개별적인 코드 조각 또는 모듈의 기능을 테스트하는 것입니다. 유닛 테스트는 작은 단위의 코드 조각을 테스트하기 때문에 "단위 테스트"라고도 불립니다.

안드로이드 기준으로 설명을 드릴게요. 코드를 하나 보실까요???

@Test
fun `viewModel이 시작되면, 모든 노트들을 불러옴`() = runTest {
    viewModel.getAllNotes()
    assertEquals(notesTest, viewModel.state.value.notes.sortedBy { it.id })
}

위의 코드는 적혀있는 그대로 getAllNotes()를 확인하기 위해 작성한 함수입니다.

상황에 맞는 결과를 반환하는지 테스트하기 위해 작성한 테스트 코드입니다.

네이밍이나 작성법, 어노테이션, runTest니 assertEquals가 무엇이니 이런 건 일단 두고 한 번 생각해 보자고요.

 

영어 단어 그대로 Equal ( expected ,  result )  이거입니다. 

예상과 결과가 같은지 물어보고 다르면 코드가 문제가 있다 보고 리팩토링을 진행합니다.

 

위와 같이 하나의 기능, 작성한 함수가 생각대로 작동하는지 확인하는 행위를 저희는 보통 테스트 해본다 하잖아요.

유닛테스트는 그런 의미입니다. 다만 앞에 유닛이 붙어있죠. 


안드로이드의 코드 테스트 과정에는 3가지의 테스트가 있다고 합니다.

아래의 그림을 보시겠습니다.

맨 밑에 유닛 가운데 통합, 맨 위에 UI 순서로 밑에부터 위로 테스트를 하게 됩니다.

 

https://developer.android.com/training/testing/fundamentals?hl=ko 

 

테스트 기본 요소  |  Android 개발자  |  Android Developers

테스트 기본 요소 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자는 버튼을 누르는 것부터 기기에 정보를 다운로드하는 것에 이르기까지 다양한 수

developer.android.com

 

위의 링크도 한 번 들어가셔서 읽어보시면 도움이 되거라 생각합니다.

 

유닛 테스트를 통해서는 작성한 최소 단위의 메서드, 함수가 올바르게 작동하는지 확인합니다.

통합 테스트를 통해서는 안드로이드 에뮬레이터와 실제 장치에서 올바르게 작동하는지 확인합니다.

UI 테스트를 통해서는 유저 인터페이스인 UI가 올바르게 작동하는지 확인합니다.


Q. 왜 유닛테스트를 할까요??

작성한 기능, 모듈이 잘 작동하는지 확인하기 위해 테스트합니다.  테스트를 통해 문제를 발견하고 발견한 문제를 토대로 다시 코드를 리펙토링, 수정하여 결점을 보완합니다.  그리고 다시 적용하고 테스트하여 검증의 단계를 거칩니다. 

 

유닛 테스트를 하는 이유를 정리하면 다음과 같습니다.

 

1. 코드 안정성 향상 : 유닛 테스트는 코드의 기능과 동작을 검증하고, 코드 수정이나 리팩토링 후에도 코드가 여전히 올바르게 작동하는지 확인하는 데 사용됩니다. 이를 통해 코드의 안정성을 향상할 수 있습니다.

2. 버그 식별 : 유닛 테스트를 통해 코드의 버그를 식별하고, 이를 수정할 수 있습니다. 이를 통해 앱의 품질을 향상할 수 있으며, 버그가 발생하는 상황을 미리 파악하여 신속하게 대처할 수 있습니다.

3. 코드 리팩토링 : 유닛 테스트를 통해 코드 리팩토링을 수행할 수 있습니다. 코드 리팩토링은 코드의 구조와 가독성을 향상하는 등의 이점을 제공합니다. 하지만, 리팩토링 과정에서 코드의 기능이 변경될 가능성이 있습니다. 이때 유닛 테스트를 수행하여 코드 수정 후에도 기능이 여전히 정확하게 동작하는지 확인할 수 있습니다.

4. 개발 생산성 향상 : 유닛 테스트를 수행하면 코드를 작성하는 동안 발생할 수 있는 버그나 오류를 미리 파악할 수 있습니다. 이를 통해 디버깅 시간을 줄이고, 개발 생산성을 향상할 수 있습니다.

5. 테스트 자동화 : 유닛 테스트를 자동화할 수 있습니다. 이를 통해 테스트 수행 시간을 줄이고, 테스트 결과를 신속하게 확인할 수 있습니다.

 

완벽한 코드는 없습니다. 아주 간단한 기능이라도 예상 밖의 오류가 발생할 수 있고 이러한 가능성을 최대한 줄이기 위해 테스트를 진행하죠. 최근 테스트에 대해 공부하면서 새로운 재미를 발견하였습니다. 사실 유닛테스트의 개념만 알고 있었지 실질적으로 어떻게 적용하고 테스트의 필요성에 대해서는 잘 몰랐습니다. 하지만 계속 피할 수는 없는 법 아니겠습니까? 작은 메모장 앱을 통해 테스트 코드를 작성하고 적용해 보자! 하여 시작했습니다.

 

테스트 코드를 작성하면서 위에 작성한 이유들이 정말 느껴져 참 재미있었습니다. 기존에 개선사항이 보이지 않았던 코드의 문제점을 발견하고 불필요한 코드를 수정하여 오히려 코드가 깔끔해지고 객체 지향에 더 가까워지는 느낌을 받았습니다. 


Q. 유닛 테스트에서는 어떤 테스트를 하나요???

안드로이드 Unit Test는 개별적인 코드 단위(메서드, 클래스 등)를 테스트하는 데 사용됩니다. 이러한 테스트는 코드의 특정 부분이 의도한 대로 동작하는지 검증하고, 코드의 안정성을 높이는 데 도움이 됩니다. 안드로이드 Unit Test에서 실행할 수 있는 일부 테스트는 다음과 같습니다.

 

1. 단위 테스트 : 단위 테스트는 앱의 작은 단위 코드 블록(메서드, 클래스 등)에 대한 테스트를 실행하는 데 사용됩니다. 이러한 테스트는 코드의 기능과 동작을 검증하고, 코드 수정이나 리팩토링 후에도 코드가 여전히 올바르게 작동하는지 확인하는 데 유용합니다.

2. 모킹 테스트 : 모킹 테스트는 의존성 객체를 대체하는 가짜 객체(Mock 객체)를 사용하여 코드를 테스트하는 데 사용됩니다. 이러한 테스트는 특정 조건에서 코드가 예상대로 동작하는지 검증하고, 코드 간의 의존성을 줄이는 데 도움이 됩니다.

3. 블랙박스 테스트 : 블랙박스 테스트는 코드의 내부 구현을 모르는 채로 코드의 기능을 테스트하는 데 사용됩니다. 이러한 테스트는 코드의 외부 동작에 대한 검증에 사용되며, 코드가 요구 사항과 일치하는지 확인하는 데 도움이 됩니다.

4. 화이트박스 테스트 : 화이트박스 테스트는 코드의 내부 구현을 알고 있는 채로 코드의 기능을 테스트하는 데 사용됩니다. 이러한 테스트는 코드의 내부 로직과 알고리즘에 대한 검증에 사용되며, 코드의 성능과 안정성을 개선하는 데 도움이 됩니다.

5. 성능 테스트 : 성능 테스트는 앱의 성능과 리소스 사용량에 대한 테스트를 실행하는 데 사용됩니다. 이러한 테스트는 앱의 메모리 사용량, CPU 사용량 및 실행 속도를 검증하고, 성능에 영향을 미치는 코드 부분을 식별하는 데 도움이 됩니다.

 


Q. 어떻게 유닛테스트를 하나요??

유닛 테스트를 위한 Tool에는 대표적으로 5가지가 있습니다. 코틀린 기준입니다.

 

1. JUnit : JUnit은 Java 언어로 작성된 단위 테스트 프레임 워크입니다. 코틀린 코드와 함께 사용할 수 있으며, 안드로이드 앱 개발에서도 많이 사용됩니다.


2. Kotlin Test : Kotlin Test는 코틀린으로 작성된 단위 테스트 프레임 워크입니다. 안드로이드 앱 개발에서도 사용할 수 있습니다.


3. MockK : MockK는 코틀린으로 작성된 모킹 프레임 워크입니다. 안드로이드 앱 개발에서 자주 사용됩니다.


4. Spek : Spek은 코틀린으로 작성된 테스트 프레임 워크로, 행위 주도 개발(BDD) 방식으로 테스트를 작성할 수 있습니다.


5. Robolectric : Robolectric은 안드로이드 앱의 단위 테스트를 실행하는 데 사용되는 오픈 소스 라이브러리입니다. 코틀린 코드와 함께 사용할 수 있으며, 안드로이드 시스템 서비스를 모킹하는 데 매우 유용합니다.

 

저도 아직 각각의 사용법을 모두 알지 못합니다. Kotest와 Spek에 대해 공부하고 싶지만 유닛테스트와 좀 더 친해지면 해볼 예정입니다. Unit Test JUnit4를 이용한 실제 적용 방법은 아래의 링크에서 확인하실 수 있습니다.

 


Q. 계측 테스트(Instrumentation Test)는 무엇인가요???

안드로이드 Instrumentation Test는 앱의 실제 디바이스 또는 에뮬레이터에서 동작하는 테스트를 실행하는 데 사용됩니다. 이러한 테스트는 앱의 동작을 실제 환경에서 검증하고 테스트할 수 있습니다.

 


Q. Instrumentation Test에서는 어떤 테스트를 진행하나요???

안드로이드 Instrumentation Test에서 실행할 수 있는 일부 테스트는 다음과 같습니다.

 

1. UI 테스트 : UI 테스트는 앱의 UI 요소에 대한 테스트를 실행하는 데 사용됩니다. 예를 들어, 버튼 클릭 또는 사용자 입력에 대한 응답을 테스트할 수 있습니다.


2. 기능 테스트 : 기능 테스트는 앱의 특정 기능에 대한 테스트를 실행하는 데 사용됩니다. 예를 들어, 사용자 로그인, 데이터 저장 및 검색 등의 작업을 테스트할 수 있습니다.


3. 성능 테스트 : 성능 테스트는 앱의 성능과 리소스 사용량에 대한 테스트를 실행하는 데 사용됩니다. 예를 들어, 앱의 메모리 사용량, CPU 사용량 및 배터리 소모를 테스트할 수 있습니다.


4. 네트워크 테스트 : 네트워크 테스트는 앱의 네트워크 연결과 데이터 전송에 대한 테스트를 실행하는 데 사용됩니다. 예를 들어, 서버에서 데이터를 검색하고 표시하는 기능을 테스트할 수 있습니다.


5. 데이터베이스 테스트 : 데이터베이스 테스트는 앱의 데이터 저장 및 검색 기능에 대한 테스트를 실행하는 데 사용됩니다. 예를 들어, 데이터베이스에 데이터를 추가하고 검색하는 기능을 테스트 할 수 있습니다.

 

안드로이드 Instrumentation Test에서 실행할 수 있는 테스트는 매우 다양합니다. 이외에도 많은 테스트 유형이 있으며, 앱의 요구 사항에 따라 다양한 테스트를 실행할 수 있습니다.

 


이상으로 안드로이드에서의 유닛테스트와 계측 테스트에 대한 이론적인 부분을 알아보았습니다. 실제 적용하는 방법은 다음 편에서 다뤄보도록 하겠습니다. 조언해 주실 부분이나 잘못된 부분이 있으시면 편하게 알려주시면 감사하겠습니다. 경청하겠습니다.

 

'android' 카테고리의 다른 글

JUnit4를 이용한 Room DabaBase Test  (0) 2023.04.23
JUnit4를 사용한 Viewmodel , usecase , repository 패턴 Unit Test  (0) 2023.04.21
Android Compose  (0) 2022.09.28
안드로이드 4대 컴포넌트  (0) 2022.09.26
Restful, Rest, Restful API  (0) 2022.09.26