Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Testing with Robolectric and ANT

I’m working on setting up Robolectric in a continuous build environment, and I have some problems setting it all up.

My android Eclipse project structure consists of an android project and a JUnit4 test project as described in the Robolectric “Quick Start for Eclipse” quick guide. My sample tests works fine from within Eclipse, but I need to be able to test with ant also. How would I build my ANT build.xml to support this? and how should I apply the same changes that are done with the Eclipse test project?

I’ve been looking into the build.xml file of the RobolectricSample project, but that consists of a single project with both production and test code located under the projects src folder. I understand this is how maven assumes things are (???), but I’d like to go for ANT only.

like image 457
Per Erik Gransøe Avatar asked Mar 14 '12 11:03

Per Erik Gransøe


1 Answers

This is old but hopefully this helps someone else. I've done this recently...robolectric, mockito, Jenkins, and ant. Here is the ant build script that I run. Basically you just need to setup the path to your libraries and setup a target to start the test. I also copy the android.jar file and the maps.jar file in the lib folder of the test project, this seems to make life easier but perhaps you can do it some better way.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project name="unit_tests" default="test-report-junit" basedir=".">
<description>
    Sample Robolectric Ant Build
</description>

<!-- set global properties for this build, if you have libraries, include them here with a relative path...I have samples as library1, library2, library3, located on the same level as your project, but you  may need to modified this to get it to work for your setup. -->

<property name="libs.dir" value="./lib/"/>
<property name="build.dir" value="./build/"/>
<property name="android.library1.classpath" value="./../../library1/bin/classes/"/>
<property name="android.library2.classpath" value="./../../library2/bin/classes/"/> 
<property name="android.library3.classpath" value="./../../library3/bin/classes/"/>     
<property name="test.report.dir" value="./test-reports/"/>
<property name="test.html.dir" value="./test-report-html/"/>
<property name="source.dir" value="./src/"/>    

<filelist id="android_jars" dir="${libs.dir}">
    <file name="android.jar"/>
    <file name="maps.jar"/>
</filelist>

<filelist id="libs_jars" dir="${libs.dir}">
    <file name="junit.jar"/>
    <file name="hamcrest.jar"/>
    <file name="json.jar"/>
    <file name="google-play-services.jar"/>
    <file name="mockito-all-1.9.5.jar"/>
    <file name="robolectric-1.1-jar-with-dependencies.jar"/>
</filelist>

<path id="compile_classpath">
    <filelist refid="libs_jars"/>
    <filelist refid="android_jars"/>
    <pathelement path="${android.project.classpath}"/>
    <pathelement path="${android.library1.classpath}"/>
    <pathelement path="${android.library2.classpath}"/>
    <pathelement path="${android.library3.classpath}"/>
    <pathelement path="${build.dir}"/>
</path>

<path id="junit_classpath">
    <pathelement path="${build.dir}"/>
    <pathelement path="${android.library1.classpath}"/>
    <pathelement path="${android.library2.classpath}"/>
    <pathelement path="${android.library3.classpath}"/>

    <!-- NOTE: junit.jar must come before android.jar! -->
    <filelist refid="libs_jars"/>
    <filelist refid="android_jars"/>
</path>

<!-- targets -->

<target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <mkdir dir="${build.dir}"/>
</target>

<target name="compile" depends="init" description="compile test source">
    <javac srcdir="${source.dir}" destdir="${build.dir}" debug="true" >
        <classpath refid="compile_classpath" />
    </javac>

    <copy todir="build">
        <fileset dir="src" includes="**/*.xml,**/*.properties,**/*.txt,**/*.ico" />
    </copy>
</target>

<target name="test-run" depends="compile" description="Run JUnit tests">
    <mkdir dir="${test.report.dir}"/>
    <echo message="Running JUnit Tests in directory ${source.dir}..."/>
    <junit showoutput="true" printsummary="yes" failureproperty="junit.failure" fork="yes" forkmode="once" maxmemory="512m">
        <formatter type="plain"/>
        <formatter type="xml"/>
        <batchtest todir="${test.report.dir}">
            <fileset dir="${source.dir}">
                <include name="**/*Test.java"/>
            </fileset>
        </batchtest>
        <classpath refid="junit_classpath"/>
    </junit>
    <fail if="junit.failure" message="Unit test(s) failed. See reports!"/>
</target>

<target name="test-report-junit" depends="test-run" description="Generate JUnit HTML reports">
    <mkdir dir="${test.html.dir}"/>
    <junitreport todir="${test.report.dir}">
        <fileset dir="${test.report.dir}" includes="TEST-*.xml"/>
        <report format="frames" todir="${test.html.dir}"/>
    </junitreport>  
</target>

<target name="clean" description="Clean Up" >
    <delete dir="${build.dir}"/>
    <delete dir="${test.report.dir}"/>
    <delete dir="${test.html.dir}"/>
    <delete file="${basedir}/tmp/cached-robolectric-classes.jar"/>
</target>
</project>

Finally, I run the following command from Jenkins to get it all started:

ant -f ./build-ant.xml test-report-junit
like image 151
SpecialEd Avatar answered Nov 16 '22 20:11

SpecialEd