测试 content provider

如果您要实现 content provider 来存储和检索数据或 让其他应用可以访问数据,那么您应该测试您的提供程序,以确保 不会出现意外行为本课介绍如何测试 内容提供程序,也适用于您设为私密的提供程序。 自己的应用。

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

您可以通过内容提供程序访问实际的用户数据,因此请务必确保 您需要在隔离的测试环境中测试 content provider。这个 方法仅允许针对在数据集内明确设置的数据依赖关系运行, 测试用例。这也意味着您的测试不会修改实际用户数据。对于 应避免编写因剩余数据而失败的测试 与上一次测试的结果进行比较。同样,您的测试应避免添加或删除 提供商的实际联系信息

如需单独测试您的内容提供程序,请使用 ProviderTestCase2 类。通过该类,您可以使用 Android 模拟对象类,例如 IsolatedContextMockContentResolver(用于访问文件和 数据库信息,而不会影响实际用户数据。

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

如需为内容提供程序创建集成测试,您必须执行以下操作 步骤:

  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。这样做可以确保您测试此提供程序 其交互方式与常规应用相同。
  • 以合同形式测试公共提供商:如果您希望您的提供商 且可供其他应用使用,则应以合约的形式对其进行测试。 下面列举了一些示例来说明如何做到这一点: <ph type="x-smartling-placeholder">
      </ph>
    • 使用提供程序公开的常量进行测试。例如,查看 对于引用提供程序某个数据表中的列名称的常量。 这些应始终为提供程序公开定义的常量。
    • 测试提供程序提供的所有 URI。您的提供商可能会提供 URI,每个 URI 引用数据的不同方面。
    • 测试无效的 URI。您的单元测试应故意使用 无效 URI,并查找错误。良好的提供程序设计是 IllegalArgumentException:表示 URI 无效。
  • 测试标准提供程序交互:大多数提供程序提供六种访问权限 方法:query()insert()delete()update()getType()onCreate()。您的测试应验证所有这些方法是否有效。
  • 测试业务逻辑:如果 content provider 实现了业务逻辑, 您 进行测试。业务逻辑包括处理无效值、财务或 算术计算、消除或合并重复项。