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