测试 content provider

如果您要实现 content provider 来存储和检索数据或使数据可供其他应用访问,则应测试您的提供程序,以确保其不会出现意外行为。本课介绍如何测试公开 content provider,也适用于您对自己的应用保持不公开状态的提供程序。

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

您可以通过 content provider 访问实际用户数据,因此请务必确保在隔离的测试环境中测试 content provider。采用这种方法,您可以仅针对在测试用例中明确设置的数据依赖项运行。这也意味着,您的测试不会修改实际的用户数据。例如,您应避免编写由于之前的测试遗留了数据而失败的测试。同样,您的测试应避免在提供程序中添加或删除实际联系信息。

如需单独测试 content provider,请使用 ProviderTestCase2 类。此类允许您使用 Android 模拟对象类(如 IsolatedContextMockContentResolver)来访问文件和数据库信息,而不会影响实际用户数据。

您的集成测试应编写为 JUnit 4 测试类。如需详细了解如何创建 JUnit 4 测试类以及如何使用 JUnit 4 断言,请参阅创建本地单元测试类

如需为 content provider 创建集成测试,您必须执行以下步骤:

  1. 将测试类创建为 ProviderTestCase2 的子类。
  2. AndroidX Test 提供的 AndroidJUnitRunner 类指定为默认测试运行程序。
  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 获取其所有环境信息,因此它只能在隔离的测试环境中运行。在测试用例类中完成的所有测试都针对此隔离对象运行。

针对 content provider 运行集成测试的方式与插桩单元测试相同。

要测试的内容

以下是一些关于测试 content provider 的具体准则。

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