Auto-tools/Projects/Robocop

< Auto-tools‎ | Projects
Revision as of 17:05, 21 December 2014 by Edmorley (talk | contribs) (Bug 1082602)

Introduction

Robocop provides UI-level testing for Firefox for Android. It is based on Google's Robotium test automation framework for Android. Robocop uses Robotium to inject events into the Java front-end of Firefox for Android and to monitor and verify Firefox events and UI views.

Related source code is maintained on mozilla-central:

  • test source code in mobile/android/base/tests
  • Robocop source in build/mobile/robocop

Robocop-based UI functionality tests are run with the mochitest test harness and appear on Treeherder under the symbols rc1 and rc2.

Robocop-based performance tests are run with the Talos test harness and appear on Treeherder under the symbols rck, rck2, rp, and rpr.

Setup

Step one: Build Fennec

Step two: Build Firefox (Necessary for XPCShell)

Follow these instructions to build Firefox for desktop, just so that you can build xpcshell.

(mcomella, 2/4/14: Unable to do the following via OS X or Arch Linux - various dynamic libraries are unable to be found)

As an alternative, you can download a "tests" zip from a current build for your platform from here, such as ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla-central/firefox-23.0a1.en-US.linux-i686.tests.zip -- unzip and find xpcshell.

Running tests

Set up the MOZ_HOST_BIN environment variable

The MOZ_HOST_BIN variable will need to be set to the directory with XPCShell on your machine. You can execute the following command in the terminal, or it can be saved into .bashrc / .bash_profile for convinence:

export MOZ_HOST_BIN=/ABSOLUTE/PATH/TO/FIREFOX/SOURCE/{objdir}/dist/bin

If you're having difficulty finding the absolute path of XPCShell's directory, simply locate XPCShell in your {objdir}/dist/bin and execute the command pwd .

Again, {objdir} is a placeholder.

Running all the tests

From the root directory:

./mach build build/mobile/robocop
./mach robocop

Some notes for running tests:

  • Your device screen should be turned on — otherwise some tests may fail.
  • To run tests that load a page from the desktop host without timing out, both the test device and desktop host must be on the same network (e.g., device can't be on 3G).

Running a single test

From the root directory:

./mach robocop <test-name>

where <test-name> would be a test name such as "testLoad":

./mach robocop testLoad

See also https://wiki.mozilla.org/Mobile/Fennec/Android#Testing and https://wiki.mozilla.org/Mobile/Fennec/Android#Robocop for advanced options.

Updating your test directory

It is not always necessary to rebuild Fennec to use new tests. If you are updating the build with your own test, ensure that your test has been added to the manifest in /PATH/TO/FENNEC/SOURCE/mobile/android/base/tests/robocop.ini .

Otherwise, you can retrieve tests from the repository by executing:

hg pull
hg update

Now you can build the robocop part of Fennec by executing:

cd objdir
make -C build/mobile/robocop/
make package 

Frequently found errors

If you do not see your specific error below, it can sometimes help to uninstall and reinstall. To do this (and run the tests):

adb uninstall org.mozilla.roboexample.test
make -C $OBJDIR mochitest-robocop

OOM Error

This is an error found after use of Robocop frequently, but once it has happened, Fennec itself continues to crash. To fix it, simply uninstall and reinstall. This does not occur of frequent use of Robocop, as I have run 30 iterations of just robocop without it throwing this error.

InvocationTargetException Error

This is an issue arising when using a Tegra.It looks like the following:

W/System.err( 2610): java.lang.reflect.InvocationTargetException
W/System.err( 2610): at org.mozilla.gecko.GeckoAppShell.unregisterGeckoEventListener(GeckoAppShell.java:1565)
...

Build Error

This is resolved by doing a clean build.

make[7]: Entering directory `/media/sdan/birch/objdir-native-droid/mobile/android/base/locales'
make[7]: Leaving directory `/media/sdan/birch/objdir-native-droid/mobile/android/base/locales'
res/values/strings.xml:1: error: Error parsing XML: no element found
res/layout/awesomebar_search.xml:9: error: Error: No resource found that matches the given name (at 'hint' with value '@string/awesomebar_default_text').
res/layout-v11/awesomebar_search.xml:9: error: Error: No resource found that matches the given name (at 'hint' with value '@string/awesomebar_default_text').
res/layout/browser_toolbar.xml:7: error: Error: No resource found that matches the given name (at 'hint' with value '@string/awesomebar_default_text').
res/layout/crash_reporter.xml:6: error: Error: No resource found that matches the given name (at 'text' with value '@string/crash_message').
res/layout/crash_reporter.xml:14: error: Error: No resource found that matches the given name (at 'text' with value '@string/crash_help_message').
res/layout/crash_reporter.xml:21: error: Error: No resource found that matches the given name (at 'text' with value '@string/crash_send_report_message').
...

Infrequent Runtime Errors

Two have been known to occur: One, where Fennec freezes when loading a page, the other where the page loads, but has 0 content. These are worked around by restarting the test.

What happens when a test is run

Our tests are run from the talos and mochitest scripts. These rely on devicemanager and other scripts/tools in the harness directory. Here is what happens:

  • create a [fresh profile] and copy it to the device (/mnt/sdcard/tests/profile)
  • we generate robotium.config and push it to the device
$ adb shell cat /mnt/sdcard/tests/robotium.config
profile=/mnt/sdcard/tests/profile            # from the first step
logfile=/mnt/sdcard/tests/logs/mochitest.log # where robocop will write logs to
host=http://mochi.test:8888/tests            # mochi.test is defined in the profile proxy auto config
rawhost=http://192.168.1.73:8888/tests       # used for some tests
  • we push fennec_ids.txt to the device (/mnt/sdcard/tests/fennec_ids.txt)
  • for each test case, in [robocop.ini] we launch fennec. Here is an example of the first test case testallpagesTab:
am instrument -w -e deviceroot /mnt/sdcard/tests -e class org.mozilla.fennec.tests.testAllPagesTab org.mozilla.roboexample.test/org.mozilla.fennec.FennecInstrumentationTestRunner

Notes

  • If you are writing tests for Robocop, see Writing Tests for more general API information and UITest for details on using the current testing framework
  • We are using [NativeUI Messages] to talk between Robocop and gecko
  • There has been interest in using a record/replay tool similar to [testdroid]. Most likely this will allow for people to record something and then we can hand edit it into a proper test case.
  • adb shell am instrument -w org.mozilla.roboexample.test/android.test.InstrumentationTestRunner
  • Trevor's Presentation on it can be found in [This zip]
  • For documentation of the Robocop Talos performance tests, see Buildbot/Talos/Tests#Robocop