本文翻译自:Testing Your Content Provider
水平有限自己感觉很多地方表达的并不到位,但找不到更好的表达方式,如果您觉着有更好的表达方式,帮助我改进!
测试你的Content Provider
如果你实现了一个Content Provider来存取数据或者为其它App提供数据,你应该测试你的Provider来确保它按照预期的方式来表现。这节课描述如何测试公开的ContentProvider,同时这也适合你用来测试被你设置为私有的ContentProvider。
为Content Providers 创建集成测试
在Android中,App通过Content Provider提供的Api来获取数据表,他们的内部对View来说是不可见的。一个content provider可能有许多公开的常量,但是他通常很少有公开的方法,也没有公开的变量。处于这个原因,你应该仅基于Provider的公共成员来编写你的测试。Content Provider就是这样被设计的,他提供了自身和用户之间的交互的标准。
Content Provider允许你获取真实的用户数据,所以确保你在一个隔离的测试环境中测试Content Provider,这是非常重要的。这样做的,可以保证你的测试用例只使用你明确设定的数据依赖。这意味着你的测试将不会修改真实的用户数据。比如,你应该避免编写的测试,因为之前测试遗留的数据而失败。同样的,你的测试应该避免添加或者删除Provider实际提供的真实信息。
为了在隔离的情况下测试你的Content Provider,使用ProviderTestCase2类。这个类允许你使用Android mock对象类,比如,IsolatedContext和MockContentResolver 在不影响真实用户数据的前提下,来获取文件和数据库信息。
你的集成测试应该写成一个JUnit 4测试类。要了解更多关于创建JUnit 4测试类和使用JUnit 4断言,请参阅构建本地单元测试
。
为了创建一个Content Provider的集成测试,你必须遵从如下步骤:
- 创建ProviderTestCase2 的子类作为你的测试类。
- 在开始定义你的测试类之前添加@RunWith(AndroidJUnit4.class)注解
- 具体声明Android Testing Support Libray 提供的AndroidJUnitRunner 类,作为你的默认测试运行器。具体的步骤请参见: 开始你的测试
- 从InstrumentationRegistry类设置Context 对象。参见下面的实例片段:
@Override
protected void setUp() throws Exception {
setContext(InstrumentationRegistry.getTargetContext());
super.setUp();
}
ProviderTestCase2 如何工作?
你借助ProviderTestCase2的子类来测试Provider。这个基类集成自AndroidTestCase , 所以它提供了JUnit 测试框架以及测试应用程序权限的Android特有的方法。这个类最重要的特点是它的初始化,他创建了隔离的测试环境。
它的初始化是在ProviderTestCase2的构造函数中进行的,他的子类在自己的构造方法中调用。ProviderTestCase2 的构造方法创建一个IsolatedContext对象他允许文件和数据库的操作,但是断绝了和Android 系统之间其它的交互。文件和数据库的操作他们本身发生的位置是本地的设备或者模拟器,并且有一个特殊的前缀。
构造方法接着创建一个MockCotentResolver 作为resolve来进行测试。
最后,构造方法创建一个Provider的实例来进行测试。这是一个标准的ContentProvider 对象,但是他需要从IsolatedContext中获取所有的环境信息,所以他被限制在一个独立的测试环境中进行工作。所有的测试在测试用例类中运行来监测这个隔离的object。
你运行集成测试来测试Content Provider 和 instrumented 单元测试是同样的方式。为了运行对Content Provider的集成测试,遵从Run instrumented Unit Tests 描述的步骤。
测试什么内容
这儿有一些具体的Content Provider的测试指导方针:
- 使用resolver方法来测试:尽管你可以在ProviderTestCase2中实例化一个Provider对象,你应该经常使用合适的URI并借助解析器对象来进行测试。这样做来确保你测试Provider通过执行相同的交互,一个普通的应用程序将会使用的。
测试公共的Provider作为合约:如果你打算你的Provider作为公共的对象同时对其它的对象是可用的,你应该作为一个合约来测试它。下面的实例展示了如何来这样做:
- 测试你的Provider暴露的公开字段:比如,在一个Provider的数据表中查找一个字段他指向了一个列的名字。这些应该总是被定义在Provider中的公共字段。
- 测试你的Provider提供的所有URIs。你的Provider可能提供了各种不同的URIs,每个都指向不同部分的数据。
- 测试无效的URI :单元测试应该刻意调用带有无效URI的Provider,并查找错误。一个好的Provider的设计是对于无效的URI抛出一个IllegalArgumentException。
测试标准的Provider交互:许多Provider提供6中接入方式:query(), insert(), delete(), update(), getType(), 和 onCreate().你的测试应该验证所有的这些方法是否可以工作。这些方法在Content Providers中进行了详细的描述。
- 测试业务逻辑:如果Content Provider 实现了业务逻辑,你应该对它进行测试。业务逻辑包括处理无效值,财务或者是算术计算,消除或者重复的结合处理。