测试你的Content Provider

本文翻译自: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 实现了业务逻辑,你应该对它进行测试。业务逻辑包括处理无效值,财务或者是算术计算,消除或者重复的结合处理。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值