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

news2024/9/24 23:31:51

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:

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

docker 底层文件开放变量
自助式jenkins JOB创建
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
脚本如下:

pipelineJob("$jobName") {
  parameters {
    stringParam("service_name", "${service_name}",'服务名称')
    stringParam('address', "${address}", '服务器地址')
      stringParam("classPattern", "${classPattern}", '编译后生成的classes文件相对路径')
    stringParam('exclusionPattern', "${exclusionPattern}", '剔除无需统计具体的classes文件,多个以英文逗号,隔开。')
    stringParam('sourcePattern', "${sourcePattern}", '源码路径。')
    stringParam('app_repo', "${app_repo}", '仓库地址')
 
    
    gitParameter {
      name('branch_name')
      branch('')
      type('PT_BRANCH')
      defaultValue('master')
      description('')
      branchFilter('origin/(.*)')
      quickFilterEnabled(true)
        tagFilter('*')
      sortMode('ASCENDING_SMART')
      selectedValue('TOP')
      useRepository("$app_repo")
    }
 
 
 
 
    }
 
  definition {
    cpsScm {
    scm {
        git {
          remote {
            url('git@gitlab.***.cn:***/jenkinspipeline.git')
            credentials('*********************')
          }
          branch('*/master')
        }
      }
      scriptPath("Jenkinsfile-Jacoco")
    }
  }
}

jenkinspipeline  (git文件)

pipeline {
  agent {node {label 'k8s-slave'}}
 
  environment {
    def JAVA_HOME="/usr/local/jdk"
    def M2_HOME="/usr/local/maven"
    def MAVEN_OPTS="-Xmx1024m"
 
    def PATH="/opt/kube/bin:/bin:/sbin/:/usr/bin:/usr/sbin/:/usr/local/bin:$PATH"
 
    def dingding_url="https://oapi.dingtalk.com/robot/send?access_token=**************************"
 
    def harbor_server="***************"
 
    def harbor_auth_id="**********************"
 
    def git_auth_id="*********************"
 
    def ansible_repo="git@gitlab.*********************.git"
 
    def app_repo="git@gitlab.*********************.git"
    
  }
 
  options {
//默认是启用并发构建,disableConcurrentBuilds如果开启则为禁用并发构建
//    disableConcurrentBuilds()
    //保持构建的最大个数
    buildDiscarder(logRotator(numToKeepStr: '20'))
    ansiColor('xterm')
    timestamps()
  }
  
  parameters {
    choice(name: 'service_name', choices: '*********************')
    gitParameter(name: 'branch_name', branchFilter: 'origin/(.*)', defaultValue: 'master', type: 'PT_BRANCH', quickFilterEnabled: 'true', description: '选择需要构建的分支', sortMode: 'ASCENDING_SMART')
  }
 
    post{
    success{
        script {
 
            dingTalk accessToken: "${env.dingding_url}", imageUrl: '*********************', jenkinsUrl: "${env.BUILD_URL}",message: "应用${service_name}构建成功!",notifyPeople: '*********************'
 
            wrap([$class: 'BuildUser']) {
                mail to: "${BUILD_USER_EMAIL}",
                from: "*********************",
                subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【成功】",
                body: "本次构建由 ${BUILD_USER} 发起,构建【成功】,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"
            }
 
        }
 
      cleanWs()
 
    }
    failure{
        script {
 
            dingTalk accessToken: "${env.dingding_url}", imageUrl: '*********************', jenkinsUrl: "${env.BUILD_URL}",message:"应用${service_name}构建失败!",notifyPeople: '*********************'
 
            wrap([$class: 'BuildUser']) {
                mail to: "${BUILD_USER_EMAIL}",
                from: "*********************",
                subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【失败】",
                body: "本次构建由 ${BUILD_USER} 发起,构建【失败】 ,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"
            }
        }
    }
    unstable{
        script { 
            wrap([$class: 'BuildUser']) {
                mail to: "${BUILD_USER_EMAIL}",
                from: "*********************",
                subject: "'${JOB_NAME}' 第${BUILD_NUMBER}次,构建结果通知【失败】",
                body: "本次构建由 ${BUILD_USER} 发起,构建【失败】,构建版本 ${params.service_name}:${params.branch_name} .\n具体构建细节,可以前往${env.BUILD_URL}进行查看。"
            }
        }
    }
  }
 
 
  stages {
    stage("获取代码") {
      parallel{
        stage('配置构建信息') {
          steps {
            script {
              wrap([$class: 'BuildUser']){
                currentBuild.description = "本次构建由<strong><span style='color:#E53333;'> ${BUILD_USER} </span></strong>发起,构建版本 <strong><span style='color:#E53333;'>${params.service_name}:${params.branch_name}</span></strong>"
              }
            }
          }
        }
 
 
        stage("获取应用代码") {
          steps {
            echo "branch_name: ${params.branch_name}"
            sh 'git config --global http.sslVerify false'
            
            wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'xterm']) {
              dir ( "${env.WORKSPACE}" ) {
                git (
                  branch: "${params.branch_name}",
                  credentialsId: "${env.git_auth_id}",
                  url: "${app_repo}"
                )
              }
            }
          }
        }
        
      }
    }
 
    stage("jacoco覆盖率统计") {
      steps {
        dir("${env.WORKSPACE}") {
            sh "pwd"
            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"
            jacoco(execPattern:'jacoco_payment.exec',classPattern:"${params.classPattern}",sourcePattern:"${params.sourcePattern}",exclusionPattern:"${params.exclusionPattern}")
                                   
        }  
      }
    }
  }
}

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

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

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

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

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复数计算器(C/C++)

源码地址&#xff1a;复数计算器复数计算器复数计算器资源-CSDN文库

5.多线程之JUC并发编程2

1.CompletableFuture异步回调 像ajax,未来再得到执行结果,想服务器不分先后顺序执行,可以用异步回调 //调用的函数没有返回值的CompletableFuture<Void> futureCompletableFuture.runAsync(()->{TimeUnit.SECONDS.sleep(2);sout(Thread.currentThread.getName"as…

内网安全:内网穿透详解

目录 内网穿透技术 内网穿透原理 实验环境 内网穿透项目 内网穿透&#xff1a;Ngrok 配置服务端 客户端配置 客户端生成后门&#xff0c;等待目标上线 内网穿透&#xff1a;Frp 客户端服务端建立连接 MSF生成后门&#xff0c;等待上线 内网穿透&#xff1a;Nps 服…

更新的NICE工具现在可以直接下载

大家好&#xff0c;才是真的好。 很多人还不知道什么是Nots中的NICE工具&#xff0c;它的全称是Notes Install Cleanup Executable&#xff0c;我主要使用该款工具在Windows上来卸载Notes标准客户机&#xff08;包括Domino Designer和Domino Admin&#xff09;。 补充一下&am…

优化3500倍,从70s到20ms的顶级调优,此方案人人可用

前言&#xff1a; 在40岁老架构师尼恩的读者社区&#xff08;50&#xff09;中&#xff0c;很多小伙伴拿不到offer&#xff0c;或者拿不到好的offer。 尼恩经常给大家 优化项目&#xff0c;优化简历&#xff0c;挖掘技术亮点。在指导简历的过程中&#xff0c; Java 调优是一项…

一文读懂数字孪生水利解决方案

如今&#xff0c;数字孪生作为一种创新的技术手段&#xff0c;正在被广泛应用于各个领域。在工业互联网、5G、边缘计算、AR等技术发展背景下&#xff0c;数字孪生技术与流域的融合正风生水起&#xff0c;数字流域建设备受瞩目&#xff0c;智慧水利依托物联网、大数据、人工智能…

怎么在eclipse中创建python项目

目录 方法一&#xff1a;借助Eclipse Marketplace安装PyDev插件 方法二&#xff1a;到官网下载手动安装插件 参考文件 方法一&#xff1a;借助Eclipse Marketplace安装PyDev插件 这可以通过Eclipse Marketplace完成。打开Eclipse&#xff0c;然后选择“Help” > “Eclips…

金鸣识别的表格分析技术揭秘

表格分析是指将图片中的表格区域分割出来&#xff0c;并识别出表格中的单元格和单元格中的内容。表格分析技术主要包括以下几个步骤&#xff1a; 1. 表格检测&#xff1a;通过图像处理技术&#xff0c;将图片中的表格区域分割出来。 2. 单元格分割&#xff1a;将表格中的每个单…

iphone尺寸大全

iPhone各机型的navbar和title的高度&#xff0c;宽高和在微信开发工具中的高度如下&#xff1a; 需要注意的是&#xff0c;pt是苹果设计稿中使用的单位&#xff0c;与px的换算关系为1pt等于2px。而在微信开发工具中&#xff0c;默认使用的是rpx&#xff0c;1rpx等于0.5px。因此…

Datax+DataX-Web分布式搭建

DataxDataX-Web分布式搭建 DataX简介 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX本身作为数据同步框架&#xff0c;将不同数据源的同步…

餐企复苏破局!高效智能营销+服务如何打造?

随着数字化时代的飞速发展&#xff0c;越来越多的行业对企业运营服务模式的需求已逐渐趋向于“智能化”发展。特别是“后疫情时代”及O2O模式下的餐饮变革&#xff0c;餐饮行业的竞争已从餐食本身&#xff0c;发展为流量、服务、品牌效应的竞争&#xff0c;很多企业为了进一步促…

MySQL 8.0.29 instant DDL 数据腐化问题分析

前言Instant add or drop column的主线逻辑表定义的列顺序与row 存储列顺序阐述引入row版本的必要性数据腐化问题原因分析Bug重现与解析MySQL8.0.30修复方案 前言 DDL 相对于数据库的 DML 之类的其他操作&#xff0c;相对来说是比较耗时、相对重型的操作; 因此对业务的影比较严…

ASO优化之关于应用宝的关键词排名

应用宝是国内主要的安卓应用分发渠道之一&#xff0c;它的流量和影响力是非常大的。所以我们可以通过ASO优化&#xff0c;来提升应用宝关键词覆盖和排名&#xff0c;从而有利于应用可以获得稳定的自然下载量。 关键词覆盖要围绕元数据的优化&#xff08;包括应用名称&#xff…

ai智能写诗你了解吗?

在当今科技快速发展的时代&#xff0c;越来越多的人开始注重人工智能在日常生活中的应用。其中之一就是智能写诗软件&#xff0c;这种技术不仅可以为我们提供便捷的创作体验&#xff0c;还可以让我们轻松地享受到优美的诗歌韵律。那么&#xff0c;智能写诗软件怎么用呢&#xf…

服务端测试深度解析:如何保障后端稳定性

一、引言 在日益数字化的时代&#xff0c;软件稳定性和高可用性的保证对企业来说至关重要。在众多环节中&#xff0c;服务端作为整个系统的心脏&#xff0c;它的稳定性对用户体验和企业声誉影响尤为深远。因此&#xff0c;进行全面彻底的服务端测试具有重要意义。本文将深入讨…

真和思科有关?官方严令广东电信彻查网络故障!

下午好&#xff0c;我的网工朋友。 广东电信那事儿&#xff0c;大家都听说了吧&#xff0c;这闹的&#xff0c;行业内无人不晓了吧。 昨天晚上有聚餐&#xff0c;没来得及跟你们唠上这事儿&#xff0c;这会儿下班前&#xff0c;唠唠&#xff1f; 虽然昨晚已经恢复正常&#x…

工作4/5年,中高级测试工程师的我需要掌握什么?该往哪个方向发展?

毕业到公司4/5年&#xff0c;一般做软件测试至少是中级测试工程师了&#xff0c;好一些到高级测试工程师了。 我觉得对于中高级测试工程师的要求有几点 首先&#xff1a;你得有比较强的产品思维能力&#xff0c;你要知道产品的逻辑是什么&#xff0c;你要能站在用户的角度去思…

ArkTS语言HarmonyOS/OpenHarmony应用开发-message事件刷新卡片内容

开发过程 在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility&#xff0c;然后由FormExtensionAbility刷新卡片内容。 common&#xff1a;公共文件 通过点击button按钮&#xff0c;刷新卡片内容。代码示例&#xff1a; WidgetCard.ets let stor…

网页端兼容ie浏览器,强制用户以最高版本的ie进行页面渲染

1.针对浏览器&#xff0c;兼容不同ie版本写法 //IE9以及低于IE9版本 : <!--[if IE]><link rel"stylesheet" type"text/css" href"index.css" /> <![endif]-->//IE10或IE11: media all and (-ms-high-contrast: none), (-ms-h…

【JavaScript】实战训练小项目-WebAPI

JavaScript实战训练小项目 文章目录 JavaScript实战训练小项目 & WebAPI1. JS操作DOM树1.1 获得HTML控件/元素标签1.2 操纵控件1.2.1 获取属性值1.2.1 修改属性值 1.3 实现一个猜数字的功能 2. JQuery3. 简单计算器4. 聚合搜索5. 表白墙 JavaScript实战训练小项目 & We…