/brazenhead

Low-level driver for instrumenting Android applications.

Primary LanguageJavaMIT LicenseMIT

Brazenhead

Build Status Coverage Status

A low-level driver for testing android applications.

Basic Usage

Brazenhead works by modifying your Android application (apk). Once modified and installed in an emulator or device, brazenhead can send request to the emulator or device and cause it to interact with your application via the Robotium API.

Prerequisites

Before being able to instrument your application, you will need to add the INTERNET permission to your AndroidManifest.xml.

<uses-permission android:name="android.permission.INTERNET" />

You must also have adb in your path

Starting Instrumentation

To start instrumenting an application you must create an instance of the Brazenhead::Server by giving it the path to your android application (apk) an optionally some keystore information. (note: If no keystore information is provided, the debug.keystore will be used instead.)

require 'brazenhead/server'

# using the debug.keystore
server = Brazenhead::Server.new "some/path/to/my.apk"

Now that you have a server instance, you can simply start any activity by giving it the name of the activity. brazenhead will assume that it is a relative path based on the package name of your application. If the package of your application is com.example.some.awesome.app, you can simply start the activity at com.example.some.awesome.app.text.Flashy like so:

# create the server instance
server = Brazenhead::Server.new "some/path/to/my.apk"

#start the activity
server.start "text.Flashy"

Stopping Tests

Stopping the server instance is just as easy. Simply issue the following to stop the test server:

server.stop

Sending Commands

Messages sent to the emulator are json messages and must take the form of

{ 
  name: 'theMethodName',  # The Robotium method to call
  arguments: [1, 2, 3],   # The arguments to be passed to the Robotium method
  variable: "@@variable_name_to_store_the_results@@",  # optional parameter to store the results 
                                                       # of a call - can be used in subsequent calls
  target:  'Robotium'     # optional parameter.  Valid values are 'Robotium', 'Brazenhead' or 'LastResultOrRobotium'
}

The variable parameter can be used in subsequent calls as an argument value.

In addition to a server process there is a ruby module that will build the json for you when you call corresponding methods. Let's take a look at a few examples of how this works.

You can include the Brazenhead module in your class to provide the abilities.

class MyClass
  include Brazenhead
end

Once you do this you can call methods on an instance of MyClass. These methods look like this:

Calling a single method

my_class.scroll_down  # call the scrollDown method on Robotium

You can also pass parameters to methods like this:

my_class.click_on_text('Content')  # will call the method clickOnText passing 'Content'

Calling multiple methods

my_class.chain_calls do |driver|
  driver.scroll_down                         # call scrollDown first
  driver.scroll_up({:target => 'Robotium'})  # then call scrollUp
end

In the case above we had to pass a target value to inform the server that we wished to make the second call directly on Robotium instead of on the return call from the previous call. You can easily make the second call on the return value from the first call like this:

my_class.chain_calls do |driver|
  driver.get_current_list_views
  driver.size
end
my_class.last_response.body.should == '1'

In the above example the size method is called on the result of the call to getCurrentListViews. If you want to use the result of a previous call as an argument in another call you can do this:

my_class.chain_calls do |driver|
  driver.get_text('Graphics', {:variable => "@@graphics@@"})
  driver.click_on_view("@@graphics@@", {:target => 'Robotium'})
end

In this final case we saved the result of the first call into a variable named "@@graphics@@" and used it as an argument in the second call.

Known Issues

See http://github.com/leandog/brazenhead/issues

Contribute

  • Fork the project.
  • Test drive your feature addition or bug fix. Adding specs is important and I will not accept a pull request that does not have tests.
  • Make sure you describe your new feature with a cucumber scenario.
  • Make sure you provide RDoc comments for any new public method you add. Remember, others will be using this gem.
  • Commit, do not mess with Rakefile, version, or ChangeLog. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright (c) 2012 Jeffrey S. Morgan, Levi Wilson. See LICENSE for details.