软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试

测试覆盖率是对测试完成程度的度量 。它通常依据某种覆盖准则来对测试用例执行情况进行衡量 , 以判断测试执行得是否充分 。
——出自《计算机科学技术名词 》第三版
常见覆盖率统计工具
emma 与是为单元测试而设计的覆盖率统计, 与 emma 同属于一家公司,但是是为了更广泛的覆盖率统计而设计的工具 。
的文档中有个章节,里面对的定位描述的很好 。原文的大意是说其他的工具没有得到积极有效的维护,而且其他的工具都是为了单一任务而设计,他们不是为了 “集成” 而生 。从这一点上我们就可以看出的设计理念 。
得益于的设计理念,以及良好的 api 设计,它可以轻松的与已有的工具集成 , 甚至进行平台化 。它也可以同时用于单元测试与集成测试,所以是一款非常优秀的覆盖率统计工具 , 很多公司的精准化测试,就是重度依赖了。
覆盖率分析原理
要了解代码覆盖率的统计原理,我们就需要去深入了解 jvm 的机制 。这方面的知识是 java 领域的高端进阶知识,限于篇幅,我们只讲解下大概的原理,完整内容请参考 VM 虚拟机系列的书籍,以及早年发布的若干代码插桩的资料 。
简单说下原理,java 源代码会被 javac 编译为 class 文件,class 文件保存了 class 的基本信息与 jvm 的指令集 。java 的底层,也就是 jvm 在解析 class 的时候,会把文件格式的 class 读取到内存并运行 。也是借鉴了这一整套的设计理念 ,  上的其实是与 art 。
当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析 。通常是在读取类的时候,在关键的指令块的出口与入口增加标记 。当指令块被执行后,就会命中探针并完成记录 。
【软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试】要修改最底层的 jvm 字节码往往是比较麻烦的,需要精通 jvm 的各种指令以及 java class 结构 。这方面的处理目前已有有非常成熟的开源项目可以做大了,如下就是一些知名的字节码修改工具 。
其中 ASM 是所有字节码操作的底层基础,是最底层的字节码修改工具 。其他工具是它之上的一些高级封装 。借助于这些工具与 JVM 自身的一些调试特性,我们就可以对 jvm 代码或者进程进行便捷的操纵了 。
插桩方式
插桩方式有很多种,常见的方式如下
支持字节码插桩与这两种插桩方式 。也就是就算没有源代码也可以统计到覆盖率数据,但是最后分析的时候,还是要结合源代码才能获得更多的覆盖率细节数据 。毕竟覆盖率的统计,并不是只是简单的覆盖率数据本身的指标高低 。
的工作方式
支持四种工作模式
很多人都会使用 file 模式,但是 tcp模式才是最易用的 。因为不需要申请服务器的文件访问权限就可控制覆盖率数据 。你可以根据自己公司的部署情况选择合适的工作模式 。
on the fly 插桩模式
on the fly 插桩模式是使用最多的 。首先需要在你的被测 java 程序启动的时候,加入 jvm 的一些参数 。
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver、tcpclient、noneaddressport
你可以自己设置适合的工作模式 。
离线插桩模式c语言apache下载配置,适合的覆盖率统计,需要借助于 maven、 等构建工具的指令 。
on the fly 插桩模式

软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试

文章插图
软件测试丨只懂黑盒测试也能学会的代码覆盖率及精准化测试

文章插图
-cli 是的一个组件 , 可以在不依赖 maven、 构建工具的情况下完成对代码的分析 。主要用于工作模式下 。
用法如下
java -jar jacococli.jar dump [--address ] --destfile[--help] [--port ] [--quiet] [--reset] [--retry ]
项目演练
这是学院里的一个动手演练的小场景,统计工具的启动覆盖率
project_root=/Users/seveniruby/temp/java_2/jacoco/apache-jmeter-5.2.1jacoco_cli_jar=org.jacoco.cli-0.8.6-20200329.124045-45-nodeps.jarjava -javaagent:org.jacoco.agent-0.8.6-20200329.124039-45-runtime.jar-jar $project_root/bin/ApacheJMeter.jar#退出jmeter#生成覆盖率报告java -jar $jacoco_cli_jar report jacoco.exec --classfiles "$project_root/bin/ApacheJMeter.jar" --classfiles $project_root/lib/ext/ApacheJMeter_http.jar --html jmeter_coverage/#生成带有源代码的覆盖率报告 java -jar $jacoco_cli_jar reportjacoco.exec--classfiles "$project_root/bin/ApacheJMeter.jar"--classfiles $project_root/lib/ext/ApacheJMeter_http.jar--html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/#生成xml报告java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec--classfiles "$project_root/bin/ApacheJMeter.jar" --classfiles $project_root/lib/ext/ApacheJMeter_http.jar --xmljmeter_coverage_tcpserver2/jacoco.xml
完整代码请参考学员论坛中的课程帖中的源代码 。
导入覆盖率
可以分析的 exec 文件与 xml 文件c语言apache下载配置,并自动导入覆盖率 。exec 文件的分析后续会放弃支持,主支持 xml 文件的分析 。
sonar-scanner-Dsonar.host.url=http://sonarqube.testing-studio.com:9000-Dsonar.login=$SONARQUBE_TOKEN-Dsonar.projectKey=jmeter-Dsonar.projectVersion=1.0-Dsonar.coverage.jacoco.xmlReportPaths=$PWD/jmeter_coverage_tcpserver2/jacoco.xml-Dsonar.projectBaseDir=/Users/seveniruby/projects/jmeter/-Dsonar.java.binaries=/Users/seveniruby/projects/jmeter/
导入覆盖率
可以通过如下参数限定要分析代码的范围 , 通常是指明要覆盖的范围
导入覆盖率
可以智能分析新老版本之间的新增代码的覆盖率,这点非常不错,以前一些分析代码 diff 的工作就节省了 。他的代码分析也比较智能,简单的换行并不会干扰代码 diff 的分析范围 。
通过覆盖率数据
支持两种通用的测试数据导入
这样方便与各种框架进行集成,也方便测试工程师二次定制 。
通用测试数据模板 。
通用覆盖率数据模板
在的分析中,加入对应的配置参数即可导入通用测试数据 。
通用测试数据导入的常见用途
代码diff方法
代码的 diff 分析是一个比较大的话题,diff 只是对代码的最简单的一个分析策略,要想深入的理解代码,我们还需要更进一步的分析代码的调用链 。我们先看最简单的代码 diff 分析工具 。
代码 diff 分析工具
本文到此结束,希望对大家有所帮助 。