Android Room database migration test
사용 언어: Kotlin 1.8.10
사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2
룸 데이터베이스는 version으로 관리됩니다. 이 Room database의 Table이나 Entity가 변경되게 되면, 버전이 다름을 감지하고 충돌을 일으키며 앱을 종료시킵니다.
따라서 이러한 변경을 적용하기 위해서 Migration이라는 기능을 제공해 주는데요. 이 Migration을 제대로 작성했는지 확인하기 위해 Test를 진행합니다.
사용 버전: Android Studio Electric Eel 2022.1.1 Patch 2
안드로이드 Room database migration test를 알아보겠습니다.
룸 데이터베이스는 version으로 관리됩니다. 이 Room database의 Table이나 Entity가 변경되게 되면, 버전이 다름을 감지하고 충돌을 일으키며 앱을 종료시킵니다.
따라서 이러한 변경을 적용하기 위해서 Migration이라는 기능을 제공해 주는데요. 이 Migration을 제대로 작성했는지 확인하기 위해 Test를 진행합니다.
Room database 사용법은 아래 글을 참조해 주세요.
마이그레이션을 진행해 봅시다.
테스트를 위해서는 room-testing이라는 Maven을 사용합니다. 그리고 schema를
export 해야 합니다.
이제 진행해 봅시다.
CommandLineArgumentProvider를 정의합니다.
앱 용 build.gradle로 갑니다.
가장 밑에 RoomSchemaArgProvider class를 정의합니다.
CommandLineArgumentProvider를 상속받습니다.
RoomSchemaArgProvider 생성자를 만들고
asArguments를 Override 합니다.
위로 올라가서 defaultConfig 안에 javaCompileOptions,
annotationProcessorOptions, compilerArgumentProviders를 적습니다.
RoomSchemaArgProvider를 사용하고 File에는 projectDir과 schemas를
넣어줍니다.
스키마를 추출하는 준비는 끝났습니다.
이제 본격적인 테스트를 진행하기 전에 room-testing을 추가해 줍니다.
defaultConfig 밑에 sourceSets를 만들어서 androidTest.assets.srcDirs +=
files("$projectDir/schemas".toString())을 적어줍니다.
그리고 dependencies 안에 androidTestImplementation
"androidx.room:room-testing:2.5.1"을 적어줍니다.
그런데, 빌드가 안되네요.
javaCompileOptions를 아래와 같이 변경합니다.
arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]을
적습니다.
젤 처음 만들었던 것은 주석 처리합니다.
Database 정의된 곳으로 가서, exportSchema를 true로 만듭니다.
빌드를 해보면, 다음과 같이 schemas에 해당 버전의 json 파일이 생성됩니다.
다음에 버전을 업데이트한 다음, 다시 빌드를 합니다.
테스트할 8과 9 json이 생성되었습니다.
androidTest에 우 클릭 - New - Kotlin Class/File을 누릅니다.
적당한 이름으로 만듭니다.
저는 RoomMigration8To9Test로 만들었습니다.
@RunWith(AndroidJUnit4::class)를 class 위에 적어줍니다.
16 번째 줄처럼 임시로 생성될 DB의 이름을 적어줍니다.
18 번째 줄처럼 @get:Rule을 적어줍니다.
MigrationTestHelper를 정의해 줍니다.
21 번째 줄에는 자신의 Dababase 이름을 적어주면 됩니다. 저는
CounterInfoDatabase입니다.
함수를 만듭니다.
함수 위에는 @Test, @Throws(IOException::class)를 적어줍니다.
저는 버전 8에서 버전 9로 가는 것을 테스트하기 위해서 작성했습니다.
27 번째 줄에 있는 db는 이전에 있는 DB를 불러옵니다. 보면 버전 8입니다.
db 안에 데이터를 넣으려면 31번째 줄처럼 SQL 문을 직접 execSQL에 적어서
넣어야 합니다.
그 밑에는 새로운 db를 만드는데, version은 9입니다.
그리고 밑에는 Migration을 위한 코드들을 1 버전부터 9 버전까지 적어줍니다.
실행해 봅시다.
위로 올라가서 class 부분에 보면, 삼각형 두 개 겹쳐진 아이콘이 있습니다.
클릭 후, Run을 누릅니다.
마이그레이션에 문제가 없다면 통과됩니다.
좀 더 자세히 테스트하고 싶다면, 57 번째 줄 다음에 db를 sql 문으로
테스트하면 됩니다.
끝.
카테고리: Android
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.