使用 Glance 进行单元测试

借助 Glance 单元测试 API,您可以测试 Glance 代码,而无需膨胀视图或 UI Automator。例如,借助单元测试 API,您可以使用 hasContentDescriptionEqualToisChecked 等匹配器验证各种条件,例如元素是否在列表中或者是否已勾选复选框。

此 API 是轻量级的,需要较少的设置,因此您可以在开发 widget 的各个部分时执行测试驱动型开发,并对其进行整理以提高代码重复使用率。

设置

以下示例显示了使用单元测试库所需的依赖项:

// Other Glance and Compose runtime dependencies.
...
testImplementation 'androidx.glance:glance-testing:1.1.0'
testImplementation 'androidx.glance:glance-AppWidget-testing:1.1.0'
testImplementation 'org.robolectric:robolectric:4.11.1'
...
// You may include additional dependencies, such as Robolectric, if your test
// needs to set a LocalContext.

测试结构

GlanceAppWidget 类之外整理可组合函数,以实现代码重用和单元测试。尽可能降低被测单元的复杂性。

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasAuthorAsSubtitle() = runGlanceAppWidgetUnitTest {
        // Prepare inputs and state
        setAppWidgetSize(100.dp, 100.dp)

        // Set the composable under test
        provideComposable {
            MyNewsItemComposable(TEST_NEWS_ITEM)
        }

        // Perform assertions
        onNode(hasTestTag("subTitle"))
            .assertHasText(TEST_NEWS_ITEM.authorName)
    }
}

设置测试的上下文和大小

如果您的可组合函数使用 LocalContext.current() 方法读取上下文,您必须使用 LocalContext.current() 方法设置上下文。否则,此步骤是可选的。

您可以使用任何基于 JVM 的 Android 单元测试框架(例如 Roboletric)提供上下文。

如果您的可组合函数访问 LocalSize,请先为测试设置预期尺寸,然后再在测试中提供可组合项。默认尺寸为 349.dp x 455.dp,相当于 Pixel 4 设备上纵向模式显示的 5x4 widget。

  • 如果 AppWidget 使用 sizeMode == Single,您可以在 widget 的 info.xml 文件中将其设置为 minWidthminHeight
  • 如果 AppWidget 使用 sizeMode == Exact,您可以采用与确定 widget 的尺寸类似的方式确定要测试的尺寸,确定 widget 可能会在哪些横向和纵向尺寸上显示,然后进行测试。
  • 如果您的 AppWidget 使用 sizeMode == Responsive,您可以将此属性设置为您在指定 sizeMode 时提供的列表中的某个大小。

测试超时的默认时长为 1 秒,但如果测试基础架构强制执行不同的超时,您可以将自定义时长作为参数传递给 runGlanceAppWidgetUnitTest 方法。

如需了解详情和代码示例,请参阅 runGlanceAppWidgetUnitTest 的参考文档。