美文网首页
jacoco环境搭建和测试

jacoco环境搭建和测试

作者: Judy警官 | 来源:发表于2019-12-17 15:13 被阅读0次

    服务器上安装软件:

    1.安装jdk1.8

    2.ant安装和配置

    下载ant:
    wget http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.4- bin.zip

    解压:
    unzip -n apache-ant-1.8.4-bin.zip -d /opt/apache-ant-1.8.4
    建立软连接:
    cd /usr/bin
    ln -s -f /opt/apache-ant-1.8.4/bin
    ln -s -f /opt/apache-ant-1.8.4/bin/ant
    检查:ant -version

    3.安装jacoco

    下载zip包:https://www.eclemma.org/jacoco/
    解压zip包到目录/opt/jacoco下

    4.准备代码和.class文件

    这里用的是开源项目halo,是一个java语言编写的博客系统
    github:https://github.com/halo-dev/halo
    环境构建这里不赘述了,参考以下文档,作者已经写的很清楚了:https://halo.run/develop/application/structure.html#%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95
    最终我们需要的是java源码和打包后的.class文件,如下:
    /root/.halo/ideaProject/halo_project/halo/src/main/java/
    /root/.halo/ideaProject/halo_project/halo/build/classes
    提醒:本地构建成功后,把源码和文件拷贝到服务器上的

    5.准备ant的build.xml文件所需参数:

    1.jacoco路径,例如/opt/jacoco/lib/jacocoant.jar
    2.jacoco的.exec文件的路径,例如/opt/jacoco/target/jacoco.exec
    3.jacoco生成的报告路径,例如/opt/jacoco/report
    4.服务器的IP(本机为127.0.0.1),服务器的tcp端口号,例如6300
    5.源码路径,例如:/root/.halo/ideaProject/halo_project/halo/src/main/java/
    6.字节码文件路径,例如:/root/.halo/ideaProject/halo_project/halo/build/classes

    该文件放到/opt/apache-ant-1.8.4/bin 下,文件内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="test" xmlns:jacoco="antlib:org.jacoco.ant" >
        <!--Jacoco的安装路径-->
        <property name="jacocoantPath" value="/opt/jacoco/lib/jacocoant.jar"/>
        <!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
        <property name="jacocoexecPath" value="/opt/jacoco/target/jacoco.exec"/>
        <!--生成覆盖率报告的路径-->
        <property name="reportfolderPath" value="/opt/jacoco/report"/>
        <!--远程tomcat服务的ip地址-->
        <property name="server_ip" value="127.0.0.1"/>
        <!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
        <property name="server_port" value="6300"/>
        <!--源代码路径可以包含多个源代码-->
        <property name="checkOrderSrcpath" value="/root/.halo/ideaProject/halo_project/halo/src/main/java/" />
        
        <!--.class文件路径可以包含多个-->
        <property name="checkOrderClasspath" value="/root/.halo/ideaProject/halo_project/halo/build/classes"/>
        
        
        <!--让ant知道去哪儿找Jacoco-->
        <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
            <classpath path="${jacocoantPath}" />
        </taskdef>
        
        <!--dump任务:
         根据前面配置的ip地址,和端口号,
         访问目标tomcat服务,并生成.exec文件。-->
        
        <target name="dump">
            <jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
        </target>
        
        <!--jacoco任务:
         根据前面配置的源代码路径和.class文件路径,
         根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
        <target name="report">
            <delete dir="${reportfolderPath}" />
            <mkdir dir="${reportfolderPath}" />
            
            <jacoco:report>
                <executiondata>
                    <file file="${jacocoexecPath}" />
                </executiondata>
                
                <structure name="JaCoCo Report">
                    <group name="Check Order related">
                        <classfiles>
                            <fileset dir="${checkOrderClasspath}" />
                        </classfiles>
                        <sourcefiles encoding="utf-8">
                            <fileset dir="${checkOrderSrcpath}" />
                        </sourcefiles>
                    </group>
                </structure>
                <html destdir="${reportfolderPath}" encoding="utf-8" />
            </jacoco:report>
        </target>
    </project>
    

    6.使用jacocoagent作为代理启动应用:

    java -javaagent:/opt/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1 -jar /root/.halo/halo-latest.jar

    命令解释:
    javaagent:javaagent是JDK 1.5以后引入的,也可以叫做Java代理.
    后面跟的参数是jcocoagent的jar包地址:/opt/jacoco/lib/jacocoagent.jar

    includes:包含在执行分析中的类名列表,*表示全部.

    output:表示使用tcpserver代理侦听由address和port属性指定的TCP端口,并将执行的数据写入此TCP连接,从而实现不停止项目运行实时生成代码覆盖率报告.

    port:开启的端口号,这里采用了6300端口进行监听(注意这里不是halo应用的端口)

    address: 开启的ip地址,本地写127.0.0.1.

    jar:运行服务的jar包地址.

    7.测试halo应用

    访问http://****.78.8.210:8080/admin/随机使用一些功能

    8.生成覆盖率报告

    在/opt/apache-ant-1.10.7/bin下执行"ant dump",会在/opt/jacoco/target下生成"jacoco.exec"
    在/opt/apache-ant-1.10.7/bin下执行"ant report",会在/opt/jacoco/report下生成html报告
    打包报告:tar -cf report.tar report
    下载报告到本地,查看html报告
    scp root@****.78.8.210:/opt/jacoco/report.tar /Users/******/Downloads/jacoco_report/

    image.png image.png image.png

    9.sonarqube安装和部署

    sonarqube server搭建:sonarqube7.9已经不支持mysql了,需要下载旧版本

    安装mysql:

    用户:root/123456;sonar/sonar
    用户授权:GRANT all privileges ON sonarqube.* TO sonar’@‘%' IDENTIFIED BY 'password';
    创建了数据库:sonarqube

    sonarqube server安装和配置

    下载sonarqube拷贝到/tmp/sonapackage下
    解压到/opt/sonaqube下
    unzip -n sonarqube-sonarqube-7.6.zip -d /opt/sonarqube
    最终目录:/opt/sonarqube/sonarqube-sonarqube-7.6

    sonar配置:
    sonar.web.host=0.0.0.0
    sonar.web.port=9000
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

    /opt/sonarqube/sonarqube-8.1.0.31237/bin/linux-x86-64
    启动:./sonar.sh start
    停止:./sonar.sh stop

    启动遇到坑:https://blog.csdn.net/zdyueguanyun/article/details/79447260

    sonar for ant插件

    下载sonar for ant到插件:
    https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Ant

    sonar.xml文件编写,放到/opt/apache-ant-1.10.7/bin下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="My Project" default="all" basedir="/root/.halo/ideaProject/halo_project/halo/" xmlns:sonar="antlib:org.sonar.ant">
        
        <!-- ========= Define the main properties of this project ========= -->
        <property name="src.dir" value="src" />
        <!-- <property name="test.dir" value="src" /> -->
    <!--    <property name="lib.junit.dir" value="lib" />-->
        <property name="build.dir" value="build" />
    <!--    <property name="target.dir" value="target" />-->
        <property name="classes.dir" value="${build.dir}/classes" />
    <!--    <property name="reports.dir" value="${build.dir}/reports" />-->
    <!--    <property name="reports.junit.xml.dir" value="${reports.dir}/junit" />-->
    
        <!-- Define the Sonar properties -->
        <property name="sonar.projectKey" value="jacoco_test" />
        <property name="sonar.projectName" value="jacoco test project" />
        <property name="sonar.projectVersion" value="1.0" />
        <property name="sonar.language" value="java" />
        <property name="sonar.sources" value="${src.dir}" />
        <!-- <property name="sonar.tests" value="${test.dir}" /> -->
        <property name="sonar.binaries" value="${classes.dir}" />
        <property name="sonar.java.binaries" value="${classes.dir}" />
        <property name="sonar.sourceEncoding" value="UTF-8" />
    <!--    <property name="sonar.surefire.reportsPath" value="${reports.junit.xml.dir}" />-->
    
        <!-- The following properties are required to use JaCoCo: -->
        <property name="sonar.dynamicAnalysis" value="reuseReports" />
        <property name="sonar.java.coveragePlugin" value="jacoco" />
        <property name="sonar.jacoco.reportPath" value="/opt/jacoco/target/jacoco.exec" />
        
        <!-- Add your basic Sonar configuration below: sonar.jdbc.url, sonar.jdbc.username, etc. properties -->
        <property name="sonar.jdbc.url" value="jdbc:h2:tcp://localhost:9092/sonar" />
        <property name="sonar.jdbc.username" value="admin" />
        <property name="sonar.jdbc.password" value="admin" />
        
        <!-- ========= Define Sonar target ========= -->
        <target name="sonar">
            <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
                <!-- Update the following line, or put the "sonar-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
                <classpath path="/opt/jacoco/lib/sonarqube-ant-task-2.6.0.1426.jar" />
            </taskdef>
            
            <!-- Execute Sonar -->
            <sonar:sonar />
        </target>
        
        <!-- ========= The main target "all" ========= -->
        <target name="all" depends="sonar" />
        
    </project>
    

    scp /Users/zhangyaqin/Downloads/sonar.xml root@117.78.8.210:/opt/apache-ant-1.10.7/bin

    执行命令(记得切回root用户):ant -find sonar.xml
    登录:http://117.78.8.210:9000
    用户名和密码:admin/admin

    image.png

    重置覆盖率报告:

    • 问题:想要把覆盖率报告初始化为零
    • 解决:重启应用+删除jacoco.exec文件
    • 原理:
      在build.xml文件中有一个配置:
     <target name="dump">
            <jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
    </target>
    

    其中reset="true" 并不是真正意义上的重置,因为ant dump命令在生成jacoco.exec文件时,是根据jvm中类加载的情况而生成的,而这个数据是没有清空的。执行ant dump和ant report,会发现覆盖率没有改变。当应用重启后jvm的类加载也会重新开始,这样就完成了第一步。第二步就是删除jacoco.exec文件。完成了以上两步再生成覆盖率,可以看到重置为0了。

    参考:
    https://testerhome.com/topics/19225
    https://testerhome.com/topics/5329
    https://testerhome.com/topics/20632
    https://testerhome.com/topics/8113

    相关文章

      网友评论

          本文标题:jacoco环境搭建和测试

          本文链接:https://www.haomeiwen.com/subject/papsnctx.html