Jenkins构建Android项目持续集成之单元测试及代码覆盖率

本文主要是介绍Jenkins构建Android项目持续集成之单元测试及代码覆盖率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/it_talk/article/details/50267573

http://blog.csdn.net/it_talk/article/details/50267573

http://blog.csdn.net/it_talk/article/details/50267573

http://blog.csdn.net/it_talk/article/details/50267573



单元测试

  在软件开发中一直在推崇TDD(测试驱动开发),但是一直不能被有效的执行或者并不是真正的测试驱动开发(先开发后写单元测试),因为我们懒!而Android开发又是大多应用层面的开发,很多都是和视图层紧密相连的,业务逻辑和view相绑定,这导致编写单元测试有相当大的困难,因此就我项目而言,只针对工具类、服务端API编写单元测试。关于Android Studio如何编写单元测试并运行,可以看之前写的一篇文章Android Studio 单元测试

代码覆盖率

  编写好单元测试后,我们需要知道,测试用例是否覆盖了代码的所有分支情况,这样才能保证代码的可靠性、正确性。

编写测试用例

如果使用Android Studio创建项目的话,那么默认的会在androidTest包下生成一个ApplicationTest类,在这里面可以写测试用例。

测试用例

上图写的是一个SharedPreferences Util工具类的测试用例。 
如果你的测试用例不想写在这个包下,想自定义,也可以在项目的build.gradle写如下的配置

android {sourceSets {androidTest{java.srcDirs = ['src/com/helen/andbase/tests']}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Gradle配置jacoco

  Jacoco是一个开源的覆盖率工具。这里讲下gradle如何配置。 
  首先要在项目的build.gradle引入插件,语句如下:

 apply plugin: 'jacoco'
  • 1
  • 1

  然后注明使用的版本号

jacoco{version "0.7.4.201502262128"}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  接着,申明一个gradle task

task jacocoTestReport(type:JacocoReport,dependsOn:"connectedAndroidTest"){group = "Reporting"description = "Generate Jacoco coverage reports after running tests."reports{xml.enabled = falsehtml.enabled = truecsv.enabled = false}classDirectories = fileTree(dir : "$buildDir/intermediates/classes/debug",excludes : ['**/*Test.class','**/R.class','**/R$*.class','**/BuildConfig.*','**/Manifest*.*'])def coverageSourceDirs = ['src/main/java']additionalSourceDirs = files(coverageSourceDirs)sourceDirectories = files(coverageSourceDirs)additionalClassDirs = files(coverageSourceDirs)executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

  最后,打开testCoverageEnabled,需要注意的是,打开该属性的话,在断点调试的时候会导致方法参数值丢失(看不到),所以在调试的时候要记得把它关掉。

buildTypes {debug{testCoverageEnabled true}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

  完整的gradle配置如下

apply plugin: 'com.android.library'
//代码覆盖率插件
apply plugin: 'jacoco'android {compileSdkVersion 22buildToolsVersion '22.0.1'defaultConfig {minSdkVersion 8targetSdkVersion 22versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug{testCoverageEnabled true}}lintOptions {abortOnError false}packagingOptions {exclude 'META-INF/NOTICE'exclude 'META-INF/LICENSE'}jacoco{version "0.7.4.201502262128"}
}
//jacocoTestReport依赖于connectedAndroidTest task,所以在执行jacoco之前需要先执行connectedAndroidTest,也就是说需要连接测试机(模拟器or真机)
task jacocoTestReport(type:JacocoReport,dependsOn:"connectedAndroidTest"){group = "Reporting"description = "Generate Jacoco coverage reports after running tests."reports{xml.enabled = falsehtml.enabled = truecsv.enabled = false}classDirectories = fileTree(dir : "$buildDir/intermediates/classes/debug",excludes : ['**/*Test.class','**/R.class','**/R$*.class','**/BuildConfig.*','**/Manifest*.*'])def coverageSourceDirs = ['src/main/java']additionalSourceDirs = files(coverageSourceDirs)sourceDirectories = files(coverageSourceDirs)additionalClassDirs = files(coverageSourceDirs)executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:22.2.1'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

生成报告

配置完上面的步骤之后,打开Terminal,并输入命令gradlew jacocoTestReport,回车执行。

命令

之后打开下面的地址,先看下测试结果

测试结果地址 
测试结果

从上图,可以看到有些测试用例是没有跑通的,点击之后可以看详情信息

详情信息

根据提示信息,修改代码,直到测试用例跑通之后,如下图:

测试用例通过

然后打开下面的地址,如果测试用例没有全部跑通的话,就不会生成代码覆盖率报告。

代码覆盖率地址 
代码覆盖率报告

我们去查看下,之前跑的测试用例的覆盖率情况

覆盖率详情

再点击进去的话,可以看到具体有哪些分支路径是没有覆盖到的。

将报告通过邮箱发送给相关人员

  通过上面的步骤,我们已经可以看到了结果报告,但是,我们的主题是持续集成&自动化,所以,还没有全部完成,我们的主角依然是jenkins。所以,接下来要讲的是:通过jenkins项目配置,让程序自动生成报告,并将结果通过邮件发送给相关人员。

  构建后操作 
   
  先后会创建“Publish JUnit test result report”、”Record JaCoCo coverage report “、“Publish Android Lint results”。

配置单元测试报告

测试报告

这时候,报了个错误,说当前路径没有匹配到文件,没关系,因为我们还没有执行命令之前,一些文件夹还没有生成,所以可以先忽略。

配置代码覆盖率报告

代码覆盖率报告

主要的几个参数配置,“Path to class directories”配置的是编译后.class文件的路径地址,Android都是放在build路径下build\intermediates\classes;“Path to source directories”配置的是Java代码路径。

配置Android Lint报告

Android Lint是Android自带的一个功能,它可以检测一些不规范的写法,并提示。该功能gradle不用配置任何东西,只要执行build之后就会自动生成报告。

Android Lint报告

上图中不用填写入任何路径,默认的即可。

邮件配置及gradle执行命令的修改

首先,我们先修改下邮件的发送内容。

邮件内容修改

我们在上一节的基础上,只是新增加了以上3中报告的地址。 
接着,还需要修改gradle 执行的命令。

构建命令修改

项目的build.gradle修改下

build.gradle

去掉connectedAndroidTest的关联,因为我们已经独立使用命令执行connectedAndroidTest了,所以jenkins服务器在跑job的时候,请确保已经打开了Android模拟器,否则会出错。

查看邮件报告

配置完以上的步骤之后,将代码push到github上,等待jenkins触发构建或者我们手动执行构建都可以。 
邮件内容 
邮件里增加了配置里相应修改的内容。

注意:因为我的项目是一个lib项目,而在Android里lib项目生成的jar包是一个aar,所以这里的单元测试,我是写在lib项目里,然后构建产物,我也修改为获取aar包,修改如下: 
构建产物修改 
邮件附件

总结

跟着上面的步骤来,我们就已完成了单元测试及代码覆盖率报告的自动化发邮件了,能及时发现错误,这在很大程度上保证了我们的代码是经测试的,是有效可靠的。下一篇,将讲如何使用findbugs插件进行查虫,包括gradle的配置和jenkins的配置,发送findbugs报告到邮箱,更进一步的提高代码质量。

看下其他文章: 
1、Jenkins构建Android项目持续集成之简介篇 
2、Jenkins构建Android项目持续集成之Jenkins的安装篇 
3、Jenkins构建Android项目持续集成之系统配置篇 
4、Jenkins构建Android项目持续集成之创建项目 
5、Jenkins构建Android项目持续集成之单元测试及代码覆盖率 
6、Jenkins构建Android项目持续集成之findbugs的使用


这篇关于Jenkins构建Android项目持续集成之单元测试及代码覆盖率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075006

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能