使用 Glance 进行单元测试

借助 Glance 单元测试 API,您无需膨胀视图或使用界面自动化工具即可测试 Glance 代码。例如,借助单元测试 API,您可以使用匹配器(例如 hasContentDescriptionEqualToisChecked)验证条件,例如元素是否在列表中或是否已选中复选框。

此 API 轻巧且所需的设置较少,因此您可以在开发微件的各个部分并对其进行整理以提高代码重用率时执行测试驱动开发。

设置

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

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

测试结构

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

您可以使用 provideComposable 以可组合项为测试目标,并分别使用 onNodeonAllNodes 在一个或多个 Glance 节点上运行单元测试。

private const val FAKE_HEADLINE = "EXTRA! EXTRA! READ ALL ABOUT IT!"

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasHeadline() = runGlanceAppWidgetUnitTest {
        // Set the composable to test
        provideComposable {
            MyNewsItemComposable(FAKE_HEADLINE)
        }

        // Perform assertions
        onNode(hasTestTag("headline"))
            .assertHasText(FAKE_HEADLINE)
    }


    @Composable
    fun MyNewsItemComposable(headline: String) {
        Row {
            Text(
                text = headline,
                modifier = GlanceModifier.semantics { testTag = "headline" },
            )
        }
    }
}

为测试设置上下文和大小

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

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

如果可组合函数访问 LocalSize,请在测试中提供可组合项之前,为测试设置预期大小。默认大小为 349.dp x 455.dp,相当于在纵向模式下 Pixel 4 设备上显示的 5x4 微件。

  • 如果您的 AppWidget 使用 sizeMode == Single,您可以将其设置为微件的 info.xml 文件中的 minWidthminHeight
  • 如果您的 AppWidget 使用 sizeMode == Exact,您可以采用与确定微件大小类似的方式来确定要 测试的大小,并确定微件大小并 确定微件可能显示的横向和纵向大小并对其进行 测试。
  • 如果您的 AppWidget 使用 sizeMode == Responsive,您可以将其设置为在指定 sizeMode 时提供的列表中的某个大小。

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

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