ContentProvider测试
ContentProvider是Android API的一个重要部分,它存贮和检索数据,使得数据可以跨应用程序访问。作为一个应用程序开发者,你可以提供自己的公共prividers给其他应用程序使用。如果你这样做了,那你应该使用你发布的API来测试他们。
该文档描述了如何测试公共的ContentProvider,但是也同样适用于应用程序私有的providers。如果你不熟悉ContentProvider或者Android测试框架,请先阅读ContentProvider和测试基本原理的介绍。
ContentProvider设计和测试
在Android中,ContentProvider是作为提供数据表的数据API来使得内部的数据数据外部可见的。ContentProvider可能有许多公共常量,但是他通常仅有少数几个公共方法并且没有公共变量。所以你应该只基于provider的公共方法 来编写测试。ContentProvider被设计成就像是在自己和自己的用户之间提供一种约定。
ProviderTestCase2是ContentProvider的基础测试用例类,允许你在一个独立的环境中测试你的ContentProvider。Android虚拟对象如IsolateContext和MockContentResolver也帮助提供一个独立的测试环境。
与其他android测试一样,provider测试包运行在InstrumentationTestRunner测试运行系的控制下。“用InstrumentationTestRunner运行测试”部分详细描述了测试运行器。
ContentProvider测试API
ContentProvider测试API主要提供一个独立的测试环境。这样就确保测试不依赖于数据,同时避免测试修改实际用户数据。例如,你想避免由于前一个测试删除了所有数据而是测试失败,或者你想避免在一个实际的provider中添加加或删除通讯录信息。
下面为provider提供的这个测试用例类和虚拟对象类为你建立一个独立的测试环境。
ProviderTestCase2
你用ProviderTestCase2的一个子类来测试ContentProvider。这个基础类是对AndroidTestCase的扩展,所以他提供了JUnit测试框架,同时提供了Android特有的方法来测试应用程序权限。该类最重要的特性是他的初始化,创建了一个独立的测试环境。
ProviderTestCase2在构造方法里完成初始化,继承它的子类应该在自己的构造方法里调用父类的构造方法。ProviderTestCase2构造方法创建了一个IsolatedContext对象,该对象允许文件和数据库操作,但是其他的交互交由Android系统。文件和数据库操作发生在设备或模拟器的一个目录里并且有一个特殊的前缀。
构造方法接下来创建一个MockContentResolver对象作为测试的resolver来使用。MockContentResolver类在“虚拟对象类”部分做了详细描述。
最后,构造方法创建一个要测试的Provider的实例。这是一个标准的ContentProvider对象,但是使用的是IsolatedContext的环境信息,所以它受到所在的独立测试环境的限制。左右测试用例类里的测试都依靠这个独立对象运行。
虚拟对象类
ProviderTestCase2使用IsolatedContex和MockContentResolver这两个标准的虚拟对象类。了解更多请看测试基本原理。
测试什么
测试什么主题列举了测试Android组件通常要考虑的方面。这里是一些针对测试ContentProvider的指导:
l 用resolver方法测试:虽然你可以在ProviderTestCase2中实例化一个provider对象,但是你应该总是使用合适的URI通过resolver对象来进行测试。这样确保了你的测试跟正规的应用程序使用同样的方式来使用provider。
l 作为契约测试公共provider:如果你想让你的provider成功公共的并被其他应用程序使用,你应该作为合同测试他。这包含以下概念:
l 用你的provider暴露的常量测试。例如寻找引用provider数据表中列明的常量。这些应该总是被provider定义为公共常量。
l 测试所有provider提供的的URI。你的provider可能提供了几个URI,每个URI指向数据的不同方面。例如,NotePad例子中,provider提供一个URI来检索notes列表,另一个URI通过数据库ID来检索单独的note,还有一个URI用来显示文件夹里的notes。
l 测试无效的URI:你的单元测试应该故意通过一个无效的URI来调用provider,并查看错误。好的provider设计会抛出一个非法参数异常。
l 测试标准的provider交互:大部分provider提供六个访问方法:query、insert、delete、update、getType和onCreate()。你的测试应该验证所有这些方法都正确工作。在“ContentProvider”主题中有详细描述。
l 测试业务逻辑:别忘了测试provider执行的业务逻辑。业务逻辑包括处理非法值、算术运算、副本的消除与合并等等。ContentProvider不一定有业务逻辑,因为他可能通过acivity修改数据来实现了。如果provider实现了业务逻辑你就应该测试他