Android Dev/NowInAndroid / / 2022. 11. 15. 01:28

NowInAndroid(6) - Version Catalog / build-logic + unitTest implementation

1> Version Catalog를 통한 버전 관리 순서 요약

 

1. ../gradle/libs.versions.toml 에 라이브러리를 정리한다.

[versions]
accompanist = "0.27.0"
androidDesugarJdkLibs = "1.2.0"
androidGradlePlugin = "7.3.1"
...

[libraries]
accompanist-flowlayout = { group = "com.google.accompanist", name = "accompanist-flowlayout", version.ref = "accompanist" }
accompanist-systemuicontroller = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "accompanist" }
android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivity" }
...

 

위의 library 를 toml에 추가하면, 아래와 같이 앱수준에서 accompanist - flowlayout이 libs.accompanist.flowlayout로 변환된다.

 

 

2.  Plugin을 gradlePlugin에 등록하고 이를 모듈에서 불러오는 과정에 대한 요약은 아래와 같음.

 

 

 

2> 응용 예시 ) Plugin을 통한 Hilt-test 디펜던시 추가

 

1. 예를 들어 module에 Hilt-test dependencies를 추가하려고 한다면, 아래와 같은 형식을 취할 것이다.

....

    testImplementation("com.google.dagger:hilt-android-testing:2.44") // For Robolectric tests.
    kaptTest("com.google.dagger:hilt-android-compiler:2.44") // ...with Kotlin.
    testAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.44") // ...with Java.
    androidTestImplementation("com.google.dagger:hilt-android-testing:2.44") // For instrumented tests.
    kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.44") // ...with Kotlin.
    androidTestAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.44") // ...with Ja

 

2. 이를 버전 카탈로그를 사용하면.

 

1) toml에 library를 추가한다.

hilt = "2.44"

[libraries]
hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }

 

2) plugin에 디펜던시를 추가한다

class AndroidHiltConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            with(pluginManager) {
                apply("org.jetbrains.kotlin.kapt")
                apply("dagger.hilt.android.plugin")
            }

            val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")
            dependencies {
                "implementation"(libs.findLibrary("hilt.android").get())
                "kapt"(libs.findLibrary("hilt.android.compiler").get())
                "kaptAndroidTest"(libs.findLibrary("hilt.android.compiler").get())
                //아래와 같이 테스트를 위한 디펜던시를 추가
                "testImplementation"(libs.findLibrary("hilt.android.testing").get())
                "kaptTest"(libs.findLibrary("hilt.android.compiler").get())
                "testAnnotationProcessor"(libs.findLibrary("hilt.android.compiler").get())
                "androidTestImplementation"(libs.findLibrary("hilt.android.testing").get())
                "kaptAndroidTest"(libs.findLibrary("hilt.android.testing").get())
                "androidTestAnnotationProcessor"(libs.findLibrary("hilt.android.testing").get())
            }
        }
    }

}

 

3) build-logic / convention / build.gradle.kts의  gradlePlugin 에 plugins 블록 아래 다음을 추가한다(default form은 google의 NowInAndroid build-logic form형태를 따름)

gradlePlugin {
    plugins {
        register("androidHilt") {
            id = "vlmplayground.android.hilt"
            implementationClass = "AndroidHiltConventionPlugin"
        }
        
        ....

 

위와 같이 구성한 뒤 , 이 디펜던시를 사용할 모듈의 build.gradle(.kts)에 아래와 같이 plugins 블록에 위의 id를 넣어주면 사용이 가능하다.

plugins {
	id("vlmplayground.android.hilt")
    
    ...    
}

 

 

3> 응용예시, unitTest or androidTest utilizing testing module of NiA

예를 들어 firestore testing을 위한 dependencies를 추가하고자한다면(사실, networking을 위한 test는 Nia 모델 안에서도 mocking이나 doubleTest로 대체하는 편이라 권장되는 방식은 아님을 충분히 인지하고서 설계해야됨을 가정함)

 

Test를 위한 Dependencies 구조

 

여기서 firebase/firestore의 디펜던시를 추가하고자 한다면 :core:testing 부분에 아래와 같이 추가한다.

//.. :core:data / ... build.gradle.kts
//firebase 관련 모듈은 libs에 추가해놓았다고 가정
api(platform(libs.firebase.bom))
api(libs.firebase.firestore) //re-build 할일이 적다면 implementation 해도 무관

 

unitTest를 사용하고자 하는 core module이 있다면, 해당 모듈의 build.gradle.kts에 아래와 같은 디펜던시를 추가한다.

//.. :core:data / ... build.gradle.kts
testImplementation(project(":core:testing")) // unit Test를 하고자 한다면 이를 추가.
androidTestImplementation(project(":core:testing")) //android Test를 하고자 한다면 이를 추가.

여기서 android test를 할때 testInstrumentationRunner를 지정해주어야 동작한다. NiA를 보면, 이 또한 :testing에 만들어놓았고, 이를 deafultConfig로 가져다 쓰면된다. 예를 들어 아래와 같이 사용할 수 있다.

android {
    buildFeatures {
        buildConfig = true
    }

    testOptions {
        unitTests.isReturnDefaultValues = true
    }
    defaultConfig {
        testInstrumentationRunner = "com.vlmplayground.android.core.testing.VlmTestRunner"
    }

    namespace = "com.vlmplayground.core.network"
}

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유