Khi người dùng thiết lập thiết bị mới hoặc cài đặt lại ứng dụng, Android có thể khôi phục dữ liệu của ứng dụng từ bản sao lưu trên đám mây hoặc thông qua tính năng chuyển dữ liệu từ thiết bị này sang thiết bị khác. Nếu các quy tắc sao lưu của bạn bỏ qua dữ liệu quan trọng hoặc ứng dụng của bạn không thể sử dụng dữ liệu mà ứng dụng khôi phục, thì người dùng sẽ mất các chế độ cài đặt và tiến trình mà không thấy lỗi.
Các kiểm thử sao lưu và khôi phục tự động giúp bạn phát hiện những vấn đề này trước khi phát hành ứng dụng. Đây là các kiểm thử JUnit 5 chạy trên máy phát triển và kiểm soát các thiết bị thông minh thông qua Cầu gỡ lỗi Android (adb). Mỗi kiểm thử sẽ gieo dữ liệu ứng dụng trên một thiết bị, sao lưu và khôi phục ứng dụng thông qua khung sao lưu Android, sau đó kiểm tra để đảm bảo dữ liệu vẫn còn nguyên vẹn. Bạn định cấu hình các kiểm thử dưới dạng bộ kiểm thử của trình bổ trợ Android cho Gradle (AGP) trong tệp bản dựng của mô-đun.
Cách hoạt động
Bộ kiểm thử sao lưu và khôi phục có hai phần hoạt động cùng nhau:
- Kiểm thử trên máy chủ là các chương trình kiểm thử JUnit 5 chạy trên máy phát triển của bạn. Chúng sử dụng
BackupRestoreControllercho mỗi thiết bị để gieo dữ liệu, sao lưu và khôi phục ứng dụng của bạn, đồng thời kiểm tra kết quả. - Thao tác trên thiết bị là các lớp triển khai
BackupDeviceAction. Các SDK này chạy trong quy trình của ứng dụng trên thiết bị, vì vậy, chúng có thể đọc và ghi dữ liệu thông qua mã của ứng dụng. Các chương trình kiểm thử máy chủ gọi các thao tác trên thiết bị theo tên lớp.
Khi bạn chạy bộ kiểm thử, AGP sẽ tạo ứng dụng và một APK kiểm thử chứa các thao tác trên thiết bị của bạn. Trước mỗi bài kiểm thử, khung kiểm thử sẽ cài đặt cả hai tệp APK trên mỗi thiết bị mà bài kiểm thử sử dụng, sau đó xoá dữ liệu của ứng dụng.
Các loại bộ nhớ tích hợp
Bảng sau đây liệt kê các lớp con StorageDomain cho phép bạn gieo và xác minh dữ liệu mà không cần viết hành động trên thiết bị:
| Miền lưu trữ | Dữ liệu |
|---|---|
StorageDomain.Preference |
Khoá trong tệp SharedPreferences. |
StorageDomain.Database |
Một hàng trong bảng cơ sở dữ liệu SQLite. |
StorageDomain.TextFile |
Một tệp văn bản trong bộ nhớ trong của ứng dụng. |
StorageDomain.BinaryFile |
Tệp nhị phân trong bộ nhớ trong của ứng dụng. |
Để kiểm thử dữ liệu khác, chẳng hạn như tệp DataStore, hãy viết các thao tác trên thiết bị.
Phương tiện đi lại
Mỗi bản sao lưu đều sử dụng một giá trị BackupTransportMode. Bảng sau đây liệt kê các phương tiện đi lại được hỗ trợ:
| Chế độ | Trường hợp |
|---|---|
LOCAL |
Bản sao lưu vào phương thức sao lưu cục bộ của thiết bị. Dữ liệu sao lưu vẫn nằm trên thiết bị. |
CLOUD_ENCRYPTED |
Bản sao lưu trên đám mây, chẳng hạn như bản sao lưu được lưu vào Tài khoản Google của người dùng từ một thiết bị có tính năng mã hoá phía máy khách. |
CLOUD_UNENCRYPTED |
Bản sao lưu trên đám mây từ một thiết bị không có tính năng mã hoá phía máy khách. |
DEVICE_TO_DEVICE |
Chuyển dữ liệu từ thiết bị này sang thiết bị khác, chẳng hạn như qua cáp hoặc Wi-Fi. |
LOCAL hoạt động trên mọi thiết bị được hỗ trợ. Chế độ đám mây và chế độ thiết bị với thiết bị tạo ra các bản sao lưu giống như thao tác Sao lưu dữ liệu ứng dụng trong Android Studio: bản sao lưu được lưu vào máy phát triển của bạn thay vì được tải lên hoặc gửi đến một thiết bị khác. Chế độ đám mây và chế độ thiết bị với thiết bị yêu cầu dịch vụ Google Play trên thiết bị và một bản dựng có thể gỡ lỗi của ứng dụng. Nếu quy tắc sao lưu của bạn phụ thuộc vào phương thức mã hoá phía máy khách, hãy kiểm thử cả hai chế độ đám mây.
Yêu cầu
Để sử dụng tính năng kiểm thử sao lưu và khôi phục tự động, hãy đảm bảo rằng môi trường của bạn đáp ứng các yêu cầu sau:
- Gradle phiên bản 9.6.0 trở lên.
- JDK phiên bản 17 trở lên.
- Một thiết bị hoặc trình mô phỏng chạy Android 12 (cấp độ API 31) trở lên, được kết nối thông qua adb. Để kiểm tra việc chuyển dữ liệu giữa hai thiết bị, hãy kết nối hai thiết bị.
Khả năng tương thích
Bảng sau đây liệt kê các phiên bản tối thiểu và phiên bản đề xuất để thử nghiệm tính năng sao lưu và khôi phục tự động:
| Thành phần | Phiên bản tối thiểu | Phiên bản nên dùng |
|---|---|---|
| Android Studio | Rabbit 2 Canary 1 | Rabbit 2 Canary 4 trở lên |
| Trình bổ trợ Android cho Gradle (AGP) | 9.5.0-alpha06 | 9.5.0-alpha09 trở lên |
androidx.test.backup thư viện |
1.0.0-alpha01 | 1.0.0-alpha02 trở lên |
Mỗi phiên bản xem trước của AGP đều yêu cầu phiên bản xem trước tương ứng của Android Studio. Để biết thêm thông tin, hãy xem phần Bản xem trước AGP.
Thiết lập dự án
Để thêm bộ kiểm thử sao lưu và khôi phục vào mô-đun ứng dụng, hãy hoàn tất các bước sau:
Bật cờ thử nghiệm
Trong tệp gradle.properties của dự án, hãy bật bộ kiểm thử và kiểm thử sao lưu:
android.experimental.testSuiteSupport=true
android.experimental.enableBackupTest=true
Khai báo bộ kiểm thử
Trong tệp build.gradle.kts của mô-đun ứng dụng, hãy khai báo một bộ kiểm thử dự phòng trong khối testOptions:
android {
testOptions {
backupTests {
create("backupTest")
}
}
}
Tên bộ kiểm thử (backupTest trong ví dụ này) xác định các thư mục nhóm tài nguyên và tên tác vụ Gradle. Bạn có thể tuỳ chỉnh bộ kiểm thử bằng các thuộc tính không bắt buộc sau:
- Sử dụng
backupTestLibraryVersionđể đặt phiên bản của thư việnandroidx.test.backupmà AGP thêm vào bộ thư viện, chẳng hạn như"1.0.0-alpha02". Thuộc tính này là không bắt buộc. Nếu bạn bỏ qua, AGP sẽ quay lại phiên bản thư viện mặc định dựa trên phiên bản AGP. - Sử dụng
targetVariantsđể chỉ định các biến thể bản dựng mà bộ kiểm thử, chẳng hạn nhưtargetVariants.add("demoDebug"). Thuộc tính này là không bắt buộc. Nếu bạn bỏ qua tham số này, bộ kiểm thử sẽ kiểm thử các biến thể củatestBuildTypetrong mô-đun. Theo mặc định, tham số này làdebug. Bạn nên kiểm thử một biến thể có thể gỡ lỗi vì chế độ truyền dữ liệu trên đám mây và giữa các thiết bị yêu cầu một ứng dụng có thể gỡ lỗi.
AGP thêm thư viện lưu trữ, androidx.test.backup:backup-host và JUnit 5 vào
các kiểm thử lưu trữ. Thao tác này sẽ thêm thư viện thiết bị, androidx.test.backup:backup, vào tệp APK kiểm thử và đặt trình chạy đo lường của tệp APK kiểm thử.
Để thêm các phần phụ thuộc khác, hãy sử dụng khối hostJar và testApk của bộ ứng dụng.
Ví dụ: để sử dụng Truth trong các kiểm thử máy chủ, hãy thêm thư viện này vào khối hostJar:
create("backupTest") {
hostJar {
dependencies {
implementation("com.google.truth:truth:1.4.2")
}
}
}
Tạo nhóm tài nguyên
Tạo các thư mục nhóm tài nguyên khớp với tên bộ kiểm thử:
- Đặt các bài kiểm thử máy chủ lưu trữ trong
src/{suiteName}/test/kotlin/. - Đặt các thao tác trên thiết bị vào
src/{suiteName}/androidTest/kotlin/.
Ví dụ: một bộ có tên backupTest sử dụng cấu trúc thư mục sau:
app/src/backupTest/
├── androidTest/
│ └── kotlin/com/example/myapp/ThemeActions.kt
└── test/
└── kotlin/com/example/myapp/SettingsBackupTest.kt
Kiểm tra cấu hình sao lưu
Kiểm thử sao lưu và khôi phục dữ liệu có trong cấu hình sao lưu của ứng dụng. Đảm bảo rằng bạn đã bật tính năng sao lưu cho ứng dụng và quy tắc sao lưu của bạn bao gồm cả dữ liệu mà bạn kiểm thử.
Viết mã kiểm thử sao lưu và khôi phục
Viết các bài kiểm thử trên máy chủ lưu trữ trong nhóm tài nguyên test của bộ kiểm thử. Mỗi lớp kiểm thử cần có 2 chú thích:
@ExtendWith(BackupRestoreExtension::class)cung cấp các thiết bị thông minh cho bài kiểm thử.@BackupRestoreConfig(applicationId = "...")đặt mã ứng dụng của ứng dụng đang được kiểm thử. Sử dụng mã ứng dụng của biến thể mà bạn kiểm thử, bao gồm cảapplicationIdSuffix.
Mỗi phương thức kiểm thử khai báo một tham số BackupRestoreController cho mỗi thiết bị mà phương thức đó sử dụng.
Kiểm thử các loại bộ nhớ tích hợp
Để kiểm thử các loại bộ nhớ tích hợp, hãy gọi runBackupRestoreFlow bằng dữ liệu cần gieo, thư mục cho tệp sao lưu và chế độ vận chuyển. Phương thức này chạy các bước sau trên thiết bị:
- Cung cấp dữ liệu cho từng miền lưu trữ.
- Dừng ứng dụng.
- Sao lưu ứng dụng.
- Xoá dữ liệu của ứng dụng.
- Khôi phục bản sao lưu.
- Xác minh rằng mỗi miền lưu trữ đều có giá trị của hạt giống.
Nếu một bước không thành công, phương thức sẽ gửi ra một ngoại lệ khiến kiểm thử không đạt. Ví dụ sau đây kiểm thử một khoá SharedPreferences, một hàng SQLite và một tệp nội bộ bằng phương tiện sao lưu cục bộ:
package com.example.myapp
import androidx.test.backup.host.BackupRestoreConfig
import androidx.test.backup.host.BackupRestoreController
import androidx.test.backup.host.BackupRestoreExtension
import androidx.test.backup.host.BackupTransportMode
import androidx.test.backup.host.StorageDomain
import java.nio.file.Path
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.api.io.TempDir
@ExtendWith(BackupRestoreExtension::class)
@BackupRestoreConfig(applicationId = "com.example.myapp")
class SettingsBackupTest {
@Test
fun settingsSurviveBackupAndRestore(
device: BackupRestoreController,
@TempDir outputDir: Path,
): Unit = runBlocking {
device.runBackupRestoreFlow(
storages = listOf(
StorageDomain.Preference(
prefName = "settings",
key = "theme",
value = "dark",
),
StorageDomain.Database(
dbName = "notes.db",
table = "notes",
primaryKeyCol = "id",
primaryKeyVal = 1,
columnValues = mapOf("title" to "Groceries"),
),
StorageDomain.TextFile(
path = "drafts/note.txt",
content = "Buy milk",
),
),
outputDir = outputDir,
mode = BackupTransportMode.LOCAL,
)
}
}
Hãy lưu ý những điều sau khi bạn xác định miền lưu trữ:
Preferencelấy tên của tệpSharedPreferencesmà không có đuôi.xml.TextFilevàBinaryFilephân giải các đường dẫn tương đối theofilesDircủa ứng dụng.Databaseghi hàng bằng SQL và tạo bảng có các cộtTEXTnếu bảng không tồn tại. Nếu ứng dụng của bạn sử dụng Room, bạn nên kiểm thử nội dung cơ sở dữ liệu bằng các thao tác trên thiết bị sử dụng DAO để cơ sở dữ liệu có giản đồ mà Room mong đợi.
Viết hành động trên thiết bị
Để gieo mầm hoặc xác minh dữ liệu mà các loại bộ nhớ tích hợp sẵn không bao gồm, hãy viết các thao tác trên thiết bị trong nhóm tài nguyên androidTest của bộ ứng dụng. Một hành động trên thiết bị sẽ triển khai BackupDeviceAction và ghi đè hai thành phần:
- Đặt
phasethànhBackupDeviceAction.PHASE_POPULATEcho một hành động gieo dữ liệu hoặcBackupDeviceAction.PHASE_VERIFYcho một hành động kiểm tra dữ liệu. - Triển khai
executeđể chạy hành động bằngContextcủa ứng dụng và các đối số từ kiểm thử máy chủ lưu trữ. Trả về kết quả được tạo bằng phương thức nhà máyBackupDeviceActionResult.successhoặcBackupDeviceActionResult.failure, đồng thời truyền thông báo lỗi đếnfailure.
Phương thức execute chạy trong quy trình của ứng dụng trên một luồng nền, vì vậy, phương thức này có thể chặn cho đến khi quá trình đọc và ghi hoàn tất.
Ví dụ sau đây sẽ tạo và xác minh chế độ cài đặt giao diện mà ứng dụng lưu trữ bằng Preferences DataStore. Ứng dụng xác định DataStore trong nhóm tài nguyên chính:
// In app/src/main/kotlin/com/example/myapp/Settings.kt
package com.example.myapp
import android.content.Context
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
val Context.settingsDataStore by preferencesDataStore(name = "settings")
val THEME_KEY = stringPreferencesKey("theme")
Các hành động trên thiết bị sử dụng cùng một định nghĩa:
// In app/src/backupTest/androidTest/kotlin/com/example/myapp/ThemeActions.kt
package com.example.myapp
import android.content.Context
import androidx.datastore.preferences.core.edit
import androidx.test.backup.BackupDeviceAction
import androidx.test.backup.BackupDeviceActionArgs
import androidx.test.backup.BackupDeviceActionResult
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
class SeedThemeAction : BackupDeviceAction {
override val phase = BackupDeviceAction.PHASE_POPULATE
override fun execute(
context: Context,
args: BackupDeviceActionArgs,
): BackupDeviceActionResult {
val theme = args["theme"]
?: return BackupDeviceActionResult.failure("Missing theme argument")
runBlocking {
context.settingsDataStore.edit { it[THEME_KEY] = theme }
}
return BackupDeviceActionResult.success()
}
}
class VerifyThemeAction : BackupDeviceAction {
override val phase = BackupDeviceAction.PHASE_VERIFY
override fun execute(
context: Context,
args: BackupDeviceActionArgs,
): BackupDeviceActionResult {
val expected = args["theme"]
val actual = runBlocking {
context.settingsDataStore.data.first()[THEME_KEY]
}
return if (actual == expected) {
BackupDeviceActionResult.success()
} else {
BackupDeviceActionResult.failure("Expected $expected, found $actual")
}
}
}
Để trả về dữ liệu cho kiểm thử lưu trữ, hãy truyền một bản đồ đến phương thức success. Thử nghiệm lưu trữ đọc bản đồ từ BackupActionResult.Success.data.
Chạy từng bước của quy trình
Để sử dụng các thao tác trên thiết bị hoặc tuỳ chỉnh quy trình, hãy tự gọi từng bước. Bài kiểm thử máy chủ lưu trữ sau đây chạy các thao tác trên thiết bị từ phần trước về việc sao lưu và khôi phục trên đám mây:
package com.example.myapp
import androidx.test.backup.host.BackupActionResult
import androidx.test.backup.host.BackupRestoreConfig
import androidx.test.backup.host.BackupRestoreController
import androidx.test.backup.host.BackupRestoreExtension
import androidx.test.backup.host.BackupTransportMode
import java.nio.file.Path
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.api.fail
import org.junit.jupiter.api.io.TempDir
const val SEED_THEME = "com.example.myapp.SeedThemeAction"
const val VERIFY_THEME = "com.example.myapp.VerifyThemeAction"
@ExtendWith(BackupRestoreExtension::class)
@BackupRestoreConfig(applicationId = "com.example.myapp")
class ThemeBackupTest {
@Test
fun themeSurvivesCloudBackup(
device: BackupRestoreController,
@TempDir outputDir: Path,
): Unit = runBlocking {
val args = mapOf("theme" to "dark")
device.runOnDevice(SEED_THEME, args).assertSuccess()
device.stopApp()
val backupFile = device.performBackup(
BackupTransportMode.CLOUD_ENCRYPTED,
outputDir,
)
device.clearAppData()
device.performRestore(backupFile)
device.runOnDevice(VERIFY_THEME, args).assertSuccess()
}
}
fun BackupActionResult.assertSuccess() {
if (this is BackupActionResult.Failure) fail(errorMessage)
}
Khi một hành động trên thiết bị không thành công, runOnDevice sẽ trả về một BackupActionResult.Failure thay vì gửi một ngoại lệ, vì vậy, hãy kiểm tra kết quả. Các bước khác sẽ gửi ra một ngoại lệ nếu không thành công.
Kiểm thử việc chuyển dữ liệu giữa các thiết bị
Để kiểm thử quá trình chuyển giữa hai thiết bị, hãy khai báo một tham số BackupRestoreController cho mỗi thiết bị. Sao lưu ứng dụng trên thiết bị nguồn, sau đó khôi phục tệp sao lưu trên thiết bị mục tiêu. Ví dụ sau đây sử dụng lại các hằng số và trình trợ giúp assertSuccess từ ví dụ trước:
package com.example.myapp
import androidx.test.backup.host.BackupRestoreConfig
import androidx.test.backup.host.BackupRestoreController
import androidx.test.backup.host.BackupRestoreExtension
import androidx.test.backup.host.BackupTransportMode
import androidx.test.backup.host.Device
import java.nio.file.Path
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.api.io.TempDir
@ExtendWith(BackupRestoreExtension::class)
@BackupRestoreConfig(applicationId = "com.example.myapp")
class ThemeTransferTest {
@Test
fun themeTransfersToNewDevice(
@Device(role = "source") source: BackupRestoreController,
@Device(role = "target") target: BackupRestoreController,
@TempDir outputDir: Path,
): Unit = runBlocking {
val args = mapOf("theme" to "dark")
source.runOnDevice(SEED_THEME, args).assertSuccess()
source.stopApp()
val backupFile = source.performBackup(
BackupTransportMode.DEVICE_TO_DEVICE,
outputDir,
)
target.clearAppData()
target.performRestore(backupFile)
target.runOnDevice(VERIFY_THEME, args).assertSuccess()
}
}
Giá trị role của @Device là một nhãn giúp bạn dễ đọc kiểm thử hơn. Điều này không ảnh hưởng đến thiết bị nhận tham số. Nếu chỉ có một thiết bị được kết nối, cả hai tham số đều sử dụng thiết bị đó và kiểm thử mô phỏng quá trình chuyển trên một thiết bị. Việc xoá dữ liệu của mục tiêu sẽ đảm bảo rằng dữ liệu được khôi phục đến từ bản sao lưu.
Chọn thiết bị
Theo mặc định, khung kiểm thử sẽ sắp xếp các thiết bị trực tuyến theo số sê-ri và chỉ định các thiết bị đó cho tham số BackupRestoreController theo vị trí. Ví dụ: tham số đầu tiên của phương thức kiểm thử sẽ lấy thiết bị đầu tiên và tham số thứ hai sẽ lấy thiết bị thứ hai. Nếu không có thiết bị nào cho một vị trí, thì tham số sẽ lấy thiết bị đầu tiên. Vị trí tính tất cả các tham số của phương thức, vì vậy, hãy khai báo các tham số thiết bị trước các tham số khác, chẳng hạn như @TempDir. Biến môi trường ANDROID_SERIAL không ảnh hưởng đến việc chỉ định thiết bị.
Để chọn thiết bị, hãy đặt giá trị serial hoặc api của @Device hoặc đặt thuộc tính hệ thống JVM. Thuộc tính hệ thống được ưu tiên hơn giá trị @Device. Bảng sau đây liệt kê các thuộc tính hệ thống được hỗ trợ:
| Thuộc tính hệ thống | Mô tả |
|---|---|
androidx.test.backup.device.serial |
Số sê-ri của thiết bị cho tất cả các thông số của thiết bị. |
androidx.test.backup.device.serials |
Danh sách số sê-ri được phân tách bằng dấu phẩy, được gán cho các tham số theo vị trí. |
androidx.test.backup.device.serial.{name} |
Số sê-ri cho các tham số được chú thích bằng @Device(serial = "{name}"). |
androidx.test.backup.device.api |
Cấp độ API của thiết bị cho tất cả các thông số thiết bị. |
androidx.test.backup.device.apis |
Danh sách các cấp độ API được phân tách bằng dấu phẩy, được chỉ định cho các tham số theo vị trí. |
Truyền các thuộc tính này bằng -D khi bạn chạy kiểm thử từ dòng lệnh.
Các thuộc tính này áp dụng cho mọi kiểm thử chạy, vì vậy, hãy sử dụng tuỳ chọn --tests để chỉ chạy các kiểm thử cần đến các thuộc tính này. Ví dụ: lệnh sau đây chạy ThemeTransferTest với emulator-5554 là thiết bị nguồn và emulator-5556 là thiết bị mục tiêu:
./gradlew :app:testDebugBackupTestDefaultTestSuite --tests "com.example.myapp.ThemeTransferTest" -Dandroidx.test.backup.device.serials=emulator-5554,emulator-5556Giữ lại dữ liệu ứng dụng giữa các lần kiểm thử
Trước mỗi lần kiểm thử, khung kiểm thử sẽ xoá dữ liệu của ứng dụng trên mỗi thiết bị mà chương trình kiểm thử sử dụng. Để tắt tính năng này cho một lớp hoặc phương thức kiểm thử, hãy chú thích lớp hoặc phương thức đó bằng @Isolation(IsolationPolicy.MANUAL).
Viết mã kiểm thử bằng Java
Các phương thức BackupRestoreController là các hàm tạm ngưng trong Kotlin. Nếu bạn viết kiểm thử máy chủ bằng Java, hãy sử dụng biến thể Async của mỗi phương thức, chẳng hạn như runBackupRestoreFlowAsync, phương thức này sẽ trả về ListenableFuture.
Chạy kiểm thử sao lưu và khôi phục
AGP tạo một tác vụ Gradle cho mỗi biến thể mà bộ kiểm thử kiểm thử, có tên là test{Variant}{SuiteName}DefaultTestSuite. Để chạy bộ backupTest cho biến thể debug, hãy kết nối thiết bị và chạy tác vụ:
./gradlew :app:testDebugBackupTestDefaultTestSuiteCác tác vụ check, test và connectedCheck không chạy bộ kiểm thử sao lưu và khôi phục, vì vậy, hãy chạy tác vụ của bộ kiểm thử một cách rõ ràng.
Để chạy một lớp hoặc phương thức kiểm thử, hãy sử dụng tuỳ chọn --tests:
./gradlew :app:testDebugBackupTestDefaultTestSuite --tests "com.example.myapp.ThemeBackupTest"Kiểm tra báo cáo thử nghiệm
Sau khi chạy kiểm thử xong, AGP sẽ tạo một báo cáo kiểm thử HTML tại {module}/build/reports/tests/{taskName}/index.html, chẳng hạn như app/build/reports/tests/testDebugBackupTestDefaultTestSuite/index.html.
Các vấn đề và hạn chế đã biết
Tính năng kiểm thử sao lưu và khôi phục tự động có các vấn đề và hạn chế đã biết sau đây:
- Android Studio chưa hỗ trợ bộ kiểm thử. Trình soạn thảo mã có thể cho thấy lỗi tham chiếu chưa được giải quyết trong các tệp nguồn của bộ kiểm thử ngay cả khi dự án của bạn được định cấu hình chính xác. Thay vào đó, hãy tạo và chạy các kiểm thử sao lưu và khôi phục từ dòng lệnh bằng Gradle.
- Các chương trình kiểm thử chỉ chạy trên thiết bị và trình mô phỏng được kết nối với máy phát triển của bạn thông qua adb. Không hỗ trợ Phòng thử nghiệm Firebase.
- Các thử nghiệm sẽ xoá dữ liệu của ứng dụng và thay đổi chế độ cài đặt sao lưu trên những thiết bị mà người dùng sử dụng. Bạn nên sử dụng thiết bị thử nghiệm chuyên dụng.
Để biết các thay đổi trong mỗi bản phát hành, hãy xem ghi chú phát hành về việc kiểm thử tính năng sao lưu và khôi phục.