android gradle + junit + jacoco 集成jenkins,sonar系统
首先gradle 文件配置如下:
apply plugin: 'jacoco'android {compileSdkVersion 25buildToolsVersion "25.0.3"defaultConfig {applicationId "com.javaandroidunittestdemo"minSdkVersion 23targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug{testCoverageEnabled true}} }dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:25.+'testCompile 'junit:junit:4.12' } jacoco{ toolVersion = "0.7.7.201606060606" } task jacocoTestReport(type: JacocoReport,dependsOn:"testDebugUnitTest") {def coverageSourceDirs = ["src"]group = "Reporting"description = "Generate Jacoco coverage reports after running tests."//ignoreFailures = truejacoco {reportsDir = file("../report/test-results/")}def utilTest = '/build/jacoco/testDebugUnitTest.exec'executionData = fileTree(utilTest)reports {xml{enabled true//Following value is a filedestination "${buildDir}/reports/jacoco/xml/jacoco.xml"}csv.enabled falsehtml{enabled true//Following value is a folderdestination "${buildDir}/reports/jacoco/html"}}classDirectories = fileTree(dir: "./build/intermediates/classes/debug",excludes: ['**/R.class','**/R$*.class','**/*$ViewInjector*.*','**/BuildConfig.*','**/Manifest*.*'])sourceDirectories = files(coverageSourceDirs)additionalSourceDirs = files(coverageSourceDirs)}注意:這個?
debug{testCoverageEnabled true}一定要打開,因為我們對debug進行單元測試。
在jenkins上我們配置gradle script:
然后配置sonar-scanner:
指明 jacoco.exec文件和 test-result文件路徑。
有的用戶直接在gradle 腳本里面添加build.
這樣就是直接執(zhí)行用戶的 gradle腳本。
但是用戶有時候在腳本里面配置了其他測試:
def coverageSourceDirs = ['../epa_new_android/src/main/java' ]task jacocoTestReport(type: JacocoReport, dependsOn: ["testDebugUnitTest", "connectedDebugAndroidTest"]) {doFirst {delete('../report/testUnitTest.exec')delete('../report/androidTestUnitTest.ec') // File file1 = new File('../report/test-results/jacocoTestReport'); // file1.deleteDir();delete('../report/test-results/')}jacoco {reportsDir = file("../report/test-results/")}group = "Reporting"description = "Generate Jacoco coverage reports"classDirectories = fileTree(dir: '/build/intermediates/classes/debug',excludes: ['**/R.class','**/R$*.class','**/*$ViewInjector*.*','**/BuildConfig.*','**/Manifest*.*'])def utilTest = '/build/jacoco/testDebugUnitTest.exec'def androidTestDir = '/build/outputs/code-coverage/connected/'def androidTestdef androidTestFileName;FileTree iotTree = fileTree(dir: androidTestDir, includes: ['*.ec'])iotTree.each {File file ->androidTestFileName = file.nameandroidTest = file.path}additionalSourceDirs = files(coverageSourceDirs)sourceDirectories = files(coverageSourceDirs)executionData = files(utilTest, androidTest)reports {xml.enabled = truehtml.enabled = true}doLast {copy {from utilTestinto '../report'rename("testDebugUnitTest.exec", 'testUnitTest.exec')}copy {from androidTestinto '../report'rename(androidTestFileName, 'androidTestUnitTest.ec')}copy {from "/build/test-results"into '../report/test-results/unittest'}}} connectedDebugAndroidTest是關(guān)于模擬機的測試,這樣在執(zhí)行build gradle 之前需要改造。但是 android 項目規(guī)則不能使用java 規(guī)則,要安裝 android Lint 插件,然后指定規(guī)則:
sonar.projectKey=SDKDemosonar.projectName=SDKDemosonar.projectVersion=1.0sonar.sources=app/src/main/javasonar.binaries=app/build/intermediates/classes/ sonar.language=javasonar.sourceEncoding=UTF-8sonar.profile=Android Lint其中,sonar.projectKey和sonar.projectName隨便填不與其他項目重復(fù)的就好,一般是項目名;sonar.sources指向Java代碼目錄;sonar.binaries指向build后產(chǎn)生classes目錄,一般AS和eclipse不同;sonar.profile為代碼檢查規(guī)則,就是我們需要安裝的 android lint.
android lint的下載:
在 sonarqube官網(wǎng),選擇sonar plugin ,選擇java :
First Analysis of a Java Project
For Maven projects, use the?SonarQube Scanner for Maven?by executing the following command from the root directory of the project:
| mvn sonar:sonar -Dsonar.host.url=[your SonarQube URL] |
For Gradle projects, declare the?org.sonarqube?plugin in your?build.gradle?file:
| plugins {????id?"org.sonarqube"?version?"2.5"} |
Then use the?SonarQube Scanner for Gradle?by executing the following command from the root directory of the project:
| ./gradlew?sonarqube -Dsonar.host.url=[your SonarQube URL] |
Follow the link provided at the end of the analysis to browse your project's quality in SonarQube UI.
?
Java bytecode is required
Analyzing a Java project without providing the Java bytecode produced by?javac?(Android users: Jack doesn't provide the required?.class?files) and all project dependencies (jar files) is possible, but will result in an increased number of false negatives, i.e. legitimate issues will be missed by the analyzer.
From SonarJava version 4.12 binary files are required for java projects with more than one java file. If not provided properly, analysis will fail with the message
Please provide compiled classes of your project with sonar.java.binaries propertySee?Java Plugin and Bytecode?for how to provide the Java bytecode if you are not using Maven to run your analysis.
?
Advanced Usage
With SonarJava, you can :
- deal with Unit Tests and Code Coverage :?Code Coverage by Unit Tests for Java Project tutorial
- provide the?Java Bytecode?for more accurate analysis
- handle correctly the java version used by source code within projects:?Handling Java Source Version
- analyse other java-related files:?Analyse maven pom.xml files
- use additional?java-specific plugins like?Cobertura?or?Android Lint
- create your own?Custom Rules
總結(jié)
以上是生活随笔為你收集整理的android gradle + junit + jacoco 集成jenkins,sonar系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 诗情画意的网名510个
- 下一篇: 问道生辰礼包哪里领(问道官方网站)