[英]Android, Gradle. How to build application and run tests from test application
I have android project and android test project inside it, located under folder tests. 我在里面有android项目和android测试项目,位于文件夹测试下。 Structure of these project is eclipse like
这些项目的结构就像日食一样
+-src + -src
| | - res
- res
| | - libs
- libs
| | - tests
- 测试
|..... | .....
I use gradle. 我用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
我在根文件夹中创建了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
}
But when i run gradle build i got error 但是当我运行gradle build时,我得到了错误
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 此外,据我所知,要获得报告我需要应用插件“android-reporting”,但当我这样做时,我得到了错误
Cannot add extension with name 'android', as there is an extension already registered with that name. 无法添加名称为“android”的扩展名,因为已经注册了该名称的扩展名。
Should i do it like this, or i must create new gradle.build file in my test application project? 我应该这样做,还是我必须在我的测试应用程序项目中创建新的gradle.build文件?
UPDATE UPDATE
I fixed error with output, and made gradle build successful, but I don't understand what's goind on. 我修复了输出错误,并使gradle构建成功,但我不明白什么是goind。 I purposely failed my test, but gradle build is still successful.
我特意失败了我的测试,但是gradle构建仍然是成功的。
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' 1.我将任务unitTest从android部分移动到root,之后,我的测试项目开始编译,但是有一个错误'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 2.为了解决这个错误我添加到android源的类路径路径,所以在gradle构建成功之后,但是我真的不明白为什么即使测试失败也总是成功
And still I don't understand how to get reports from test 我仍然不明白如何从测试中获取报告
This is my new build.gradle file 这是我的新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
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. 我没有改变我的项目结构,只是build.gradle文件。 To build application i run
要构建应用程序我运行
gradle clean connectedCheck build gradle clean connectedCheck build
connectedCheck runs unit tests from my test project and if some test fails - gradle build will fails too connectedCheck从我的测试项目中运行单元测试,如果某些测试失败 - gradle build也会失败
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
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.