Glory to Russia
Glory to Russia

Reputation: 18712

How to run integration tests for a mavenised Android application?

I want to run some tests, which check, for example that activity A puts some piece of information into the intent, when it starts activity B.

Those tests require that there is Android infrastructure.

How can I implement them so that they can be run using Maven?

I tried

  1. to use akquinet archetype for this and use a separate Mave project for integration tests, but it never worked (my Robolectric test is not exeuted) and
  2. to run them in the same Maven project as the main app, which result in ClassNotFoundErrors caused by Robolectric (when I add Roboelectric to the dependencies, I can't mvn install my project because I get classpath-related errors for non-Robolectric classes).

Update 1 (23.08.2013): POM of the parent project:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>my-product-parent</artifactId>
    <version>1.3.0</version>
    <packaging>pom</packaging>
    <name>my-product - Parent</name>

    <modules>
        <module>my-product</module>
        <module>my-product-it</module>
    </modules>

    <properties>
        <platform.version> 4.1.1.4
                    </platform.version>
        <android.plugin.version>3.6.0</android.plugin.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android</artifactId>
                <version>${platform.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android-test</artifactId>
                <version>${platform.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                    <artifactId>android-maven-plugin</artifactId>
                    <version>${android.plugin.version}</version>
                    <configuration>
                        <sdk>
                            <platform>16</platform>
                        </sdk> 
                                            </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

POM of the actual app project:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mycompany</groupId>
        <artifactId>my-product-parent</artifactId>
        <version>1.3.0</version>
    </parent>

    <groupId>com.mycompany</groupId>
    <artifactId>my-product</artifactId>
    <version>1.4.0</version>
    <packaging>apk</packaging>
    <name>my-product - Application</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <powermock.version>1.5</powermock.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>${platform.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>some-library</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>commons</artifactId>
            <version>2.5</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.inject</groupId>
                    <artifactId>guice</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!-- Testing (start) -->
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-assert-core</artifactId>
            <version>2.0M8</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>

        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>

        <!-- Testing (end) -->
        <!-- Google Maps (start) -->
        <!-- 
        <dependency>
            <groupId>com.google.android.maps</groupId>
            <artifactId>maps</artifactId>
            <version>16_r3</version>
            <scope>provided</scope>
        </dependency>


 -->
        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>6</version>
            <type>apklib</type>
        </dependency>

        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>6</version>
            <type>jar</type>
        </dependency>
        <!-- Google Maps (end) -->
    </dependencies>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>

POM of the integration test project:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mycompany</groupId>
        <artifactId>my-product-parent</artifactId>
        <version>1.3.0</version>
    </parent>

    <artifactId>my-product-it</artifactId>
    <packaging>apk</packaging>
    <name>my-product-it - Integration tests</name>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android-test</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>my-product</artifactId>
            <type>apk</type>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>my-product</artifactId>
            <type>jar</type>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>                
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-assert-core</artifactId>
            <version>2.0M8</version>
        </dependency>

        <!-- Make sure this (robolectric dependency) is below the android dependencies -->
        <dependency>
            <groupId>com.pivotallabs</groupId>
            <artifactId>robolectric</artifactId>
            <version>1.0-RC4</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.inject</groupId>
                    <artifactId>guice</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.objenesis</groupId>
                    <artifactId>objenesis</artifactId>
                </exclusion>
                <!-- 
                <exclusion>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                </exclusion>
                 -->
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <configuration>
                    <test>
                        <!--<skip>true|false|auto</skip> -->
                        <!--<instrumentationPackage>packageName</instrumentationPackage> -->
                        `
                        <!--<instrumentationRunner>className</instrumentationRunner> -->
                        <!--<debug>true|false</debug> -->
                        <!--<coverage>true|false</coverage> -->
                        <!--<logonly>true|false</logonly> avd -->
                        <!--<testsize>small|medium|large</testsize> -->
                        <createReport>true</createReport>

                        <classes>
                            <class>com.mycompany.cb.android.test.AcceptInvitationActivityTest</class>
                        </classes>

                        <!--<classes> -->
                        <!--<class>your.package.name.YourTestClass</class> -->
                        <!--</classes> -->
                        <!--<packages> -->
                        <!--<package>your.package.name</package> -->
                        <!--</packages> -->
                    </test>
                </configuration>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>

Upvotes: 2

Views: 1167

Answers (2)

Marco RS
Marco RS

Reputation: 8245

This project integrates a lot of testing tools as well as code quality tools: https://github.com/stephanenicolas/Quality-Tools-for-Android

I wrote a bash script that generates a mavenized android project with robolectric, spoon and robotium configured: https://github.com/marsucsb/mvn-android-project

Upvotes: 1

krishnakumarp
krishnakumarp

Reputation: 9295

Do checkout Github Android App source code. https://github.com/github/android

This project has a very good maven setup with integration-tests. They use Roboguice and maven-android-plugin

Hope it helps.

Upvotes: 3

Related Questions