精准测试存在的问题
- 基于手工测试的精准测试建立映射关系繁杂,如果需求改变频繁,用例维护以及之间的关系维护需要耗费大量时间精力。
- 精准测试需要一定的自动化测试的覆盖,这样做起来更有意义,例如api自动化测试,如果本身用例过少,与代码之间关联关系不多时,变更代码后可能不会得出什么结果。
- 最好有对应的用例管理系统,能够方便的帮助我们建立与代码之间的关系。
- 需要投入开发能力强的QA或者测试开发建立整套系统环境,但长远考虑,将精准测试嵌入整个公司的质量平台中,不管对于新项目还说维护项目来说都是一种提升。
- 项目生命周期需要较长,短期项目花费巨大精力开发和维护整套精准测试系统得不偿失。短期项目可以利用精准测试以api测试覆盖率作为衡量标准。不去建立繁杂的关系,只监控UI API测试覆盖率迭代时的变更来达到目的。
jacoco下载地址:
EclEmma - JaCoCo Java Code Coverage Library
(步骤:1、在待部署服务器机器上放置jaococoagent相关jar包(也可以把整个jacoco.zip包上传,agent在lib目录下),
2、使用最新版本代码,通过分支tag部署,通过javagent机制,启动服务
3、测试。。。。
4.1、通过jenkins 拉取和步骤2相同版本的代码,并构建出class文件
4.2 在被测试服务器上生成jacoco,ex, 然后获取被测试服务器上的jacoco,ex文件传到jenkins的工作空间
4.3、通过命令行生成html报告(将html等静态文件放到Nginx 上)[在生成覆盖率数据时java对应的类如果有变更,则有变更的类覆盖率信息会生成失败的到0覆盖率,其它未变更的类无影响]
)
背景目标:
目前策略中心确少对整个迭代测试完成后对整个测试覆盖情况的评估方式,因此需要引入相应的统计方式对测试覆盖率的进行统计,通过覆盖率统计情况,实现对整个测试过程中测试用例覆盖情况的一个质量评估,主要作用
1、提升测试用例覆盖率
2、发现夹带的冗余代码
3、减少漏测的情况发生
集成测试覆盖率采集原理
采集覆盖率的前提是对被测试类文件进行插桩处理,这样在运行过程中可以根据标记统计某行是否执行到。jacoco可以是编译时插桩、也可以是运行时插桩,这就是所谓 Offline 模式和 On-the-fly 模式,本方案选择了 on-the-fly 模式,随后启动java进程的同时jacoco-agent以server方式运行,暴露出指定端口,通过此端口可以获取覆盖率信息。
以下情况不适合使用on-the-fly模式:
(1)不支持javaagent
(2)无法设置JVM参数
(3)字节码需要被转换成其他虚拟机
(4)动态修改字节码过程和其他agent冲突
(5)无法自定义用户加载类
JaCoCo需要Java 1.5。
疑问:
测试覆盖率解析和生产报告的处理过程是否要单独申请机器进行。
启动命令:
1、gauss-console:
目前实际的gauss-console的启动命令
exec /usr/local/alibaba/java/bin/java -javaagent:/home/admin/skywalking/agent/skywalking-agent.jar -Dskywalking_config=/home/admin/skywalking/skywalking.config ${SERVICE_OPTS} -jar ${APP_HOME}/target/${JAR_NAME} >> ${SERVICE_OUT} 2>&1 &
修改后的命令:(适用范围只适用于测试环境)
2、mock-strategy-center:
原启动命令:
nohup java -jar mockStrategyCenter-0.0.1-SNAPSHOT.jar >temp.txt 2>&1 &
修改后的启动命令
nohup java -javaagent:/home/admin/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar mockStrategyCenter-0.0.1-SNAPSHOT.jar 2>&1 &
关键参数说明:
- -javaagent:/home/admin/jacoco/lib/jacocoagent.jar=includes=*,这个参数就是启用jacoco代理参数,其中/home/admin/jacoco/lib/jacocoagent.jar就是之前下载jacoco解压后的jacocoagent.jar的绝对路径,includes表示对要插桩的包进行过滤,*代表所有的class都要进行插桩,也可以根据情况进行过滤,如includes=com.mycompany.*
- output=tcpserver,这里不需要改动,表示以TCP Server方式启动应用并插桩
- port=6300,Jacoco开启的TCP Server的端口,不能被占用
- address=localhost,对外开放的地址,也可以指定IP地址
- demo-0.0.1-SNAPSHOT.jar,就是示例代码构建后target目录生成的jar包,需要根据实际情况更新
下载覆盖率数据:
dump生成覆盖率文件
在被测试服务器上(11.122.78.249) 保持服务启动,再打开一个cmd窗口同样cd到target目录(也可以是其它任意目录 如 应用名+分支号 组成的文件夹 ),执行如下命令从上一步开启的TCP Server中dump出覆盖率文件
java -jar /home/admin/jacoco/lib/jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco_tcp_01.exec
参数说明:
- --destfile ./jacoco_tcp.exec,其中./jacoco_tcp.exec为生成exec文件名,表示在当前目录生成
- 其他参数和上一步类似,不再特别说明,注意需要更新jacococli.jar的绝对路径
执行成功后,会在target目录生成相应的.exec文件
分析exec文件生成html报告
dump命令生成的.exec文件为二进制文件,需要进行解析,以生成html报告为例,执行如下的命令分别将.exec文件解析成html报告
进入到存放jacoco_tcp_01.exec文件的地址目录下,执行
java -jar /Users/jackypc/日常工作文档/jacoco/jacoco-0.8.7/lib/jacococli.jar report ./jacoco_tcp_01.exec --classfiles /Users/jackypc/workSpace/mock-strategy-center/target/classes --sourcefiles /Users/jackypc/workSpace/mock-strategy-center/src/main/java --html report01
(重复生成exec文件,若有增量覆盖率则会累加,若相同应用的两个不通版本之间,重复生产exec则有变更的类java文件,会解析不出覆盖率信息。)
参数说明:
- ./jacoco_tcp_01.exec,表示要解析的exec文件的相对路径
- --classfiles .\classes,需要指定生成的classes文件目录,参见下图
- --sourcefiles ..\src\main\java,需要指定源码的文件目录,参见下图
jenkins上的解析路径
java -jar /home/admin/jacoco-0.8.7/lib/jacococli.jar report ./jacoco_tcp_01.exec --classfiles /mnt/jenkins/workspace/获取集成测试覆盖率/target/classes --sourcefiles /mnt/jenkins/workspace/获取集成测试覆盖率/src/main/java --html report01
解析覆盖率的查考文档:
统计范围:
测试环境下策略中心所属的Java应用:gauss-counsel、counsel-audit-center等
统计指标:
行覆盖率、分支覆盖率等
报告形式:
以html形式展示类似:
后续计划:
完成前端测试覆盖率统计
调研工具:1、Istanbul 2、JSCoverage