본문 바로가기

Android87

[Android-Test] Android Compose Test 도입하기 - 실전 배경 이번 포스팅에선 CodeLab에서 제공하는 Compose Test를 기준으로 정리해보려고 합니다. 테스트를 따라가기에 앞서 컴포저블 함수들이 어떻게 이뤄져있는지 파악해보겠습니다. Rally의 구조 Rally 앱은 RallyTopAppBar와 현재 screen의 content로 구성되어 있으며 AppBar에서 탭을 클릭 시 해당 화면으로 변경됩니다. CodeLab 테스트에선 OverviewBody에 대한 테스트를 진행하므로 Overview 화면을 기준으로 표시했습니다. 간단한 UI 테스트 만들기 CodeLab에선 Account bar가 잘 클릭되는지 테스트를 진행합니다. @Test fun rallyTopAppBarTest() { val allScreens = RallyScreen.values().to.. 2023. 9. 27.
[Android-Test] Android Compose Test 도입하기 - 이론 개요 최근 컴포즈를 많이 사용 함에 따라 테스트 코드를 짤 수 있어야 된다는 생각이 들고 있습니다 물론 Preview를 통해 잘 동작하는지 확인할 순 있겠지만 전반적인 프로세스가 잘 동작하는 파악하기란 어려운 일이라 생각되어 이번 기회에 정리해볼까 합니다. 시맨틱 (Semantics) 기존 Android Espresso에서 id와 해당 특성을 가진 컴포넌트를 찾을 수 있었습니다. 하지만 컴포즈에서는 id를 명시하지 않기 때문에 시멘틱을 통해 UI에 의미를 부여합니다. 단일 컴포저블에서 전체 화면에 이르기까지의 무엇이든 의미할 수 있으며 시맨틱 트리는 UI 계층 구조와 함께 생성되고 UI 계층 구조를 형성합니다. ComposeTestRule ComposeTestRule은 component, Activity.. 2023. 9. 26.
[Android-Test] Android Test코드 작성하기5 - Hilt 배경 Android TestCode 작성하기 5탄입니다. Kotlin Flow 테스트와 코루틴 테스트를 통해 비동기 테스트를 어떻게 하는지 알아봤습니다. 이번 글에서는 많은 개발자 분들이 사용하시는 Hilt에 대해서 정리하려고 합니다. Hilt Test 하기에 앞서 공식 홈페이지를 참고해서 적절한 dependency를 추가해주세요 단위 테스트 생성자 삽입을 사용하는 클래스를 테스트할 때 이 클래스를 인스턴스화하는 데 Hilt를 사용할 필요가 없기 때문에 단위 테스트에는 Hilt가 필요하지 않습니다. 대신 생성자에 주석이 지정되지 않은 경우와 마찬가지로 Fake 종속 항목을 전달하여 클래스 생성자를 직접 호출할 수 있습니다. @ActivityScoped class AnalyticsAdapter @Injec.. 2023. 9. 26.
[Android-Test] Android Test코드 작성하기4 - Flow 배경 Android TestCode 작성하기 4탄입니다. 이전 글인 코루틴 테스트에 이어 함께 자주 사용하는 Flow에 대해 정리하려고 합니다. Kotlin Flow 테스트 flow를 테스트 하는 방법은 테스트 대상이 흐름을 input으로 사용하는지 또는 output으로 사용하는지에 따라 다릅니다. fake producer 만들기 테스트 대상이 흐름의 소비자인 경우 한 가지 일반적인 테스트 방법은 생산자를 fake로 대체하는 것입니다. 예를 들어 프로덕션 환경의 두 데이터 소스에서 데이터를 가져오는 저장소를 식별하는 클래스가 있다고 가정해 보겠습니다. 확정된 테스트를 만들려면 저장소와 종속 항목을 항상 동일한 모조 데이터를 내보내는 모조 저장소로 대체하면 됩니다. 테스트에서 Fake Repository를.. 2023. 9. 26.
[Android-Test] Android Test코드 작성하기3 - Coroutines 배경 Android TestCode 작성하기 3탄입니다. 이전 글에서는 Espresso를 통해 UI 테스트를 진행하는 방법에 대해 정리했습니다. 이번엔 코루틴 테스트 방법에 대해 정리하려고 합니다. 당장 코루틴 테스트를 적용하고 싶은 분들은 여기를 클릭해주세요! 코루틴 테스트를 하기 앞서 알아둬야할 것들 코루틴을 사용하는 단위 테스트 코드는 주의가 필요합니다. 비동기로 실행될 수 있고 여러 스레드에서 발생할 수 있기 때문입니다. 테스트를 시작하기 앞서 테스트에서 라이브러리를 추가해줘야 합니다. testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" 코루틴을 테스트할 때는 테스트용 코루틴 빌더인 runTes.. 2023. 9. 25.
[Android-Test] Android Test코드 작성하기2 - Espresso 배경 Android TestCode 작성하기 2탄입니다. 이전 글에서는 JUnit4를 기준으로 정리했었는데 이번엔 Espresso에 대해 정리해볼까 합니다. Espresso가 뭐지? Espresso는 Android UI 테스트를 작성할 수 있도록 돕는 라이브러리 입니다. 저희가 앱이 잘 동작하는 지 직접 테스트 했었다면, Espresso는 코드 동작의 순서를 명시하여 테스트를 실행했을 때 에뮬에서 명시된 순서대로 동작하는 걸 확인할 수 있습니다. 테스트 코드를 통해 모든 테스트 케이스를 개발자가 직접 테스트를 하지 않아도 되니 휴먼 에러가 발생할 확률이 적다 추후 리팩토링 시 예전에 작성된 테스트 코드와 동일하게 작동하는지도 확인할 수 있어서 에러 발생 확률을 낮출 수 있다 @Test fun greete.. 2023. 9. 25.
[Android-Test] Android Test코드 작성하기1 - JUnit 배경 안드로이드 개발을 하다보면 테스트코드를 작성하지 않고도 UI와 로직을 구현할 수 있습니다. 저 역시도 지금까지 이렇게 개발을 해왔는데 예전 코드를 리팩토링 혹은 에러를 수정할 때 내가 수정한 로직이 이전과 동일하게 작성하는지 체크하는 것이 매우 어려웠고, 실제로도 보장할 수 없다고 생각이 되어 지금부터 Test를 작성하는 법에 대해 공부해보려 합니다. 목표는 JUnit -> Espresso -> Coroutines Test -> Hilt Test -> 클린 아키텍처 적용 시의 Test 까지 정리해보려고 합니다! Junit이란? Unit Test는 말 그래도 단위 테스트로, Test Driven Development로 개발하게 되면 기능 단위별로 테스트 코드를 구성해야 합니다. 대표적인 Unit Te.. 2023. 9. 24.
navHostController vs navController 배경 Compose를 개발하다보면 Navigation을 구현할 때 NavController와 NavHostController를 혼용해서 사용하기도 합니다. NavController NavController는 NavHost 내부에서 app navigation을 관리합니다. 여기서 NavHost를 확인해보면 interface로 내부에 NavController를 가지고 있는 것을 볼 수 있습니다. 코드와 같이 주석도 확인해보면 NavController와 NavHostController가 같이 설명되고 있는 것을 볼 수 있습니다. A host is a single context or container for navigation via a NavController. host는 NavController를 통한 탐색.. 2023. 9. 20.
[Android] Compose랑 Hot Stream은 어울릴까? 배경 스낵바나 토스트처럼 매번 노출되어야 하는 컴포넌트들을 위해서 SharedFlow를 사용했었는데 Compose에서 collect되지 않는 문제가 발생했습니다. 그 이유를 하나하나 파악해 보고자 합니다. 원인을 파악하기에 전에 잠깐! 제가 앞으로 테스트하는 환경의 ViewModel은 다음과 같이 통일하겠습니다 class MainViewModel : ViewModel() { private val _testFlow = MutableSharedFlow(replay = 1) val testFlow = _testFlow.asSharedFlow() fun inputTest(value: String) { viewModelScope.launch { _testFlow.emit(value) } } } XML + Shar.. 2023. 9. 19.