Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interface Android robotium testing with Teamcity

As this was not answered (Maybe did I not find it) previously, I investigated on the following question :

How to perform automated functional tests on Android devices with robotium, and report them to continuous integration server like TeamCity?

like image 585
Al_th Avatar asked May 17 '13 09:05

Al_th


1 Answers

As I did not find any answer on that specific question, I investigated. Here is the output of my investigation and a quick How-To in order to help people perform automated functional tests on Android applications using robotium, and then report the results to a continuous integration server like TeamCity. Please note that this may not be the best solution, but I felt that people might be in the same situation as me. So here it is !

The following libraries have been used :

  • Robotium (https://code.google.com/p/robotium/) : This is an Android test automation framework. It helps you to perform automated tests like click on buttons, fill text automatically, and a lot of other things.
  • Android Junit Report (http://zutubi.com/source/projects/android-junit-report/) : This library is very useful to publish test result to an exploitable xml format. If you want to run your tests through Eclipse, you will see the results of your tests on the go, but in order to export them, this library is very useful

Assuming that you have an Android project to test, create an Android Test Project (Eclipse does have a nice workflow to create it for you) and set it up to work with Robotium. A pretty clear detailed instruction on how to do it can be found here : https://code.google.com/p/robotium/wiki/Getting_Started

Then, you need to add Android Junit Report to your project in order to be able to fetch the results of your tests. In order to do so, add the Android Junit Report *.jar library in your lib folder and add it to your build path (in Eclipse : Project -> Properties -> Java Build Path -> Libraries -> Add External Jar).

You also have to change the test runner of your project. In the AndroidManifest.xml of your test project add the following :

<instrumentation
      android:name="com.zutubi.android.junitreport.JUnitReportTestRunner"
      android:targetPackage="<insert your package ex:com.alth.myproject" />

Once this is done, you should be able to run your tests properly. The results of the tests should be available in your device (in the following folder /data/data//files/junit-report.xml)


The next step is to configure your TeamCity build steps to perform all the different needed action to run your tests. Please note that my solution might not be the optimal one !

  • Build step 1 : Clean - Command Line runner - This build step may be optional depending of how you decide to create your build.xml files and such build decisions.

    rm -rf <report folder>
    rm -rf <Project build.xml>
    rm -rf <Test project build.xml>
    android update project -p <Path to your project>
    android update test-projecct -m <Path to your project, relative to the test project> -p <Path to your test project>
    
  • Build step 2 : Launch AVD - Command Line runner - This build step launches the android virtual device. This step may be optional if you decide to run the tests on an actual device.

    emulator -avd <nameOfYourAvd> -no-boot-anim &
    sleep 45
    

    The & avoids build to be interrupted by the virtual device launch (It is basic shell command). The sleep command is used to try to let the AVD be ready for the next build step

  • Build step 3 : Test app release - Ant runner : Build the test project, install it on the virtual device

    Path to build xml file : <Path to your test project>/build.xml
    Additional Ant command line parameters : -f <Path to your test project>/build.xml clean debug install -Dsdk.dir=<Path to your android sdk>
    
  • Build step 4 : AVD Unlock - Command line runner : Unlock the AVD screen for testing purpose

     bash avdUnlock.sh
    

    Body of avdUnlock.sh here : (http://pastie.org/7919761). This script is sending informations on regular AVD port in order to unlock the screen. This may be improved by sending the command only to a specific port and changing build step 2 to add a specific port to the emulator launch. This is however not really part of this how-to

  • Build step 5 : Launch tests - Command line runner : Launch the tests

     adb shell pm list instrumentation
     adb shell am instrument -w <insert your test package ex:com.alth.myproject.test>/com.zutubi.android.junitreport.JUnitReportTestRunner
    

    The first adb command could be removed. This is only for debug purpose in order to see which instrumentation has been installed on the device.

  • Build step 6 : Fetch tests - Command line runner : Retrieve tests report from the device

     adb pull /data/data/<insert your project package ex:com.alth.myproject>/files/junit-report.xml <report folder>/junit-report.xml
    
  • Build step 7 : Final emulator kill - Command line runner : Kill the running android virtual device

     adb emu kill
    
  • Additional Build Features : XML report processing - Report type : Ant JUnit

     Monitoring rules : <report folder>/*.xml
    

This How-to is clearly not optimal but answer the original question. Doing so, it is possible to fetch the android functional tests report and feed it to teamcity in order to monitore test results.

I hope this will help someone, and I would try to answer to your questions if you have some.

Al_th

like image 106
Al_th Avatar answered Oct 12 '22 11:10

Al_th