jacoco环境搭建和测试

2019-12-17  本文已影响0人  Judy警官

服务器上安装软件:

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

重置覆盖率报告:

 <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

上一篇 下一篇

猜你喜欢

热点阅读