测试您的内容提供程序

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

您还应阅读内容提供程序

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

在 Android 中,应用将内容提供程序视为提供数据表而其内部构件不可见的 Google Data API。内容提供程序可能有许多公开常量,但通常公开方法即使有也很少,而且没有公开变量。因此,您应仅根据提供程序的公开成员来编写测试。这样设计的内容提供程序在其自身与其用户之间提供了约定。

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

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

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

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

  • 将测试类创建为 ProviderTestCase2 的子类。
  • 在测试类定义的开头添加 @RunWith(AndroidJUnit4::class) 注解。
  • AndroidX Test 提供的 AndroidJUnitRunner 类指定为默认测试运行程序。测试入门中对此步骤进行了更详细的说明。
  • 通过 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()。您的测试应验证所有这些方法是否都能正常工作。内容提供程序主题中对这些方法进行了更详细的说明。
  • 测试业务逻辑:如果内容提供程序实现业务逻辑,则应对其进行测试。业务逻辑包括处理无效值、财务或算术计算、消除或合并重复项。