测试内容提供程序

如果您正在实现一个 内容提供程序 来存储和检索数据或使数据可供其他应用访问,则应测试您的提供程序以确保其行为不会出乎意料。本课程介绍如何测试公共内容提供程序,也适用于您保留为自己的应用私有的提供程序。

为内容提供程序创建集成测试

内容提供程序允许您访问实际的用户数据,因此务必确保在隔离的测试环境中测试内容提供程序。这种方法允许您只针对测试用例中明确设置的数据依赖项运行。这也意味着您的测试不会修改实际的用户数据。例如,您应该避免编写因先前测试中剩余数据而失败的测试。同样,您的测试应避免在提供程序中添加或删除实际的联系信息。

要在隔离环境中测试您的内容提供程序,请使用 ProviderTestCase2 类。此类允许您使用 Android 模拟对象类,例如 IsolatedContextMockContentResolver 来访问文件和数据库信息,而不会影响实际的用户数据。

您的集成测试应编写为 JUnit 4 测试类。要了解有关创建 JUnit 4 测试类和使用 JUnit 4 断言的更多信息,请参阅 创建本地单元测试类

要为您的内容提供程序创建集成测试,您必须执行以下步骤

  1. 将您的测试类创建为 ProviderTestCase2 的子类。
  2. 指定 AndroidJUnitRunner 类(AndroidX Test 提供的默认测试运行程序)。
  3. 设置来自 ApplicationProvider 类的 Context 对象。请参阅下面的代码片段以了解示例。

Kotlin

@Throws(Exception::class)
override fun setUp() {
  super.setUp()
  context = ApplicationProvider.getApplicationContext<Context>()
}

Java

@Override
protected void setUp() throws Exception {
  super.setUp();
  setContext(ApplicationProvider.getApplicationContext());
}

ProviderTestCase2 的工作原理

您可以使用 ProviderTestCase2 的子类来测试提供程序。此基类扩展了 AndroidTestCase,因此它提供了 JUnit 测试框架以及用于测试应用程序权限的 Android 特定方法。此类的最重要功能是其初始化,它创建了隔离的测试环境。

初始化

ProviderTestCase2 的构造函数中完成了初始化,子类在其自己的构造函数中调用它。ProviderTestCase2 构造函数创建一个 IsolatedContext 对象,该对象允许文件和数据库操作,但会屏蔽与 Android 系统的其他交互。文件和数据库操作本身发生在本地设备或模拟器上的目录中,并且具有特殊的开头。

然后,构造函数创建一个 MockContentResolver 用作测试的解析器。

最后,构造函数创建被测提供程序的实例。这是一个普通的 ContentProvider 对象,但它从 IsolatedContext 获取其所有环境信息,因此它仅限于在隔离的测试环境中工作。测试用例类中完成的所有测试都针对此隔离的对象运行。

运行内容提供程序的集成测试的方式与工具测试相同。

测试内容

以下是测试内容提供程序的一些具体指南。

  • 使用解析器方法进行测试:即使您可以在 ProviderTestCase2 中实例化提供程序对象,也应始终使用具有适当 URI 的解析器对象进行测试。这样做可以确保您通过执行常规应用程序将使用的相同交互来测试提供程序。
  • 将公共提供程序作为契约进行测试:如果您打算使您的提供程序公开并可供其他应用程序使用,则应将其作为契约进行测试。以下是一些操作方法示例:
    • 使用提供程序公开的常量进行测试。例如,查找引用提供程序数据表中列名的常量。这些始终应是提供程序公开定义的常量。
    • 测试您的提供程序提供的所有 URI。您的提供程序可能会提供多个 URI,每个 URI 引用数据的不同方面。
    • 测试无效URI。您的单元测试应该故意使用无效URI调用提供程序,并查找错误。良好的提供程序设计是针对无效URI抛出IllegalArgumentException
  • 测试标准提供程序交互:大多数提供程序提供六种访问方法:query()insert()delete()update()getType()onCreate()。您的测试应该验证所有这些方法都能正常工作。
  • 测试业务逻辑:如果内容提供程序实现了业务逻辑,则应对其进行测试。业务逻辑包括处理无效值、财务或算术计算、消除或合并重复项。