编写Gradle脚本以运行Eclipse Android Test项目的单元测试用例

时间:2014-05-09 06:27:28

标签: android eclipse gradle

我有一个简单的HelloWorld Android项目(内置于Eclipse IDE中),我能够在cmd提示符下为此项目成功执行“gradle build”。

我也为它编写了一个简单的JUnit Android测试项目,它在Eclipse中运行良好。

现在我想使用Gradle脚本运行此测试项目或单元测试用例(如果我的理解是错误的!)。     我该怎么做?

以下是我正在使用的build.gradle文件。我想知道如何编写脚本代码来自动执行测试用例。

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')
    }
}

2 个答案:

答案 0 :(得分:0)

以下是我使用的内容:

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'
 }

运行测试:

gradlew unitTest

答案 1 :(得分:0)

此解决方案尚未实施和测试。正在进行的工作,欢迎提出意见。

仔细阅读所有user guide之后,显然没有对Eclipse Android Test项目的直接支持。原因是新构建系统采用Gradle(和Maven)样式在模块/项目中进行单元测试。

但是因为Eclipse Android Test项目仍然是Android项目,所以有办法尝试

  1. build.gradle添加到Eclipse Android Test项目中 它应该在compile project(':app')

    中有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. 因为app及其测试现在使多模块项目添加settings.gradle。将它降低1级的最简单方法(两个项目都在的文件夹)

    include ':app'  
    include ':apptest'
    

    其他方式是放入兄弟文件夹,例如叫parent

    includeFlat 'app'
    includeFlat 'apptest'
    

    在以后的情况下,您需要从该文件夹运行构建(或使用settings.gradle CLI option每次-c位置指定

  3. 更新使用gradle进行纯JUnit测试的研究(对于这个问题有点偏离主题),似乎Android Tooling团队忽略了这个问题,打破了其他开发人员试图用更新的android gradle插件做的事情。即使在Android Studio中,它也不是How can I create tests in Android Studio?。关注的唯一组织是Robolectric贡献者,其框架已准备好进行纯JUnit测试https://github.com/robolectric/gradle-android-test-plugin