现在的位置: 首页 > 综合 > 正文

Android Content Provider 测试

2014年10月28日 ⁄ 综合 ⁄ 共 5867字 ⁄ 字号 评论关闭

Content Provider Testing

Content providers, which store and retrieve data and make it accessible across applications, are a key part of the Android API. As an application developer you're allowed to provide your own public providers for use by other applications. If you do, then
you should test them using the API you publish.

This document describes how to test public content providers, although the information is also applicable to providers that you keep private to your own application. If you aren't familiar with content providers or the Android testing framework, please read

Content Providers
, the guide to developing content providers, and
Testing Fundamentals
, the introduction to the Android testing and instrumentation framework.

Content Provider Design and Testing

In Android, content providers are viewed externally as data APIs that provide tables of data, with their internals hidden from view. A content provider may have many public constants, but it usually has few if any public methods and no public variables.
This suggests that you should write your tests based only on the provider's public members. A content provider that is designed like this is offering a contract between itself and its users.

The base test case class for content providers, ProviderTestCase2, allows you to test your content provider in an isolated environment. Android mock objects
such as IsolatedContext and
MockContentResolver also help provide an isolated test environment.

As with other Android tests, provider test packages are run under the control of the test runner
InstrumentationTestRunner. The section

Running Tests With InstrumentationTestRunner
describes the test runner in more detail. The topic

Testing in Eclipse, with ADT
shows you how to run a test package in Eclipse, and the topic

Testing in Other IDEs
shows you how to run a test package from the command line.

Content Provider Testing API

The main focus of the provider testing API is to provide an isolated testing environment. This ensures that tests always run against data dependencies set explicitly in the test case. It also prevents tests from modifying actual user data. For example, you
want to avoid writing a test that fails because there was data left over from a previous test, and you want to avoid adding or deleting contact information in a actual provider.

The test case class and mock object classes for provider testing set up this isolated testing environment for you.

ProviderTestCase2

You test a provider with a subclass of ProviderTestCase2. This base class extends
AndroidTestCase, so it provides the JUnit testing framework as well as Android-specific methods for testing application permissions. The most important feature
of this class is its initialization, which creates the isolated test environment.

The initialization is done in the constructor for ProviderTestCase2, which subclasses call in their own constructors. The
ProviderTestCase2 constructor creates an
IsolatedContext object that allows file and database operations but stubs out other interactions with the Android system. The file and database operations themselves
take place in a directory that is local to the device or emulator and has a special prefix.

The constructor then creates a MockContentResolver to use as the resolver for the test. The
MockContentResolver class is described in detail in the section

Mock objectclasses
.

Lastly, the constructor creates an instance of the provider under test. This is a normal
ContentProvider object, but it takes all of its environment information from the
IsolatedContext, so it is restricted to working in the isolated test environment. All of the tests done in the test case class run against this isolated object.

Mock object classes

ProviderTestCase2 uses
IsolatedContext and
MockContentResolver, which are standard mock object classes. To learn more about them, please read

Testing Fundamentals
.

What To Test

The topic
What To Test
lists general considerations for testing Android components. Here are some specific guidelines for testing content providers.

  • Test with resolver methods: Even though you can instantiate a provider object in
    ProviderTestCase2, you should always test with a resolver object using the appropriate URI. This ensures that you are testing the provider using the same interaction
    that a regular application would use.
  • Test a public provider as a contract: If you intent your provider to be public and available to other applications, you should test it as a contract. This includes the following ideas:
    • Test with constants that your provider publicly exposes. For example, look for constants that refer to column names in one of the provider's data tables. These should always be constants publicly defined by the provider.
    • Test all the URIs offered by your provider. Your provider may offer several URIs, each one referring to a different aspect of the data. The
      Note Pad sample, for example, features a provider that offers one URI for retrieving a list of notes, another for retrieving an individual note by it's database ID, and a third
      for displaying notes in a live folder.
    • Test invalid URIs: Your unit tests should deliberately call the provider with an invalid URI, and look for errors. Good provider design is to throw an IllegalArgumentException for invalid URIs.
  • Test the standard provider interactions: Most providers offer six access methods: query, insert, delete, update, getType, and onCreate(). Your tests should verify that all of these methods work. These are described in more detail in the topic

    Content Providers
    .
  • Test business logic: Don't forget to test the business logic that your provider should enforce. Business logic includes handling of invalid values, financial or arithmetic calculations, elimination or combining of duplicates, and so forth. A content provider
    does not have to have business logic, because it may be implemented by activities that modify the data. If the provider does implement business logic, you should test it.

Next Steps

To learn how to set up and run tests in Eclipse, please refer to
Testing in Eclipse, with ADT
. If you're not working in Eclipse, refer to
Testing in Other IDEs
.

If you want a step-by-step introduction to testing activities, try one of the testing tutorials:

  • The
    Hello, Testing
    tutorial introduces basic testing concepts and procedures in the context of the Hello, World application.
  • The
    Activity Testing
    tutorial is an excellent follow-up to the Hello, Testing tutorial. It guides you through a more complex testing scenario that you develop against a more realistic activity-oriented application

抱歉!评论已关闭.