问题描述
我是 Gradle 和 Android 测试的新手,但我已经将我的 Android 项目转换为使用 Gradle 进行构建.
I'm new to Gradle and Android testing but I've already converted my Android project to build with Gradle.
现在我正在尝试使用 Gradle 的 JaCoCo 插件对 Android 项目执行测试覆盖率.
Now I'm trying to perform test coverage of an Android project with Gradle's JaCoCo plugin.
我已将以下内容添加到我的 build.gradle 文件中:
I've added the following to my build.gradle file:
apply plugin: 'jacoco'
当我运行gradle jacocoTestReport"时出现以下错误:
And when I run "gradle jacocoTestReport" the following error:
Task 'jacocoTestReport' not found in root project '<project name>'.
从文档中我应该也应用插件java"但它与插件android"冲突.
From the documentation I'm supposed to also apply plugin 'java' but it conflicts with plugin 'android'.
有没有办法解决这个问题?
Is there a way around this?
提前致谢.
推荐答案
以下是我使用 Jacoco
的方式:
Here is how I'm using Jacoco
:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'robolectric'
apply plugin: 'jacoco'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "YOUR_PACKAGE_NAME"
minSdkVersion 10
targetSdkVersion 20
testHandleProfiling true
testFunctionalTest true
}
buildTypes {
debug {
testCoverageEnabled false
}
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
jacoco {
version "0.7.1.201405082137"
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/services/javax.annotation.processing.Processor'
exclude 'LICENSE.txt'
}
}
robolectric {
include '**/*Test.class'
exclude '**/espresso/**/*.class'
maxHeapSize "2048m"
}
jacoco {
toolVersion "0.7.1.201405082137"
}
// Define coverage source.
// If you have rs/aidl etc... add them here.
def coverageSourceDirs = [
'src/main/java',
]
task jacocoTestReport(type: JacocoReport, dependsOn: "connectedDebugAndroidTest") {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/debug',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/jacoco/testDebug.exec")
// Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.
// We iterate through the compiled .class tree and rename $$ to $.
doFirst {
new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
dependencies {
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
androidTestCompile('org.robolectric:robolectric:2.3') {
exclude module: 'classworlds'
exclude module: 'maven-artifact'
exclude module: 'maven-artifact-manager'
exclude module: 'maven-error-diagnostics'
exclude module: 'maven-model'
exclude module: 'maven-plugin-registry'
exclude module: 'maven-profile'
exclude module: 'maven-project'
exclude module: 'maven-settings'
exclude module: 'nekohtml'
exclude module: 'plexus-container-default'
exclude module: 'plexus-interpolation'
exclude module: 'plexus-utils'
exclude module: 'wagon-file'
exclude module: 'wagon-http-lightweight'
exclude module: 'wagon-http-shared'
exclude module: 'wagon-provider-api'
exclude group: 'com.android.support', module: 'support-v4'
}
}
上述代码还包含一个针对 https://code 的解决方法.google.com/p/android/issues/detail?id=69174.
The above code also contains a workaround for https://code.google.com/p/android/issues/detail?id=69174.
更多详情:http://chrisjenx.com/gradle-robolectric-jacoco-dagger/
这篇关于使用 JaCoCo Gradle 插件的 Android 测试代码覆盖率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!