[英]How to test database migration in Android?
我有一個Android應用程序,其數據庫版本為1。
現在我想改變數據庫的結構並編寫所有的遷移代碼等。
我遇到的問題是如何測試這個。
我需要反復使用舊版本的舊版本應用程序,以便我可以使用新數據庫多次測試新應用程序的更新過程。
我想簡化我制作項目副本的事情,然后重新命名 - 將清單和所有內容保持不變!!!!
我的想法是使用Eclipse使用舊的DB結構運行/安裝舊版本的應用程序,這樣我就可以創建更新的開始情況。
現在模擬用戶對新應用程序版本的更新我再次使用Eclipse將其安裝在舊版本上 - 但即使沒有更改數據庫,我也會收到數據庫已經存在的錯誤?
我很困惑(我只更改了項目名稱,而不是清單)我本來期望我可以在舊版本上安裝新版本,並據此測試應用程序的用戶更新。
但這不起作用。
我最好怎么做? (在同一個項目中沒有舊的和新的數據庫代碼。因為如果我有相同的項目,我有兩個不同的數據庫結構,需要在交換機中構建它應該如何啟動,即舊的或新的我發現用新的數據庫結構編寫應用程序的新版本比較清晰
Room是數據庫內容的Android架構組件之一。
Room提供測試Maven工件以協助此測試過程。
首先,您需要通過在build.gradle
文件中設置room.schemaLocation
批注處理器屬性來導出db方案
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":
"$projectDir/schemas".toString()]
}
}
}
}
@RunWith(AndroidJUnit4.class)
public class MigrationTest {
private static final String TEST_DB = "migration-test";
@Rule
public MigrationTestHelper helper;
public MigrationTest() {
helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
MigrationDb.class.getCanonicalName(),
new FrameworkSQLiteOpenHelperFactory());
}
@Test
public void migrate1To2() throws IOException {
SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1);
// db has schema version 1. insert some data using SQL queries.
// You cannot use DAO classes because they expect the latest schema.
db.execSQL(...);
// Prepare for the next version.
db.close();
// Re-open the database with version 2 and provide
// MIGRATION_1_2 as the migration process.
db = helper.runMigrationsAndValidate(TEST_DB, 2, true, MIGRATION_1_2);
// MigrationTestHelper automatically verifies the schema changes,
// but you need to validate that the data was migrated properly.
}
}
您可以閱讀官方文檔了解更多信息
您可以創建主文件'create.sql'和名為'1.sql,2.sql,..,n.sql'的遷移文件。 例如,將所有這些文件存儲在資產中。
如果用戶沒有數據庫,請應用create.sql如果用戶需要從A到Z進行數據庫升級,則應用+ 1.sql,+ 2.sql,...,z.sql。
您需要實現applyUpgrades方法,您將在升級版本的DB和遷移測試中使用該方法。 它看起來像:
fun Context.applyUpgrades(db: SQLiteDatabase, from: Int, to: Int): Unit =
(from+1..to).forEach { index ->
val migrationSql = getMigrationFromAssets(index)
db.execSQL(migrationSql)
}
您的遷移測試將如下所示:
@Test
fun upgrade10to11() { // when you upgrade from 10 to 11
val db = SQLiteDatabase.create(null)
// apply all previous migrations
applyUpgrades(db, from = INITIAL, to = 10)
val valuesBefore = ..
// our new migration
applyUpgrades(db, from = 10, to = 11)
val valuesAfter = ..
// assert that valuesBefore and valuesAfter are correct
}
您還可以檢查是否忘記了對新遷移的寫入測試:
@Test
public void hasAllNecessaryTests() {
assertEquals(DB_VERSION, 11);
}
由於您只需要數據和結構來測試遷移,您可以備份舊數據庫並在測試中使用它們。
所以對於每個測試:
這樣,您只需進行一次備份,並可以在每次測試時恢復它們。 如果您的測試是自動化的,您甚至可以自動恢復備份。
對於SQLite,進行備份就像復制數據庫文件一樣簡單,但幾乎每個數據庫都有一種制作和恢復備份的方法。
您更新的應用程序似乎嘗試再次創建數據庫(而不是內部數據),但舊應用程序的數據庫仍然存在,這將無法正常工作。 這可能是由於應用程序沒有注意到之前安裝過它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.