Health Connect 測試程式庫 (androidx.health.connect:connect-testing
)
簡化自動化測試的建立作業您可以使用這個程式庫
應用程式的行為,並驗證應用程式能否正確回應
難以手動測試
您可以使用該程式庫建立本機單元測試,這些測試通常會驗證 應用程式中與 Health Connect 互動的應用程式類別行為 用戶端。
如要開始使用程式庫,請將程式庫新增為測試依附元件:
testImplementation("androidx.health.connect:connect-testing:1.0.0-alpha01")
程式庫的進入點為 FakeHealthConnectClient
類別,您必須
以取代 HealthConnectClient
FakeHealthConnectClient
提供的功能如下:
- 以記憶體內表示的記錄,您可插入、移除、刪除和 讀取
- 產生變更權杖及變更追蹤
- 記錄和變更的分頁
- 可使用虛設常式支援匯總回應
- 允許任何函式擲回例外狀況
- 可用來模擬權限檢查的
FakePermissionController
如要進一步瞭解如何取代測試中的依附元件,請參閱 在 Android 中插入依附元件。如要進一步瞭解假資訊,請參閱 在 Android 中使用測試替身。
舉例來說,如果呼叫用戶端的類別會被呼叫
HealthConnectManager
,且使用 HealthConnectClient
做為依附元件
看起來會像這樣:
class HealthConnectManager(
private val healthConnectClient: HealthConnectClient,
...
) { }
在測試中,您可以改為將假資料傳遞至測試中的類別:
import androidx.health.connect.client.testing.ExperimentalTestingApi
import androidx.health.connect.client.testing.FakeHealthConnectClient
import kotlinx.coroutines.test.runTest
@OptIn(ExperimentalTestingApi::class)
class HealthConnectManagerTest {
@Test
fun readRecords_filterByActivity() = runTest {
// Create a Fake with 2 running records.
val fake = FakeHealthConnectClient()
fake.insertRecords(listOf(fakeRunRecord1, fakeBikeRecord1))
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Read running records only.
val runningRecords = manager.fetchReport(activity = Running)
// Verify that the records were filtered correctly.
assertTrue(runningRecords.size == 1)
}
}
這項測試驗證了fetchReport
HealthConnectManager
可正確依活動篩選記錄。
驗證例外狀況
幾乎每次呼叫 HealthConnectClient
都會擲回例外狀況。例如:
insertRecords
的說明文件提及以下例外狀況:
@throws android.os.RemoteException
。@throws SecurityException
:適用於含有未允許存取權的要求。@throws java.io.IOException
可以回報任何磁碟 I/O 問題。
這些例外情況包括連線狀況不佳或裝置儲存空間不足等情況。 裝置。您的應用程式必須正確回應這些執行階段問題,因為 隨時發生
import androidx.health.connect.client.testing.stubs.stub
@Test
fun addRecords_throwsRemoteException_errorIsExposed() {
// Create Fake that throws a RemoteException
// when insertRecords is called.
val fake = FakeHealthConnectClient()
fake.overrides.insertRecords = stub { throw RemoteException() }
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Insert a record.
manager.addRecords(fakeRunRecord1)
// Verify that the manager is exposing an error.
assertTrue(manager.errors.size == 1)
}
匯總
匯總呼叫沒有假實作。而是改用匯總呼叫
請使用虛設常式,透過特定方式編寫程式碼的行為模式如要使用
透過 FakeHealthConnectClient
的 overrides
屬性虛設常式。
舉例來說,您可以編寫匯總函式的程式,傳回特定結果:
import androidx.health.connect.client.testing.AggregationResult
import androidx.health.connect.client.records.HeartRateRecord
import androidx.health.connect.client.records.ExerciseSessionRecord
import java.time.Duration
@Test
fun aggregate() {
// Create a fake result.
val result =
AggregationResult(metrics =
buildMap {
put(HeartRateRecord.BPM_AVG, 74.0)
put(
ExerciseSessionRecord.EXERCISE_DURATION_TOTAL,
Duration.ofMinutes(30)
)
}
)
// Create a fake that always returns the fake
// result when aggregate() is called.
val fake = FakeHealthConnectClient()
fake.overrides.aggregate = stub(result)
接著,您就可以在此驗證受測試的類別 HealthConnectManager
案件是否已正確處理結果:
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Call the function that in turn calls aggregate on the client.
val report = manager.getHeartRateReport()
// Verify that the manager is exposing an error.
assertThat(report.bpmAverage).isEqualTo(74.0)
權限
測試程式庫包含可傳遞的 FakePermissionController
做為 FakeHealthConnectClient
的依附元件。
受測試的主體可以使用 PermissionController—through
HealthConnectClient
介面的 permissionController
屬性進行檢查
。一般而言,這項程序通常會在每次呼叫用戶端前執行。
如要測試這項功能,你可以使用
FakePermissionController
:
import androidx.health.connect.client.testing.FakePermissionController
@Test
fun newRecords_noPermissions_errorIsExposed() {
// Create a permission controller with no permissions.
val permissionController = FakePermissionController(grantAll = false)
// Create a fake client with the permission controller.
val fake = FakeHealthConnectClient(permissionController = permissionController)
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Call addRecords so that the permission check is made.
manager.addRecords(fakeRunRecord1)
// Verify that the manager is exposing an error.
assertThat(manager.errors).hasSize(1)
}
分頁
分頁是最常見的錯誤來源,FakeHealthConnectClient
提供的機制,可幫助您
受測試的主體 (在此範例中為 HealthConnectManager
) 可以指定
ReadRecordsRequest
中的頁面大小:
fun fetchRecordsReport(pageSize: Int = 1000) }
val pagedRequest =
ReadRecordsRequest(
timeRangeFilter = ...,
recordType = ...,
pageToken = page1.pageToken,
pageSize = pageSize,
)
val page = client.readRecords(pagedRequest)
...
將網頁大小設為 2 等較小的值
分頁。例如,您可以插入 5 筆記錄,讓 readRecords
傳回 3 筆記錄
不同頁面:
@Test
fun readRecords_multiplePages() = runTest {
// Create a Fake with 2 running records.
val fake = FakeHealthConnectClient()
fake.insertRecords(generateRunningRecords(5))
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Read records with a page size of 2.
val report = manager.generateReport(pageSize = 2)
// Verify that all the pages were processed correctly.
assertTrue(report.records.size == 5)
}
測試資料
這個程式庫目前沒有可產生假資料的 API,但您可以使用 Android 程式碼搜尋程式庫所使用的資料和產生器。
虛設常式
FakeHealthConnectClient
的 overrides
屬性可讓您編寫
虛設常) 的任何函式,使其在呼叫時擲回例外狀況。
匯總呼叫也可以傳回任意資料,且支援排入佇列
多則回應詳情請參閱 Stub
和 MutableStub
。
極端案件摘要
- 確認應用程式可在用戶端擲回例外狀況時正常運作。 請參閱各項函式的說明文件,瞭解 。
- 確認您對用戶端發出的每個呼叫前面是否加上正確的 權限檢查。
- 驗證分頁實作結果。
- 確認在擷取多個網頁但其中一個已過期的情況下,會發生什麼情況 產生下一個符記