如果您正在实现一个内容提供程序来存储和检索数据或使数据可供其他应用访问,则应测试您的提供程序以确保其行为不会以意外的方式发生。本课程介绍如何测试公共内容提供程序,也适用于您保留在自己应用中的私有提供程序。
为内容提供程序创建集成测试
内容提供程序允许您访问实际的用户数据,因此务必确保在隔离的测试环境中测试内容提供程序。这种方法允许您仅针对测试用例中明确设置的数据依赖项运行。这也意味着您的测试不会修改实际的用户数据。例如,您应避免编写因先前测试遗留数据而导致失败的测试。同样,您的测试应避免在提供程序中添加或删除实际的联系人信息。
要独立测试内容提供程序,请使用ProviderTestCase2
类。此类允许您使用Android模拟对象类,例如IsolatedContext
和MockContentResolver
来访问文件和数据库信息,而不会影响实际用户数据。
您的集成测试应编写为JUnit 4测试类。要了解有关创建JUnit 4测试类和使用JUnit 4断言的更多信息,请参阅创建本地单元测试类。
要为您的内容提供程序创建集成测试,您必须执行以下步骤
- 将您的测试类创建为
ProviderTestCase2
的子类。 - 指定
AndroidJUnitRunner
类,该类由AndroidX Test提供,作为您的默认测试运行器。 - 设置来自
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()
。您的测试应验证所有这些方法都能正常工作。 - 测试业务逻辑:如果内容提供程序实现了业务逻辑,则应对其进行测试。业务逻辑包括处理无效值、财务或算术计算、消除或合并重复项。