简体   繁体   中英

Writing Gradle script to run unit test cases for Eclipse Android Test project

I have a simple HelloWorld Android project (built in Eclipse IDE), I am able to do "gradle build" successfully in cmd prompt for this project.

Also I have written a simple JUnit Android Test Project for it, and it runs fine in Eclipse.

Now I want to run this Test Project or Unit Test Cases (if my understanding is wrong!) using Gradle script. How do I do that?

Following is the build.gradle file I am using. I want to know how to write script code to automate the test case execution.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        test {
            java.srcDirs = ['src/test/java']
            resources.srcDirs = ['src/test/resources']         
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')
        androidTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

Here is what I use:

android {
    // ...
    // your stuff
    // ...

    // So Android Studio can nicely edit the test files
    sourceSets {
        androidTest {
            java.srcDir file('src/test/java')
        }
    }
}

// <Task to run tests>
sourceSets {
    unitTest {
        java.srcDir file('src/test/java')
    }
}

configurations {
    unitTestCompile.extendsFrom runtime
    unitTestRuntime.extendsFrom unitTestCompile
}

task unitTest(type: Test, dependsOn: assemble) {
    description = "run unit tests"
    testClassesDir = project.sourceSets.unitTest.output.classesDir
    classpath = project.sourceSets.unitTest.runtimeClasspath
}

check.dependsOn unitTest
// </Task to run tests>

dependencies {
    // ...
    // compile stuff
    // ....

    unitTestCompile files("$project.buildDir/classes/release")
    unitTestCompile 'junit:junit:4.11'
 }

Run your test:

gradlew unitTest

This solution is not yet implemented and tested. Work in progress, comments are welcomed.

After reading all user guide carefully, it is clear that there is no direct support for Eclipse Android Test projects. The reason is that new build system adopts Gradle(and Maven) style to have Unit test inside module/project.

But because Eclipse Android Test projects is still Android project, there is way to try

  1. Add build.gradle see below to Eclipse Android Test project.
    It should have compile project(':app') in dependencies

     /* Android * http://www.nodeclipse.org/projects/gradle * Nodeclipse/Enide build.gradle template for classic Android project * https://github.com/Nodeclipse/nodeclipse-1/blob/master/org.nodeclipse.enide.editors.gradle/docs/android/build.gradle * Gradle Plugin User Guide: * http://tools.android.com/tech-docs/new-build-system/user-guide * Usage * 1. put in project root * 2. check version numbers * 3. use from command line or with Gradle for Android http://marketplace.eclipse.org/content/gradle * Support for this template * https://github.com/nodeclipse/nodeclipse-1/issues/ * History * 2014-03-13 android plugin updated to 0.9, see http://tools.android.com/tech-docs/new-build-system/migrating_to_09 * 2014-04-01 check for gradle version * 2014-04-10 wrapper and runAndroidApplication tasks * 2014-04-25 rename to run, add << * 2014-05-23 defaut plugin version 0.10.x * 2014-06-06 show "boilerplate part" * @author Paul Verest */ println GradleVersion.current().prettyPrint() assert gradle.gradleVersion >= "1.10" // android plugin 0.10 requires Gradle 1.10, 1.11, 1.12 // after `gradle wrapper` it is possible to use './gradlew build' with Gradle version specified task wrapper(type: Wrapper) { gradleVersion = '1.12' } //{ "boilerplate part" buildscript { repositories { mavenCentral() //jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.10.+' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') //androidTestCompile 'com.jayway.android.robotium:robotium-solo:4.3.1' // for multi-module project build (needs `settings.gradle`): // reference needed modules or App under test (for Eclipse Android Test project) compile project(':app') } android { compileSdkVersion 19 buildToolsVersion "19.0.3" sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } // Move the tests to tests/java, tests/res, etc... androidTest.setRoot('tests') // Move the build types to build-types/<type> // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src/<type>/... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization. debug.setRoot('build-types/debug') release.setRoot('build-types/release') } } //} "boilerplate part" 
  2. Because app and its test now make multi-module project add settings.gradle . The easiest way to put it 1 level down (folder where both project are)

     include ':app' include ':apptest' 

    Other way is to put in sibling folder, eg called parent

     includeFlat 'app' includeFlat 'apptest' 

    In later case you would need to run build from that folder (or specify each time settings.gradle location with -c CLI option

UPDATE Doing research about pure JUnit tests with gradle (a bit offtopic for this question), it seems like Android Tooling team overlooks this question, breaking what others developers are trying to do with newer android gradle plugin. Even in Android Studio it is not so even How can I create tests in Android Studio? . The only orgnization that cares is Robolectric contributors that have its framework ready for pure JUnit testing https://github.com/robolectric/gradle-android-test-plugin

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM