功能测试+自动化测试代码覆盖率统计

  • Jacoco 是一个开源的覆盖率工具。Jacoco 可以嵌入到 Ant 、Maven 中,并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技术监控 Java 程序。很多第三方的工具提供了对 Jacoco 的集成,如 sonar、Jenkins、IDEA。

  • Jacoco 包含了多种尺度的覆盖率计数器,包含指令级(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、类(Classes)

这是对jacoco 的功能和使用的简介,我就不需要过多的描述。我的这篇文章就是一个对docker中服务的一个功能测试+自动测试覆盖率统计的demo:

我将从以下几点进行阐述:

  1. docker 底层文件开放变量
  2. 自助式jenkins JOB创建
  3. Pipeline 自助式覆盖率统计

一 docker 底层文件开放变量:

这里开放变量的作用是决定  自助式jenkins JOB  是否执行jacoco 覆盖率代码扫描。因为我们是通过jacocoAgent  这种方式来实现代码覆盖率扫描的。并不是所有的服务都需要

进行代码覆盖率扫描,所以我们做成了这种参数化,方便自助决定是否进行覆盖率扫描。

你可能会有疑问为什么不写死呢?答案是:我们的测试环境中的docker底层文件用的是同一套。

开放变量的参数是:-javaagent:/usr/local/jacoco-agent.jar=includes=*,output=tcpserver,append=true,address=0.0.0.0,port=*****

这里的这个参数传递是在 第二个环节自助式jenkins JOB 创建 中设置的一个输入标签

二 自助式jenkins JOB创建:

前期可爱的运维同事,帮助我们创建了一个通用的自助构建服务的模板:

       1、jobName  <必填>选项,命名格式:环境-服务名

  2、service_name <必填>服务名称,请对应gitlab上项目名称和生成的jar包名称

  3、app_repo <必填>项目仓库地址,必须以git@开头的ssh地址

  4、jvm_opts(开放变量) <可选填>自定义jvm参数,除默认配置jvm参数之外的自定义jvm参数,默认为空  这里由于我们需要运行jacoco-agent,所以输入:-javaagent:/usr/local/jacoco-        agent.jar=includes=*,output=tcpserver,append=false,address=0.0.0.0,port=****

点击build,会自动生成build后job的地址

点击链接,自跳转到job

 点击build with parameters

如上图所示  点击build with parameters后  1、2、3会自动填上之前的参数,这里我们只需要选着4、5  部署的分支和部署环境就完成了自助式jenkins JOB创建。下面你就可以进行功能测试和自动化测试了。

接下来的重点是如何拉取代码覆盖率报告:

这里需要注意的是,jacocoAgent 记录了代码执行的轨迹,如果想通过**.exec 获取html报告,我们需要有对应分支的.class 文件才可能实现。这里参照sonar扫描一样的方式获取

class文件。我们通过PipeLine的方式通过编译对应分支的代码获取class文件。

三  Pipeline 自助式覆盖率统计

这里的的工作主要是通过build   获取class文件,通过.exec文件生成覆盖率报告在jenkins上展示出来

那么是如何是实现的呢?

1、也需要运维像第一部一样创建一个公共job  作用仅仅是build操作,而不需要deploy

2、需要在git上创建一个PipeLine公共脚本  PipleLine 开放几个公共标签

     标签内容是:

  •        服务名称:service_name 
  •   务器地址:address
  •   编译后生成的classes文件相对路径:classPattern
  •     剔除无需统计具体的classes文件:exclusionPattern
  •     源码路径:sourcePattern
  •   仓库地址:app_repo

脚本如下:

  1. pipelineJob("$jobName") {

  2. parameters {

  3. stringParam("service_name", "${service_name}",'服务名称')

  4. stringParam('address', "${address}", '服务器地址')

  5. stringParam("classPattern", "${classPattern}", '编译后生成的classes文件相对路径')

  6. stringParam('exclusionPattern', "${exclusionPattern}", '剔除无需统计具体的classes文件,多个以英文逗号,隔开。')

  7. stringParam('sourcePattern', "${sourcePattern}", '源码路径。')

  8. stringParam('app_repo', "${app_repo}", '仓库地址')

  9. gitParameter {

  10. name('branch_name')

  11. branch('')

  12. type('PT_BRANCH')

  13. defaultValue('master')

  14. description('')

  15. branchFilter('origin/(.*)')

  16. quickFilterEnabled(true)

  17. tagFilter('*')

  18. sortMode('ASCENDING_SMART')

  19. selectedValue('TOP')

  20. useRepository("$app_repo")

  21. }

  22. }

  23. definition {

  24. cpsScm {

  25. scm {

  26. git {

  27. remote {

  28. url('git@gitlab.***.cn:***/jenkinspipeline.git')

  29. credentials('*********************')

  30. }

  31. branch('*/master')

  32. }

  33. }

  34. scriptPath("Jenkinsfile-Jacoco")

  35. }

  36. }

  37. }

jenkinspipeline  (git文件)

 
  1. pipeline {

  2. agent {node {label 'k8s-slave'}}

  3. environment {

  4. def JAVA_HOME="/usr/local/jdk"

  5. def M2_HOME="/usr/local/maven"

  6. def MAVEN_OPTS="-Xmx1024m"

  7. def PATH="/opt/kube/bin:/bin:/sbin/:/usr/bin:/usr/sbin/:/usr/local/bin:$PATH"

  8. def dingding_url="https://oapi.dingtalk.com/robot/send?access_token=**************************"

  9. def harbor_server="***************"

  10. def harbor_auth_id="**********************"

  11. def git_auth_id="*********************"

  12. def ansible_repo="git@gitlab.*********************.git"

  13. def app_repo="git@gitlab.*********************.git"

  14. }

  15. options {

  16. //默认是启用并发构建,disableConcurrentBuilds如果开启则为禁用并发构建

  17. // disableConcurrentBuilds()

  18. //保持构建的最大个数

  19. buildDiscarder(logRotator(numToKeepStr: '20'))

  20. ansiColor('xterm')

  21. timestamps()

  22. }

  23. parameters {

  24. choice(name: 'service_name', choices: '*********************')

  25. gitParameter(name: 'branch_name', branchFilter: 'origin/(.*)', defaultValue: 'master', type: 'PT_BRANCH', quickFilterEnabled: 'true', description: '选择需要构建的分支', sortMode: 'ASCENDING_SMART')

  26. }

  27. post{

  28. success{

  29. script {

  30. dingTalk accessToken: "${env.dingding_url}", imageUrl: '*********************', jenkinsUrl: "${env.BUILD_URL}",message: "应用${service_name}构建成功!",notifyPeople: '*********************'

  31. wrap([$class: 'BuildUser']) {

  32. mail to: "${BUILD_USER_EMAIL}",

  33. from: "*********************",

  34. subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【成功】",

  35. body: "本次构建由 ${BUILD_USER} 发起,构建【成功】,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"

  36. }

  37. }

  38. cleanWs()

  39. }

  40. failure{

  41. script {

  42. dingTalk accessToken: "${env.dingding_url}", imageUrl: '*********************', jenkinsUrl: "${env.BUILD_URL}",message:"应用${service_name}构建失败!",notifyPeople: '*********************'

  43. wrap([$class: 'BuildUser']) {

  44. mail to: "${BUILD_USER_EMAIL}",

  45. from: "*********************",

  46. subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【失败】",

  47. body: "本次构建由 ${BUILD_USER} 发起,构建【失败】 ,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"

  48. }

  49. }

  50. }

  51. unstable{

  52. script {

  53. wrap([$class: 'BuildUser']) {

  54. mail to: "${BUILD_USER_EMAIL}",

  55. from: "*********************",

  56. subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【失败】",

  57. body: "本次构建由 ${BUILD_USER} 发起,构建【失败】,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"

  58. }

  59. }

  60. }

  61. }

  62. stages {

  63. stage("获取代码") {

  64. parallel{

  65. stage('配置构建信息') {

  66. steps {

  67. script {

  68. wrap([$class: 'BuildUser']){

  69. currentBuild.description = "本次构建由<strong><span style='color:#E53333;'> ${BUILD_USER} </span></strong>发起,构建版本 <strong><span style='color:#E53333;'>${params.service_name}:${params.branch_name}</span></strong>"

  70. }

  71. }

  72. }

  73. }

  74. stage("获取应用代码") {

  75. steps {

  76. echo "branch_name: ${params.branch_name}"

  77. sh 'git config --global http.sslVerify false'

  78. wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'xterm']) {

  79. dir ( "${env.WORKSPACE}" ) {

  80. git (

  81. branch: "${params.branch_name}",

  82. credentialsId: "${env.git_auth_id}",

  83. url: "${app_repo}"

  84. )

  85. }

  86. }

  87. }

  88. }

  89. }

  90. }

  91. stage("jacoco覆盖率统计") {

  92. steps {

  93. dir("${env.WORKSPACE}") {

  94. sh "pwd"

  95. sh "mvn clean install -Dmaven.test.skip=true org.jacoco:jacoco-maven-plugin:0.8.2:dump -Djacoco.address=\"${params.address}\" -Djacoco.port=********************* -Djacoco.destFile=jacoco_payment.exec -Djacoco.reset=false"

  96. jacoco(execPattern:'jacoco_payment.exec',classPattern:"${params.classPattern}",sourcePattern:"${params.sourcePattern}",exclusionPattern:"${params.exclusionPattern}")

  97. }

  98. }

  99. }

  100. }

  101. }

上面的PipeLine 配置好了 下面 看看 页面

注:第一次只能选择master分支。后面可以选择对应的分支了

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

文中的源码我也都备好了,有需要的请回复【源码】免费领取。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

   视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值