Android,Gradle。如何构建应用程序并从测试应用程序运行测试 [英] Android, Gradle. How to build application and run tests from test application

查看:162
本文介绍了Android,Gradle。如何构建应用程序并从测试应用程序运行测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有android项目和android测试项目,它位于文件夹测试下。这些项目的结构是类似于eclipse的

+ - src

| - res

| - libs

| - 测试

| .....



我使用gradle。我想要的只是构建应用程序,运行单元测试并获取它们的报告。但我不明白如何做对。我在根文件夹中创建了build.gradle文件

  buildscript {
repositories {
mavenCentral()
}
依赖关系{
classpath'com.android.tools.build:gradle:0.5.+'
}
}

apply插件:'android'

android {
compileSdkVersion 18
buildToolsVersion18.1.1
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageNameua.cooperok.stringcalc.tests
testInstrumentationRunnerandroid.test.InstrumentationTestRunner
}
sourceSets {
main {
manifest.srcFile' AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['asset s']
}
unitTest {
java.srcDir文件('tests / src')
resources.srcDir文件('tests / res')
}
}

配置{
unitTestCompile.extendsFrom运行时
unitTestRuntime.extendsFrom unitTestCompile
}

依赖关系{
unitTestCompile文件($ project.buildDir / classes / release)
}

任务unitTest(类型:Test){
description =运行单元测试...
testClassesDir = android.sourceSets.unitTest.output.classesDir
classpath = android.sourceSets.unitTest.runtimeClasspath
}

build.dependsOn unitTest

}

但是当我运行 gradle build 时,出现错误

无法在源集单元测试中找到属性'输出'。



另外,据我所知,为了得到我需要的报告应用插件android-rep orting,但是当我这样做时,我得到了错误

无法添加名为'android'的扩展名,因为有一个扩展名已经注册了该名称。



我应该这样做,还是必须在我的测试应用程序项目中创建新的gradle.build文件?

UPDATE



我修正了输出错误,并使gradle build成功,但我不明白是什么原因。我故意失败了我的测试,但gradle构建仍然成功。

我所做的:

1.我将任务unitTest从android部分移至root,之后,我的测试项目开始编译,但有一个错误'packackage android.test未找到'

2.为了解决我添加到android源码的classpath路径的错误,所以在gradle build成功之后,我不明白为什么它总是成功,即使在测试失败时也是如此。



我仍然不明白如何从测试中获取报告。

这是我的新build.gradle文件

  buildscript {
repositories {
mavenCentral()
}
依赖关系{
classpath'com.android.tools.build:gradle:0.6+'
}
}

apply插件:'android'

android {
compileSdkVersion 18
buildToolsVersion18.1.1
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageNameua.cooperok.stringcalc.tests
testInstrumentationRunnerandroid.test.InstrumentationTestRunner
}
sourceSets {
main {
manifest .srcFile文件('AndroidManifest.xml')
java.srcDirs = ['src']
resources.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
依赖关系{
编译fileTree(dir:'libs',include:'* .jar')


$ b $ sourceSets {
unitTest {
java.srcDirs = ['tests / src']
resources.srcDirs = [' tests / src']
}
}

配置{
unitTestCompile.extendsFrom运行时
unitTestRuntime.extendsFrom unitTestCompile
}

依赖关系{
unitTestCompile文件($ project.buildDir / classes / release)
unitTestCompile'junit:junit:4.11'
编译fileTree(dir:'libs',包括:'* .jar')
}

任务unitTest(类型:Test, dependsOn:assemble){
description =运行单元测试
testClassesDir = sourceSets.unitTest.output.classesDir
classpath = files($ System.env.ANDROID_HOME / sources / android-18 )
// actualy我没有得到任何报告
getReports()。getJunitXml()。setOutputPerTestCase(true)
}

build.dependsOn unitTest


解决方案

我找到了解决方案。我很少被几个主题所厌倦,并认为我需要为单元测试创​​建单独的任务。实际上它很简单。

我没有改变我的项目结构,只是build.gradle文件。为了构建应用程序,我运行

gradle clean connectedCheck build
$ b $ connectedCheck从我的测试项目运行单元测试,如果某些测试失败 - gradle build也会失败



这里的最终版本

  buildscript {
存储库{
mavenCentral()
}
依赖项{
classpath'com.android.tools.build:gradle:0.6+'
}
}

apply插件:'android'

android {
compileSdkVersion 18
buildToolsVersion18.1.1
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
testPackageNameua.cooperok.stringcalc.tests
testInstrumentationRunnerandroid.test.InstrumentationTestRunner
}
sourceSets {
main {
manifest.srcFile文件('AndroidManifest.xml')
java.srcDirs = ['src']
resources.s rcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest {
java。 srcDirs = ['tests / src']
manifest.srcFile文件('tests / AndroidManifest.xml')
resources.srcDirs = ['tests / src']
res.srcDirs = [ 'tests / res']
assets.srcDirs = ['tests / assets']
}
}
依赖项{
编译fileTree(dir:'libs',包括:'* .jar')
}

// Signing apk
if(project.hasProperty(signingPropertiesPath)){
File propsFile = new File (){
属性props = new Properties()$ b $($ HOME $)+/+ project.property(signingPropertiesPath))
if(propsFile.exists()) b props.load(新FileInputStream(propsFile))

//加载密钥库属性
sign ingConfigs {
release {
storeFile文件(propsFile.getParent()+/+ props ['keystore'])
storePassword props ['keystore.password']
keyAlias道具['keyAlias']
keyPassword道具['keyPassword']
}
}
buildTypes {
版本{
signingConfig signingConfigs.release
}
}
}
}
}


I have android project and android test project inside it, located under folder tests. Structure of these project is eclipse like

+-src
| - res
| - libs
| - tests
|.....

I use gradle. All i want is to build app, run unit tests and get reports of them. But i don't understand how to do it right. I'm created build.gradle file in root folder

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

apply plugin: 'android'

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 18
        testPackageName "ua.cooperok.stringcalc.tests"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        unitTest {
            java.srcDir file('tests/src')
            resources.srcDir file('tests/res')
        }
    }

    configurations {
        unitTestCompile.extendsFrom runtime
        unitTestRuntime.extendsFrom unitTestCompile
    }

    dependencies {
        unitTestCompile files("$project.buildDir/classes/release")
    }

    task unitTest(type:Test){
        description = "Run unit tests..."
        testClassesDir = android.sourceSets.unitTest.output.classesDir
        classpath = android.sourceSets.unitTest.runtimeClasspath
    }

    build.dependsOn unitTest

}

But when i run gradle build i got error
Could not find property 'output' on source set unit test.

Also, as i understand, to get reports i need to apply plugin "android-reporting", but when i do this i got error
Cannot add extension with name 'android', as there is an extension already registered with that name.

Should i do it like this, or i must create new gradle.build file in my test application project?

UPDATE

I fixed error with output, and made gradle build successful, but I don't understand what's goind on. I purposely failed my test, but gradle build is still successful.
What I've done:
1. I moved task unitTest from android section to root, after that, my test project began to compile, but there is an error 'packackage android.test not found'
2. To fix that error I added to classpath path to android sources, so after that gradle build was successful, but realy I don't understand why it's always successful even when test fails

And still I don't understand how to get reports from test

This is my new build.gradle file

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

apply plugin: 'android'

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 18
        testPackageName "ua.cooperok.stringcalc.tests"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    sourceSets {
        main {
            manifest.srcFile file('AndroidManifest.xml')
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
    }
}

sourceSets {
    unitTest {
            java.srcDirs = ['tests/src']
            resources.srcDirs = ['tests/src']
    }
}

configurations {
    unitTestCompile.extendsFrom runtime
    unitTestRuntime.extendsFrom unitTestCompile
}

dependencies {
    unitTestCompile files("$project.buildDir/classes/release")
    unitTestCompile 'junit:junit:4.11'
    compile fileTree(dir: 'libs', include: '*.jar')
}

task unitTest(type:Test, dependsOn: assemble) {
    description = "run unit tests"
    testClassesDir = sourceSets.unitTest.output.classesDir
    classpath = files("$System.env.ANDROID_HOME/sources/android-18")
    //actualy I didn't  get any report
    getReports().getJunitXml().setOutputPerTestCase(true)
}

build.dependsOn unitTest

解决方案

I found solution. I was dissapointed by few topics, and thought that i need to create separate task for unit tests. In fact it was prety easy.
I didn't change my project structure, just build.gradle file. To build application i run
gradle clean connectedCheck build
connectedCheck runs unit tests from my test project and if some test fails - gradle build will fails too

Here final version of it

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

apply plugin: 'android'

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 18
        testPackageName "ua.cooperok.stringcalc.tests"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    sourceSets {
        main {
            manifest.srcFile file('AndroidManifest.xml')
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        instrumentTest {
            java.srcDirs = ['tests/src']
            manifest.srcFile file('tests/AndroidManifest.xml')
            resources.srcDirs = ['tests/src']
            res.srcDirs = ['tests/res']
            assets.srcDirs = ['tests/assets']
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
    }

    //Signing apk
    if(project.hasProperty("signingPropertiesPath")) {
        File propsFile = new File(System.getenv('HOME') +  "/" + project.property("signingPropertiesPath"))
        if(propsFile.exists()) {
            Properties props = new Properties()
            props.load(new FileInputStream(propsFile))

            //loading keystore properties
            signingConfigs {
                release {
                    storeFile file(propsFile.getParent() + "/" + props['keystore'])
                    storePassword props['keystore.password']
                    keyAlias props['keyAlias']
                    keyPassword props['keyPassword']
                }
            }
            buildTypes {
                release {
                    signingConfig signingConfigs.release
                }
            }
        }
    }
}

这篇关于Android,Gradle。如何构建应用程序并从测试应用程序运行测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆