10、测试你的 Content Provider

来源:互联网 发布:山东职业学院网络 编辑:程序博客网 时间:2024/06/05 19:20

测试你的 Content Provider

如果您正在实现一个 content provider 来存储和获取数据或者使数据可以被其他应用访问,你应该测试你的 provider 来确保他不以意外的方式运行。这个课程描述了如何测试公共的 content providers,同样也适用于对自己应用保持私有的 providers。

创建 Content Providers 集成测试

在 Android 中,应用程序将 content providers 视为提供数据表的数据 APIs,并且其内部从视图中隐藏。一个 content provider 可能有很多公共的常量,但是如果公共方法没有公共变量,他通常很少。因为这个原因,你应该仅仅基于 provider 的公共成员编写测试。这样设计的 content provider 在其自身和用户之间提供一个契约。

Content providers 允许您访问实际的用户数据,因此确保您在独立的测试环境中测试您的 content provider 是非常重要的。这种方法仅允许在测试用例中明确设置的数据依赖项上运行。这同样意味着你的测试不能修改实际的用户数据。例如你应该避免编写失败的测试,因为之前的测试会遗留数据。童颜的,你的测试应该避免添加或者删除 provider 中实际的联系信息。

要想独立的测试你的 contnet provider,请使用 ProviderTestCase2 类。这个类允许你使用 Android mock 对象例如 IsolatedContext 和 MockContentResolver 来访问文件和数据库信息,而不会影响实际的用户数据。

你的集成测试应该被作为一个 JUnit 4 测试类编写。想要了解更多关于创建 JUnit 4 测试类和使用 JUnit 4 assertions,请看 创建一个本地的单元测试类。

要为您的 content provider 创建一个集成测试,你必须执行这些步骤:

  • 创建你的作为 ProviderTestCase2 的子类的测试类。

  • 在你的测试类定义的开头添加 @RunWith(AndroidJUnit4class) 注解。

  • 确认 Android 测试支持库提供的 AndroidJUnitRunner 类是你默认的测试运行器。测试入门 描述了更多关于这个步骤的内容。

  • 从 InstrumentationRegistry 类中设置 Context 对象。请看下面的示例代码片段:

@Overrideprotected void setUp() throws Exception {    super.setUp();    setContext(InstrumentationRegistry.getTargetContext());}

ProviderTestCase2 是如何工作的

你使用 ProviderTestCase2 的子类测试 provider。这个类继承自 AndroidTestCase,因此他提供了 JUnit 测试框架和用于测试应用权限的 Android 的指定方法。这个类最重要的特性是他的初始化,他创建了一个独立的测试环境。

初始化在 ProviderTestCase2 的构造函数中完成,
子类在他们自己的构造函数中调用。ProviderTestCase2 构造函数创建了一个 IsolatedContext 对象,它允许文件盒数据库操作,但是存在于 Android 系统的其他交互。文件和数据库操作本身发生在设备或者模拟器中本地的目录中,并且有一个特殊的前缀。

然后构造器创建了一个 MockContentResolver 作为测试的 resolver。

最后,构造器创建了一个被测试的 provider 的实例。这是一个普通的 ContentProvider 对象,但是它从 IsolatedContext 中获取所有的环境信息,因此他被限制在独立的测试环境中运行。所有在测试用例中完成的测试都是针对这个独立的对象运行的。

运行这个 content providers 的集成测试和 instrumented 单元测试的方式是相同的。要想运行你的 content provider 的集成测试,请按照 运行 Instrumented 单元测试 中描述的步骤。

要测试什么

下面是对测试 content providers 的一些具体的指导原则。

  • 用 resolver 方法测试:尽管你可以在 ProviderTestCase2 中实例化一个 provider 对象,但是你应该总是使用合适的 URI 来测试 resolver 对象。这样做事确保你通过执行与常规应用程序使用的相同交互来测试 provider 。

  • 测试一个公共的 provider 作为一个 contract :如果你打算将你的 provider 对其他应用程序公开并可用,你应该测试他作为一个 contract 。关于如何做到这一点的一些例子如下:

    • 使用 provider 公开暴露的常量进行测试。例如,查找一个引用 provider 数据表命名列的一个常量。这些应该总是由 provider 公开定义。

    • 测试你的 provider 提供的所有的 URIs. 你的 provider 可能会提供一些 URIs,每一个都指的数据的不同方面。

    • 测试无效的 URIs :你的单元测试应该故意的使用一个无效的 URI 调用 provider,然后查找错误。一个优秀的 provider 对无效的 URIs 将会抛出 IllegalArgumentException 异常。

  • 测试标准的 provider 交互:大多数的 providers 提供了六个访问方法:query( ) , insert( ) , delete( ) , update( ) , getType( ) , 和 onCreate( ) 。你的测试应该验证所有这些方法的松祚。这些方法在 Content Providers 里面有更多的细节的描述。

  • 测试业务逻辑:如果你的 content provider 实现了业务逻辑,你应该测试它。业务逻辑包括处理无效的数据,财务或者算术的计算,消除或者重复的合并。

原创粉丝点击