Android, Gradle. Как создать приложение и запустить тесты из тестового приложения - программирование
Подтвердить что ты не робот

Android, Gradle. Как создать приложение и запустить тесты из тестового приложения

У меня есть проект проекта андроида и андроида, внутри которого находятся тесты папок. Структура этого проекта - eclipse, например

+ - ЦСИ
| - res
| - libs
| - тесты
|.....

Я использую gradle. Все, что я хочу, - это создание приложения, запуск модульных тестов и получение отчетов о них. Но я не понимаю, как это сделать правильно. Я создал файл build.gradle в корневой папке

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

}

Но когда я запустил gradle build, я получил ошибку
Не удалось найти свойство 'output' на исходном наборе unit test.

Кроме того, как я понимаю, для получения отчетов мне нужно применить плагин "android-reporting", но когда я это сделаю, я получил ошибку
Невозможно добавить расширение с именем "android", так как есть расширение, уже зарегистрированное с этим именем.

Должен ли я сделать это так, или я должен создать новый файл gradle.build в моем проекте тестового приложения?

UPDATE

Я исправил ошибку с выходом и сделал конструкцию gradle успешной, но я не понимаю, что происходит. Я намеренно провалил свой тест, но gradle build все еще успешно.
Что я сделал:
 1. Я переместил задачу unitTest из секции android в root, после чего мой тестовый проект начал компилироваться, но есть ошибка "packackage android.test not found"
 2. Чтобы исправить эту ошибку, я добавил к пути к траектории пути к источникам Android, поэтому после этого сборка gradle была успешной, но, действительно, я не понимаю, почему она всегда успешна, даже когда тест терпит неудачу.

И все же я не понимаю, как получать отчеты из теста

Это мой новый файл build.gradle

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
4b9b3361

Ответ 1

Я нашел решение. Я был разочарован несколькими темами и подумал, что мне нужно создать отдельную задачу для модульных тестов. На самом деле это было просто. Я не менял свою структуру проекта, просто build.gradle file. Чтобы создать приложение, выполните следующие действия: gradle чистая сборка connectCheck
connectedCheck запускает модульные тесты из моего тестового проекта, и если какой-то тест завершился неудачно - сборка gradle тоже не удастся

Здесь окончательная версия

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